Skip to content

Commit 9969181

Browse files
committed
refactor(InAppUpdate): Use new Manager
1 parent 9fe85e3 commit 9969181

File tree

5 files changed

+77
-70
lines changed

5 files changed

+77
-70
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/*
2+
* Infomaniak Mail - Android
3+
* Copyright (C) 2024 Infomaniak Network SA
4+
*
5+
* This program is free software: you can redistribute it and/or modify
6+
* it under the terms of the GNU General Public License as published by
7+
* the Free Software Foundation, either version 3 of the License, or
8+
* (at your option) any later version.
9+
*
10+
* This program is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
* GNU General Public License for more details.
14+
*
15+
* You should have received a copy of the GNU General Public License
16+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
17+
*/
18+
package com.infomaniak.mail.di
19+
20+
import androidx.fragment.app.FragmentActivity
21+
import com.infomaniak.lib.stores.InAppUpdateManager
22+
import com.infomaniak.mail.BuildConfig
23+
import com.infomaniak.mail.MatomoMail.DISCOVER_LATER
24+
import com.infomaniak.mail.MatomoMail.DISCOVER_NOW
25+
import com.infomaniak.mail.MatomoMail.trackInAppUpdateEvent
26+
import com.infomaniak.mail.ui.main.SnackbarManager
27+
import dagger.Module
28+
import dagger.Provides
29+
import dagger.hilt.InstallIn
30+
import dagger.hilt.android.components.ActivityComponent
31+
import dagger.hilt.android.scopes.ActivityScoped
32+
import io.sentry.Sentry
33+
import com.infomaniak.lib.core.R as RCore
34+
35+
@Module
36+
@InstallIn(ActivityComponent::class)
37+
object ActivityModule {
38+
39+
@ActivityScoped
40+
@Provides
41+
fun provideInAppUpdateManager(activity: FragmentActivity, snackbarManager: SnackbarManager) = InAppUpdateManager(
42+
activity = activity,
43+
appId = BuildConfig.APPLICATION_ID,
44+
versionCode = BuildConfig.VERSION_CODE,
45+
onUserChoice = { isWantingUpdate -> activity.trackInAppUpdateEvent(if (isWantingUpdate) DISCOVER_NOW else DISCOVER_LATER) },
46+
onInstallStart = { activity.trackInAppUpdateEvent("installUpdate") },
47+
onInstallFailure = {
48+
Sentry.captureException(it)
49+
snackbarManager.setValue(activity.getString(RCore.string.errorUpdateInstall))
50+
},
51+
)
52+
}

app/src/main/java/com/infomaniak/mail/ui/MainActivity.kt

+15-29
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,13 @@ import androidx.navigation.fragment.NavHostFragment
4040
import androidx.work.Data
4141
import com.infomaniak.lib.core.MatomoCore.TrackerAction
4242
import com.infomaniak.lib.core.networking.LiveDataNetworkStatus
43-
import com.infomaniak.lib.core.utils.SentryLog
43+
import com.infomaniak.lib.core.utils.*
4444
import com.infomaniak.lib.core.utils.Utils
4545
import com.infomaniak.lib.core.utils.Utils.toEnumOrThrow
4646
import com.infomaniak.lib.core.utils.UtilsUi.openUrl
47-
import com.infomaniak.lib.core.utils.hasPermissions
48-
import com.infomaniak.lib.core.utils.year
49-
import com.infomaniak.lib.stores.StoreUtils.checkUpdateIsAvailable
50-
import com.infomaniak.lib.stores.StoreUtils.initAppUpdateManager
47+
import com.infomaniak.lib.stores.InAppUpdateManager
48+
import com.infomaniak.lib.stores.StoreUtils
5149
import com.infomaniak.lib.stores.StoreUtils.launchInAppReview
52-
import com.infomaniak.lib.stores.StoreUtils.unregisterAppUpdateListener
5350
import com.infomaniak.mail.BuildConfig
5451
import com.infomaniak.mail.MatomoMail.DISCOVER_LATER
5552
import com.infomaniak.mail.MatomoMail.DISCOVER_NOW
@@ -156,6 +153,9 @@ class MainActivity : BaseActivity() {
156153
@Inject
157154
lateinit var snackbarManager: SnackbarManager
158155

156+
@Inject
157+
lateinit var inAppUpdateManager: InAppUpdateManager
158+
159159
private val drawerListener = object : DrawerLayout.DrawerListener {
160160

161161
var hasDragged = false
@@ -347,14 +347,12 @@ class MainActivity : BaseActivity() {
347347
appReviewLaunches--
348348
}
349349

350-
showUpdateAvailable()
351350
showSyncDiscovery()
352351
}
353352

354353
override fun onResume() {
355354
super.onResume()
356355
playServicesUtils.checkPlayServices(this)
357-
mainViewModel.checkAppUpdateStatus()
358356
if (binding.drawerLayout.isOpen) colorSystemBarsWithMenuDrawer(UiUtils.FULLY_SLID)
359357
}
360358

@@ -387,7 +385,6 @@ class MainActivity : BaseActivity() {
387385

388386
override fun onStop() {
389387
descriptionDialog.resetLoadingAndDismiss()
390-
unregisterAppUpdateListener()
391388
super.onStop()
392389
}
393390

@@ -466,28 +463,17 @@ class MainActivity : BaseActivity() {
466463
}
467464
}
468465

469-
private fun initAppUpdateManager() {
470-
initAppUpdateManager(
471-
context = this,
472-
onUpdateDownloaded = { mainViewModel.toggleAppUpdateStatus(isUpdateDownloaded = true) },
473-
onUpdateInstalled = {
474-
Sentry.captureMessage("InstallStateUpdateListener called ’state == INSTALLED’", SentryLevel.DEBUG)
475-
mainViewModel.toggleAppUpdateStatus(isUpdateDownloaded = false)
476-
},
477-
)
478-
}
466+
private fun initAppUpdateManager() = with(inAppUpdateManager) {
467+
onFDroidResult = { updateIsAvailable ->
468+
if (updateIsAvailable) navController.navigate(R.id.updateAvailableBottomSheetDialog)
469+
}
479470

480-
private fun showUpdateAvailable() = with(localSettings) {
481-
if (isUserWantingUpdates || (appLaunches != 0 && appLaunches % 10 == 0)) {
482-
checkUpdateIsAvailable(
483-
appId = BuildConfig.APPLICATION_ID,
484-
versionCode = BuildConfig.VERSION_CODE,
485-
inAppResultLauncher = inAppUpdateResultLauncher,
486-
onFDroidResult = { updateIsAvailable ->
487-
if (updateIsAvailable) navController.navigate(R.id.updateAvailableBottomSheetDialog)
488-
},
489-
)
471+
onInAppUpdateUiChange = { isUpdateDownloaded ->
472+
SentryLog.d(StoreUtils.APP_UPDATE_TAG, "Must display update button : $isUpdateDownloaded")
473+
mainViewModel.canInstallUpdate.value = isUpdateDownloaded
490474
}
475+
476+
lifecycle.addObserver(observer = this)
491477
}
492478

493479
private fun showSyncDiscovery() = with(localSettings) {

app/src/main/java/com/infomaniak/mail/ui/MainViewModel.kt

-17
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ import com.infomaniak.lib.core.utils.ApiErrorCode.Companion.translateError
2424
import com.infomaniak.lib.core.utils.DownloadManagerUtils
2525
import com.infomaniak.lib.core.utils.SentryLog
2626
import com.infomaniak.lib.core.utils.SingleLiveEvent
27-
import com.infomaniak.lib.stores.StoreUtils
28-
import com.infomaniak.lib.stores.StoreUtils.APP_UPDATE_TAG
2927
import com.infomaniak.mail.MatomoMail.trackMultiSelectionEvent
3028
import com.infomaniak.mail.R
3129
import com.infomaniak.mail.data.LocalSettings
@@ -1023,21 +1021,6 @@ class MainViewModel @Inject constructor(
10231021
snackbarManager.postValue(context.getString(snackbarTitleRes))
10241022
}
10251023

1026-
fun checkAppUpdateStatus() {
1027-
SentryLog.d(
1028-
tag = APP_UPDATE_TAG,
1029-
msg = "Setting canInstallUpdate value to ${localSettings.hasAppUpdateDownloaded} in checkAppUpdateStatus",
1030-
)
1031-
canInstallUpdate.value = localSettings.hasAppUpdateDownloaded
1032-
StoreUtils.checkStalledUpdate()
1033-
}
1034-
1035-
fun toggleAppUpdateStatus(isUpdateDownloaded: Boolean) {
1036-
SentryLog.d(APP_UPDATE_TAG, "Setting canInstallUpdate value to $isUpdateDownloaded in toggleAppUpdateStatus")
1037-
canInstallUpdate.value = isUpdateDownloaded
1038-
localSettings.hasAppUpdateDownloaded = isUpdateDownloaded
1039-
}
1040-
10411024
companion object {
10421025
private val TAG: String = MainViewModel::class.java.simpleName
10431026
private val DEFAULT_SELECTED_FOLDER = FolderRole.INBOX

app/src/main/java/com/infomaniak/mail/ui/main/folder/ThreadListFragment.kt

+9-23
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,8 @@ import com.ernestoyaquello.dragdropswiperecyclerview.listener.OnListScrollListen
4747
import com.infomaniak.lib.core.MatomoCore.TrackerAction
4848
import com.infomaniak.lib.core.utils.*
4949
import com.infomaniak.lib.core.utils.Utils
50-
import com.infomaniak.lib.stores.StoreUtils
51-
import com.infomaniak.lib.stores.StoreUtils.APP_UPDATE_TAG
50+
import com.infomaniak.lib.stores.InAppUpdateManager
5251
import com.infomaniak.mail.MatomoMail.trackEvent
53-
import com.infomaniak.mail.MatomoMail.trackInAppUpdateEvent
5452
import com.infomaniak.mail.MatomoMail.trackMenuDrawerEvent
5553
import com.infomaniak.mail.MatomoMail.trackMultiSelectionEvent
5654
import com.infomaniak.mail.MatomoMail.trackNewMessageEvent
@@ -101,6 +99,10 @@ class ThreadListFragment : TwoPaneFragment(), SwipeRefreshLayout.OnRefreshListen
10199
private var lastUpdatedDate: Date? = null
102100
private var previousCustomFolderId: String? = null
103101

102+
private val showLoadingTimer: CountDownTimer by lazy { Utils.createRefreshTimer(onTimerFinish = ::showRefreshLayout) }
103+
104+
private var canRefreshThreads = false
105+
104106
@Inject
105107
lateinit var localSettings: LocalSettings
106108

@@ -113,16 +115,15 @@ class ThreadListFragment : TwoPaneFragment(), SwipeRefreshLayout.OnRefreshListen
113115
@Inject
114116
lateinit var playServicesUtils: PlayServicesUtils
115117

116-
private val showLoadingTimer: CountDownTimer by lazy { Utils.createRefreshTimer(onTimerFinish = ::showRefreshLayout) }
117-
118-
private var canRefreshThreads = false
119-
120118
@Inject
121119
lateinit var descriptionDialog: DescriptionAlertDialog
122120

123121
@Inject
124122
lateinit var snackbarManager: SnackbarManager
125123

124+
@Inject
125+
lateinit var inAppUpdateManager: InAppUpdateManager
126+
126127
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
127128
return FragmentThreadListBinding.inflate(inflater, container, false).also { _binding = it }.root
128129
}
@@ -623,23 +624,8 @@ class ThreadListFragment : TwoPaneFragment(), SwipeRefreshLayout.OnRefreshListen
623624

624625
private fun observeUpdateInstall() = with(binding) {
625626
mainViewModel.canInstallUpdate.observe(viewLifecycleOwner) { isUpdateDownloaded ->
626-
SentryLog.d(APP_UPDATE_TAG, "Must display update button : $isUpdateDownloaded")
627627
installUpdateGroup.isVisible = isUpdateDownloaded
628-
installUpdate.setOnClickListener {
629-
SentryLog.d(APP_UPDATE_TAG, "Install downloaded Update from button")
630-
context.trackInAppUpdateEvent("installUpdate")
631-
mainViewModel.canInstallUpdate.value = false
632-
localSettings.hasAppUpdateDownloaded = false
633-
634-
StoreUtils.installDownloadedUpdate(
635-
onFailure = {
636-
Sentry.captureException(it)
637-
localSettings.resetUpdateSettings()
638-
639-
snackbarManager.setValue(getString(RCore.string.errorUpdateInstall))
640-
},
641-
)
642-
}
628+
installUpdate.setOnClickListener { inAppUpdateManager.installDownloadedUpdate() }
643629
}
644630
}
645631

0 commit comments

Comments
 (0)