Skip to content

Commit

Permalink
ProcessLifecycleObserver
Browse files Browse the repository at this point in the history
ActivityLifecycleObserver
RxBilling
  • Loading branch information
gsanmartin committed May 12, 2023
1 parent 34aaf9d commit c1ba058
Show file tree
Hide file tree
Showing 33 changed files with 243 additions and 52 deletions.
2 changes: 2 additions & 0 deletions app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,8 @@ dependencies {
implementation project(':listApi')
implementation project(':list')
implementation project(':create')
implementation project(':iarApi')
implementation project(':iar')
implementation project(':iapApi')
implementation project(':iap')

Expand Down
2 changes: 1 addition & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
tools:ignore="GoogleAppIndexingWarning">

<activity
android:name=".ui.activity.MainActivityCompose"
android:name=".ui.activity.MainActivity"
android:windowSoftInputMode="adjustResize"
android:exported="true">
<intent-filter>
Expand Down
23 changes: 12 additions & 11 deletions app/src/main/java/net/kelmer/correostracker/CorreosApp.kt
Original file line number Diff line number Diff line change
@@ -1,18 +1,10 @@
package net.kelmer.correostracker

import android.app.Application
import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Context
import android.os.Build
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.ProcessLifecycleOwner
import androidx.work.Configuration
import androidx.work.WorkManager
import com.google.firebase.crashlytics.FirebaseCrashlytics
import dagger.hilt.android.HiltAndroidApp
import net.kelmer.correostracker.di.debug.LumberYard
import net.kelmer.correostracker.di.worker.MyWorkerFactory
import net.kelmer.correostracker.initializer.Initializer
import net.kelmer.correostracker.service.worker.ParcelPollWorker
import timber.log.Timber
import javax.inject.Inject

Expand All @@ -23,13 +15,22 @@ import javax.inject.Inject
class CorreosApp : Application(), Configuration.Provider {

@Inject
lateinit var initializers: Set<@JvmSuppressWildcards Initializer>
lateinit var initializers: Set<@JvmSuppressWildcards AppInitializer>

@Inject
@ProcessLifecycleObserver
lateinit var lifecycleObservers: Set<@JvmSuppressWildcards LifecycleObserver>

override fun onCreate() {
super.onCreate()
initializers.forEach {
it.initialize(this)
}
lifecycleObservers.forEach {
Timber.i("Adding lifecycleobserver: $it")
ProcessLifecycleOwner.get().lifecycle.addObserver(it)
}

}

private fun createNotificationChannel() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,18 @@ package net.kelmer.correostracker.di.application
import android.content.Context
import android.content.SharedPreferences
import android.net.ConnectivityManager
import androidx.lifecycle.LifecycleObserver
import androidx.viewbinding.BuildConfig
import dagger.Binds
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import dagger.multibindings.Multibinds
import net.kelmer.correostracker.ActivityLifecycleObserver
import net.kelmer.correostracker.BuildInfo
import net.kelmer.correostracker.ProcessLifecycleObserver
import net.kelmer.correostracker.di.BuildInfoImpl
import net.kelmer.correostracker.util.AppSchedulerProvider
import net.kelmer.correostracker.util.NetworkInteractor
Expand All @@ -25,6 +29,10 @@ import javax.inject.Singleton
@InstallIn(SingletonComponent::class)
abstract class ApplicationModule {

@Multibinds
@ProcessLifecycleObserver
abstract fun processLifecycleObservers(): Set<@JvmSuppressWildcards LifecycleObserver>

@Binds
abstract fun bindsBuildInfo(info: BuildInfoImpl): BuildInfo

Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,11 @@
package net.kelmer.correostracker.initializer

import android.app.Application
import com.google.android.gms.ads.MobileAds
import com.google.android.gms.ads.initialization.OnInitializationCompleteListener
import net.kelmer.correostracker.AppInitializer
import javax.inject.Inject


class AdsInitializer @Inject constructor() : Initializer {
class AdsInitializer @Inject constructor() : AppInitializer {
override fun initialize(application: Application) {

}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ package net.kelmer.correostracker.initializer
import android.app.Application
import com.google.firebase.crashlytics.FirebaseCrashlytics
import net.kelmer.correostracker.BuildConfig
import net.kelmer.correostracker.AppInitializer
import javax.inject.Inject

class CrashlyticsInitializer @Inject constructor(): Initializer {
class CrashlyticsInitializer @Inject constructor(): AppInitializer {
override fun initialize(application: Application) {
FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(!BuildConfig.DEBUG)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,32 +1,40 @@
package net.kelmer.correostracker.initializer;

import androidx.lifecycle.LifecycleObserver;

import net.kelmer.correostracker.AppInitializer;

import java.util.Set;

import dagger.Binds;
import dagger.Module;
import dagger.hilt.InstallIn;
import dagger.hilt.components.SingletonComponent;
import dagger.multibindings.IntoSet;
import dagger.multibindings.Multibinds;

@Module
@InstallIn(SingletonComponent.class)
abstract class Initializer_AppModule {


@Binds
@IntoSet
abstract Initializer bindsNotificationInitializer(NotificationInitializer impl);
abstract AppInitializer bindsNotificationInitializer(NotificationInitializer impl);

@Binds
@IntoSet
abstract Initializer bindsTimberInitializer(TimberInitializer impl);
abstract AppInitializer bindsTimberInitializer(TimberInitializer impl);

@Binds
@IntoSet
abstract Initializer bindsCrashlyticsInitializer(CrashlyticsInitializer impl);
abstract AppInitializer bindsCrashlyticsInitializer(CrashlyticsInitializer impl);

@Binds
@IntoSet
abstract Initializer bindsWorkerInitializer(WorkerFactoryInitializer impl);
abstract AppInitializer bindsWorkerInitializer(WorkerFactoryInitializer impl);

@Binds
@IntoSet
abstract Initializer bindsAdsInitializer(AdsInitializer impl);
abstract AppInitializer bindsAdsInitializer(AdsInitializer impl);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,12 @@ import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Context
import android.os.Build
import net.kelmer.correostracker.AppInitializer
import net.kelmer.correostracker.R
import net.kelmer.correostracker.service.worker.ParcelPollWorker
import javax.inject.Inject

class NotificationInitializer @Inject constructor() : Initializer {
class NotificationInitializer @Inject constructor() : AppInitializer {
override fun initialize(application: Application) {
// Create the NotificationChannel, but only on API 26+ because
// the NotificationChannel class is new and not in the support library
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@ package net.kelmer.correostracker.initializer

import android.app.Application
import net.kelmer.correostracker.BuildConfig
import net.kelmer.correostracker.AppInitializer
import net.kelmer.correostracker.di.debug.LumberYard
import timber.log.Timber
import javax.inject.Inject

class TimberInitializer @Inject constructor(
private val lumberYard: LumberYard
) : Initializer {
) : AppInitializer {
override fun initialize(application: Application) {
if (BuildConfig.DEBUG) {
Timber.plant(Timber.DebugTree())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,11 @@ package net.kelmer.correostracker.initializer
import android.app.Application
import androidx.work.Configuration
import androidx.work.WorkManager
import net.kelmer.correostracker.AppInitializer
import net.kelmer.correostracker.di.worker.MyWorkerFactory
import javax.inject.Inject

class WorkerFactoryInitializer @Inject constructor(private val myWorkerFactory: MyWorkerFactory) : Initializer {
class WorkerFactoryInitializer @Inject constructor(private val myWorkerFactory: MyWorkerFactory) : AppInitializer {
override fun initialize(application: Application) {
WorkManager.initialize(
application,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import net.kelmer.correostracker.dataApi.model.remote.CorreosApiParcel
import net.kelmer.correostracker.dataApi.repository.correos.CorreosRepository
import net.kelmer.correostracker.dataApi.repository.local.LocalParcelRepository
import net.kelmer.correostracker.di.worker.ChildWorkerFactory
import net.kelmer.correostracker.ui.activity.MainActivityCompose
import net.kelmer.correostracker.ui.activity.MainActivity
import timber.log.Timber
import javax.inject.Inject

Expand Down Expand Up @@ -83,7 +83,7 @@ class ParcelPollWorker constructor(
applicationContext.getString(R.string.new_events_multiple, newEvents.size)
}

val notificationIntent = Intent(applicationContext, MainActivityCompose::class.java)
val notificationIntent = Intent(applicationContext, MainActivity::class.java)

notificationIntent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP

Expand Down
Original file line number Diff line number Diff line change
@@ -1,25 +1,22 @@
package net.kelmer.correostracker.ui.activity

import android.app.PendingIntent
import android.app.UiModeManager.MODE_NIGHT_YES
import android.content.Intent
import android.net.Uri
import android.os.Build
import android.os.Bundle
import androidx.activity.compose.setContent
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatDelegate
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi
import androidx.compose.material3.windowsizeclass.calculateWindowSizeClass
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.rxjava2.subscribeAsState
import androidx.core.app.ActivityCompat
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import androidx.fragment.app.FragmentActivity
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.LifecycleObserver
import androidx.work.Constraints
import androidx.work.ExistingPeriodicWorkPolicy
import androidx.work.NetworkType
Expand All @@ -28,10 +25,11 @@ import androidx.work.WorkManager
import com.google.android.gms.ads.MobileAds
import com.google.firebase.crashlytics.FirebaseCrashlytics
import dagger.hilt.android.AndroidEntryPoint
import net.kelmer.correostracker.ActivityLifecycleObserver
import net.kelmer.correostracker.CorreosApp
import net.kelmer.correostracker.R
import net.kelmer.correostracker.di.worker.MyWorkerFactory
import net.kelmer.correostracker.iap.InAppReviewService
import net.kelmer.correostracker.iar.InAppReviewService
import net.kelmer.correostracker.service.worker.NotificationID
import net.kelmer.correostracker.service.worker.PERMISSION_NOTIS
import net.kelmer.correostracker.service.worker.ParcelPollWorker
Expand All @@ -46,18 +44,28 @@ import javax.inject.Inject
* Created by Gabriel Sanmartín on 09/11/2020.
*/
@AndroidEntryPoint
class MainActivityCompose : FragmentActivity() {
class MainActivity : FragmentActivity() {

@Inject
lateinit var myWorkerFactory: MyWorkerFactory

@Inject
lateinit var inAppReviewService: InAppReviewService

@Inject
@ActivityLifecycleObserver
lateinit var lifecycleObservers: Set<@JvmSuppressWildcards LifecycleObserver>

@OptIn(ExperimentalMaterial3WindowSizeClassApi::class)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
MobileAds.initialize(this) {}

lifecycleObservers.forEach {
Timber.i("Adding lifecycleObserver $it")
lifecycle.addObserver(it)
}

Timber.i("Recreating activity")
setContent {

Expand Down Expand Up @@ -96,7 +104,7 @@ import javax.inject.Inject
}

private fun triggerSampleNotification(){
val notificationIntent = Intent(applicationContext, MainActivityCompose::class.java)
val notificationIntent = Intent(applicationContext, MainActivity::class.java)
val intent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
PendingIntent.getActivity(
applicationContext,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package net.kelmer.correostracker.ui.activity;

import androidx.lifecycle.LifecycleObserver;

import net.kelmer.correostracker.ActivityLifecycleObserver;

import java.util.Set;

import dagger.Module;
import dagger.hilt.InstallIn;
import dagger.hilt.android.components.ActivityComponent;
import dagger.multibindings.Multibinds;

@Module
@InstallIn(ActivityComponent.class)
abstract class MainActivity_ActivityModule {

@Multibinds
@ActivityLifecycleObserver
abstract Set<LifecycleObserver> processLifecycleObservers();
}
3 changes: 2 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ allprojects {
repositories {
google()
mavenCentral()
maven { url 'https://dl.bintray.com/lisawray/maven' }
jcenter()
maven { url 'https://jitpack.io' }

}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package net.kelmer.correostracker.initializer
package net.kelmer.correostracker

import android.app.Application

interface Initializer {
interface AppInitializer {

fun initialize(application: Application)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package net.kelmer.correostracker

import javax.inject.Qualifier

/**
* Annotate a [androidx.lifecycle.LifecycleObserver] with this qualifier to let it be registered in the
* [androidx.lifecycle.ProcessLifecycleOwner].
*/
@Qualifier
@Retention(AnnotationRetention.RUNTIME)
annotation class ProcessLifecycleObserver

/**
* Annotate a [androidx.lifecycle.LifecycleObserver] with this qualifier to let it be registered in the
* Activity Lifecycle.
*/
@Qualifier
@Retention(AnnotationRetention.RUNTIME)
annotation class ActivityLifecycleObserver
4 changes: 3 additions & 1 deletion gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ truth = { module = "com.google.truth:truth", version = "1.1.3" }

play-services-ads = { module = "com.google.android.gms:play-services-ads", version = "22.0.0" }

compose-bom = { module = "androidx.compose:compose-bom", version = "2023.04.01"}
compose-bom = { module = "androidx.compose:compose-bom", version = "2023.04.01" }
compose-material3-core = { module = "androidx.compose.material3:material3" }
compose-foundation = { module = "androidx.compose.foundation:foundation" }
compose-material3-windowsize = { module = "androidx.compose.material3:material3-window-size-class" }
Expand All @@ -196,3 +196,5 @@ compose-runtime-rxjava2 = { module = "androidx.compose.runtime:runtime-rxjava2"
compose-tooling = { module = "androidx.compose.ui:ui-tooling" }
compose-preview = { module = "androidx.compose.ui:ui-tooling-preview" }
hilt-navigation-compose = { module = "androidx.hilt:hilt-navigation-compose", version = "1.0.0" }

billingclient = { module = "com.android.billingclient:billing-ktx", version = "5.2.0" }
Loading

0 comments on commit c1ba058

Please sign in to comment.