Skip to content

Commit e9c996b

Browse files
committed
Remove BaseLicensePresenter and RestoreOutcomeHandler, inline into presenters
1 parent 7d5d7a3 commit e9c996b

13 files changed

Lines changed: 135 additions & 176 deletions

File tree

presentation/src/main/java/org/cryptomator/presentation/licensing/LicenseStateOrchestrator.kt

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,10 @@ class LicenseStateOrchestrator(
99
private val sharedPreferencesHandler: SharedPreferencesHandler,
1010
private val licenseEnforcer: LicenseEnforcer,
1111
private val contextProvider: () -> Context,
12-
private val target: Target,
12+
private val onStateChanged: (LicenseEnforcer.LicenseUiState) -> Unit,
1313
private val priceLoader: (() -> Unit)? = null
1414
) {
1515

16-
interface Target {
17-
fun onStateChanged(uiState: LicenseEnforcer.LicenseUiState)
18-
}
19-
2016
private val licenseChangeListener = Consumer<String> { _ -> updateState() }
2117

2218
fun onResume() {
@@ -32,6 +28,6 @@ class LicenseStateOrchestrator(
3228
}
3329

3430
fun updateState() {
35-
target.onStateChanged(licenseEnforcer.evaluateUiState(contextProvider()))
31+
onStateChanged(licenseEnforcer.evaluateUiState(contextProvider()))
3632
}
3733
}

presentation/src/main/java/org/cryptomator/presentation/presenter/BaseLicensePresenter.kt

Lines changed: 0 additions & 60 deletions
This file was deleted.
Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,54 @@
11
package org.cryptomator.presentation.presenter
22

3+
import android.net.Uri
34
import org.cryptomator.domain.usecases.DoLicenseCheckUseCase
5+
import org.cryptomator.domain.usecases.LicenseCheck
6+
import org.cryptomator.domain.usecases.NoOpResultHandler
47
import org.cryptomator.presentation.exception.ExceptionHandlers
5-
import org.cryptomator.presentation.ui.activity.view.UpdateLicenseView
8+
import org.cryptomator.presentation.ui.activity.view.LicenseView
9+
import org.cryptomator.presentation.ui.dialog.AppIsObscuredInfoDialog
610
import org.cryptomator.util.SharedPreferencesHandler
711
import javax.inject.Inject
812

913
class LicenseCheckPresenter @Inject internal constructor(
1014
exceptionHandlers: ExceptionHandlers,
11-
doLicenseCheckUseCase: DoLicenseCheckUseCase,
12-
sharedPreferencesHandler: SharedPreferencesHandler
13-
) : BaseLicensePresenter<UpdateLicenseView>(exceptionHandlers, doLicenseCheckUseCase, sharedPreferencesHandler)
15+
private val doLicenseCheckUseCase: DoLicenseCheckUseCase,
16+
private val sharedPreferencesHandler: SharedPreferencesHandler
17+
) : Presenter<LicenseView>(exceptionHandlers) {
18+
19+
fun validate(data: Uri?) {
20+
data?.let {
21+
val license = it.fragment ?: it.lastPathSegment
22+
if (license.isNullOrEmpty()) {
23+
return
24+
}
25+
doLicenseCheckUseCase.withLicense(license).run(CheckLicenseStatusSubscriber())
26+
}
27+
}
28+
29+
fun validateDialogAware(license: String?) {
30+
doLicenseCheckUseCase.withLicense(license).run(CheckLicenseStatusSubscriber())
31+
}
32+
33+
fun onFilteredTouchEventForSecurity() {
34+
view?.showDialog(AppIsObscuredInfoDialog.newInstance())
35+
}
36+
37+
private inner class CheckLicenseStatusSubscriber : NoOpResultHandler<LicenseCheck>() {
38+
override fun onSuccess(licenseCheck: LicenseCheck) {
39+
super.onSuccess(licenseCheck)
40+
view?.closeDialog()
41+
sharedPreferencesHandler.setMail(licenseCheck.mail())
42+
view?.showConfirmationDialog(licenseCheck.mail())
43+
}
44+
45+
override fun onError(t: Throwable) {
46+
super.onError(t)
47+
showError(t)
48+
}
49+
}
50+
51+
init {
52+
unsubscribeOnDestroy(doLicenseCheckUseCase)
53+
}
54+
}

presentation/src/main/java/org/cryptomator/presentation/presenter/WelcomePresenter.kt

Lines changed: 41 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,17 @@ import android.Manifest
44
import android.app.admin.DevicePolicyManager
55
import android.content.ActivityNotFoundException
66
import android.content.Intent
7+
import android.net.Uri
78
import android.os.Build
89
import org.cryptomator.domain.di.PerView
910
import org.cryptomator.domain.usecases.DoLicenseCheckUseCase
11+
import org.cryptomator.domain.usecases.LicenseCheck
12+
import org.cryptomator.domain.usecases.NoOpResultHandler
1013
import org.cryptomator.generator.Callback
1114
import org.cryptomator.presentation.R
1215
import org.cryptomator.presentation.exception.ExceptionHandlers
1316
import org.cryptomator.presentation.ui.activity.view.WelcomeView
17+
import org.cryptomator.presentation.ui.dialog.AppIsObscuredInfoDialog
1418
import org.cryptomator.presentation.workflow.PermissionsResult
1519
import org.cryptomator.util.SharedPreferencesHandler
1620
import timber.log.Timber
@@ -19,9 +23,26 @@ import javax.inject.Inject
1923
@PerView
2024
class WelcomePresenter @Inject internal constructor(
2125
exceptionHandlers: ExceptionHandlers,
22-
doLicenseCheckUseCase: DoLicenseCheckUseCase,
23-
sharedPreferencesHandler: SharedPreferencesHandler
24-
) : BaseLicensePresenter<WelcomeView>(exceptionHandlers, doLicenseCheckUseCase, sharedPreferencesHandler) {
26+
private val doLicenseCheckUseCase: DoLicenseCheckUseCase,
27+
private val sharedPreferencesHandler: SharedPreferencesHandler
28+
) : Presenter<WelcomeView>(exceptionHandlers) {
29+
30+
fun validate(data: Uri?) {
31+
data?.let {
32+
val license = it.fragment ?: it.lastPathSegment
33+
if (license.isNullOrEmpty()) return
34+
view?.showOrUpdateLicenseEntry(license)
35+
doLicenseCheckUseCase.withLicense(license).run(CheckLicenseStatusSubscriber())
36+
}
37+
}
38+
39+
fun validateDialogAware(license: String?) {
40+
doLicenseCheckUseCase.withLicense(license).run(CheckLicenseStatusSubscriber())
41+
}
42+
43+
fun onFilteredTouchEventForSecurity() {
44+
view?.showDialog(AppIsObscuredInfoDialog.newInstance())
45+
}
2546

2647
fun requestNotificationPermission() {
2748
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.S_V2) {
@@ -53,4 +74,21 @@ class WelcomePresenter @Inject internal constructor(
5374
}
5475
}
5576

77+
private inner class CheckLicenseStatusSubscriber : NoOpResultHandler<LicenseCheck>() {
78+
override fun onSuccess(licenseCheck: LicenseCheck) {
79+
super.onSuccess(licenseCheck)
80+
view?.closeDialog()
81+
sharedPreferencesHandler.setMail(licenseCheck.mail())
82+
view?.showConfirmationDialog(licenseCheck.mail())
83+
}
84+
85+
override fun onError(t: Throwable) {
86+
super.onError(t)
87+
showError(t)
88+
}
89+
}
90+
91+
init {
92+
unsubscribeOnDestroy(doLicenseCheckUseCase)
93+
}
5694
}

presentation/src/main/java/org/cryptomator/presentation/service/RestoreOutcomeHandler.kt

Lines changed: 0 additions & 5 deletions
This file was deleted.

presentation/src/main/java/org/cryptomator/presentation/ui/activity/LicenseCheckActivity.kt

Lines changed: 19 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@ import org.cryptomator.presentation.licensing.LicenseEnforcer
1414
import org.cryptomator.presentation.licensing.LicenseStateOrchestrator
1515
import org.cryptomator.presentation.presenter.LicenseCheckPresenter
1616
import org.cryptomator.presentation.service.RestoreOutcome
17-
import org.cryptomator.presentation.service.RestoreOutcomeHandler
18-
import org.cryptomator.presentation.ui.activity.view.UpdateLicenseView
17+
import org.cryptomator.presentation.ui.activity.view.LicenseView
1918
import org.cryptomator.presentation.ui.dialog.CancelSubscriptionReminderDialog
2019
import org.cryptomator.presentation.ui.dialog.EnterLicenseDialog
2120
import org.cryptomator.presentation.ui.dialog.LicenseConfirmationDialog
@@ -30,13 +29,8 @@ import javax.inject.Inject
3029
@Activity
3130
class LicenseCheckActivity : BaseActivity<ActivityLicenseCheckBinding>(ActivityLicenseCheckBinding::inflate), //
3231
LicenseConfirmationDialog.Callback, //
33-
UpdateLicenseView, //
34-
RestoreOutcomeHandler, //
35-
RestoreSuccessfulDialog.Callback, //
36-
NoFullVersionDialog.Callback, //
37-
RestoreFailedDialog.Callback, //
38-
EnterLicenseDialog.Callback, //
39-
CancelSubscriptionReminderDialog.Callback {
32+
LicenseView, //
33+
EnterLicenseDialog.Callback {
4034

4135
@Inject
4236
lateinit var licenseCheckPresenter: LicenseCheckPresenter
@@ -55,17 +49,15 @@ class LicenseCheckActivity : BaseActivity<ActivityLicenseCheckBinding>(ActivityL
5549
wasSubscriptionOnly = sharedPreferencesHandler.hasRunningSubscription() && sharedPreferencesHandler.licenseToken().isEmpty()
5650
LicenseStateOrchestrator(
5751
sharedPreferencesHandler, licenseEnforcer, { this },
58-
target = object : LicenseStateOrchestrator.Target {
59-
override fun onStateChanged(uiState: LicenseEnforcer.LicenseUiState) {
60-
if (uiState.hasLifetimeLicense && uiState.hasRunningSubscription && wasSubscriptionOnly) {
61-
showDialog(CancelSubscriptionReminderDialog.newInstance())
62-
}
63-
val prevSubscriptionOnly = wasSubscriptionOnly
64-
wasSubscriptionOnly = uiState.hasRunningSubscription && !uiState.hasLifetimeLicense
65-
if (uiState.hasRunningSubscription && !uiState.hasLifetimeLicense && !prevSubscriptionOnly) {
66-
finish()
67-
return
68-
}
52+
onStateChanged = { uiState ->
53+
if (uiState.hasLifetimeLicense && uiState.hasRunningSubscription && wasSubscriptionOnly) {
54+
showDialog(CancelSubscriptionReminderDialog.newInstance())
55+
}
56+
val prevSubscriptionOnly = wasSubscriptionOnly
57+
wasSubscriptionOnly = uiState.hasRunningSubscription && !uiState.hasLifetimeLicense
58+
if (uiState.hasRunningSubscription && !uiState.hasLifetimeLicense && !prevSubscriptionOnly) {
59+
finish()
60+
} else {
6961
licenseContentViewBinder.bindPurchaseState(uiState.hasWriteAccess, uiState.hasPaidLicense, uiState.hasLifetimeLicense, uiState.hasRunningSubscription, hasLockedActionHeader = lockedAction != null)
7062
licenseContentViewBinder.bindTrialState(uiState.trialState.isActive, uiState.trialState.isExpired, uiState.trialExpirationText, hasLockedActionHeader = lockedAction != null, hasSubscriptionUpgradeHint = wasSubscriptionOnly)
7163
}
@@ -87,7 +79,13 @@ class LicenseCheckActivity : BaseActivity<ActivityLicenseCheckBinding>(ActivityL
8779
override fun onResume() {
8880
super.onResume()
8981
orchestrator.onResume()
90-
(application as CryptomatorApp).consumeLastRestoreOutcome()?.let { onRestoreOutcome(it) }
82+
(application as CryptomatorApp).consumeLastRestoreOutcome()?.let { outcome ->
83+
when (outcome) {
84+
RestoreOutcome.RESTORED -> showDialog(RestoreSuccessfulDialog.newInstance())
85+
RestoreOutcome.NOTHING_TO_RESTORE -> showDialog(NoFullVersionDialog.newInstance())
86+
is RestoreOutcome.FAILED -> showDialog(RestoreFailedDialog.newInstance())
87+
}
88+
}
9189
}
9290

9391
override fun onPause() {
@@ -161,10 +159,6 @@ class LicenseCheckActivity : BaseActivity<ActivityLicenseCheckBinding>(ActivityL
161159
licenseCheckPresenter.validate(intent.data)
162160
}
163161

164-
override fun showOrUpdateLicenseEntry(license: String) {
165-
// license already validated by the use case; no inline input to update
166-
}
167-
168162
override fun onLicenseEntered(license: String) {
169163
licenseCheckPresenter.validateDialogAware(license)
170164
}
@@ -178,17 +172,4 @@ class LicenseCheckActivity : BaseActivity<ActivityLicenseCheckBinding>(ActivityL
178172
.preventGoingBackInHistory() //
179173
.startActivity(this) //
180174
}
181-
182-
override fun onRestoreOutcome(outcome: RestoreOutcome) {
183-
when (outcome) {
184-
RestoreOutcome.RESTORED -> showDialog(RestoreSuccessfulDialog.newInstance())
185-
RestoreOutcome.NOTHING_TO_RESTORE -> showDialog(NoFullVersionDialog.newInstance())
186-
is RestoreOutcome.FAILED -> showDialog(RestoreFailedDialog.newInstance())
187-
}
188-
}
189-
190-
override fun onRestoreSuccessfulDialogFinished() = Unit
191-
override fun onNoFullVersionDialogFinished() = Unit
192-
override fun onRestoreFailedDialogFinished() = Unit
193-
override fun onCancelSubscriptionReminderDismissed() = Unit
194175
}

presentation/src/main/java/org/cryptomator/presentation/ui/activity/WelcomeActivity.kt

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import org.cryptomator.presentation.licensing.LicenseEnforcer
2222
import org.cryptomator.presentation.licensing.LicenseStateOrchestrator
2323
import org.cryptomator.presentation.presenter.WelcomePresenter
2424
import org.cryptomator.presentation.service.RestoreOutcome
25-
import org.cryptomator.presentation.service.RestoreOutcomeHandler
2625
import org.cryptomator.presentation.ui.activity.view.UpdateLicenseView
2726
import org.cryptomator.presentation.ui.activity.view.WelcomeView
2827
import org.cryptomator.presentation.ui.dialog.EnterLicenseDialog
@@ -44,10 +43,6 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>(ActivityWelcomeBind
4443
WelcomeLicenseFragment.Listener, //
4544
WelcomeNotificationsFragment.Listener, //
4645
WelcomeScreenLockFragment.Listener, //
47-
RestoreOutcomeHandler, //
48-
RestoreSuccessfulDialog.Callback, //
49-
NoFullVersionDialog.Callback, //
50-
RestoreFailedDialog.Callback, //
5146
EnterLicenseDialog.Callback {
5247

5348
@Inject
@@ -61,17 +56,14 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>(ActivityWelcomeBind
6156
private val orchestrator by lazy {
6257
LicenseStateOrchestrator(
6358
sharedPreferencesHandler, licenseEnforcer, { this },
64-
target = object : LicenseStateOrchestrator.Target {
65-
override fun onStateChanged(uiState: LicenseEnforcer.LicenseUiState) {
66-
if (!this@WelcomeActivity::pagerAdapter.isInitialized) {
67-
return
68-
}
59+
onStateChanged = { uiState ->
60+
if (this::pagerAdapter.isInitialized) {
6961
pagerAdapter.licenseFragment?.updateUnlocked(uiState.hasWriteAccess, uiState.hasPaidLicense)
7062
pagerAdapter.licenseFragment?.updateTrialState(uiState.trialState.isActive, uiState.trialState.isExpired, uiState.trialExpirationText)
7163
}
7264
},
7365
priceLoader = {
74-
if (this@WelcomeActivity::pagerAdapter.isInitialized) {
66+
if (this::pagerAdapter.isInitialized) {
7567
pagerAdapter.licenseFragment?.loadAndBindPrices(application as CryptomatorApp)
7668
}
7769
}
@@ -127,7 +119,13 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>(ActivityWelcomeBind
127119
return
128120
}
129121
orchestrator.onResume()
130-
(application as CryptomatorApp).consumeLastRestoreOutcome()?.let { onRestoreOutcome(it) }
122+
(application as CryptomatorApp).consumeLastRestoreOutcome()?.let { outcome ->
123+
when (outcome) {
124+
RestoreOutcome.RESTORED -> showDialog(RestoreSuccessfulDialog.newInstance())
125+
RestoreOutcome.NOTHING_TO_RESTORE -> showDialog(NoFullVersionDialog.newInstance())
126+
is RestoreOutcome.FAILED -> showDialog(RestoreFailedDialog.newInstance())
127+
}
128+
}
131129
updateNotificationPermissionState()
132130
updateScreenLockState()
133131
}
@@ -272,20 +270,6 @@ class WelcomeActivity : BaseActivity<ActivityWelcomeBinding>(ActivityWelcomeBind
272270
welcomePresenter.validateDialogAware(license)
273271
}
274272

275-
// RestoreOutcomeHandler
276-
277-
override fun onRestoreOutcome(outcome: RestoreOutcome) {
278-
when (outcome) {
279-
RestoreOutcome.RESTORED -> showDialog(RestoreSuccessfulDialog.newInstance())
280-
RestoreOutcome.NOTHING_TO_RESTORE -> showDialog(NoFullVersionDialog.newInstance())
281-
is RestoreOutcome.FAILED -> showDialog(RestoreFailedDialog.newInstance())
282-
}
283-
}
284-
285-
override fun onRestoreSuccessfulDialogFinished() = Unit
286-
override fun onNoFullVersionDialogFinished() = Unit
287-
override fun onRestoreFailedDialogFinished() = Unit
288-
289273
// WelcomeNotificationsFragment.Listener
290274

291275
override fun onRequestNotifications() {
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package org.cryptomator.presentation.ui.activity.view
2+
3+
interface LicenseView : View {
4+
fun showConfirmationDialog(mail: String)
5+
}

0 commit comments

Comments
 (0)