Skip to content

Commit c81bd8f

Browse files
Added view models for help and support
1 parent 742ad57 commit c81bd8f

File tree

6 files changed

+159
-115
lines changed

6 files changed

+159
-115
lines changed

app/src/main/kotlin/com/d4rk/cleaner/ui/help/HelpActivity.kt

Lines changed: 3 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,16 @@ package com.d4rk.cleaner.ui.help
33
import android.os.Bundle
44
import androidx.activity.compose.setContent
55
import androidx.activity.enableEdgeToEdge
6+
import androidx.activity.viewModels
67
import androidx.appcompat.app.AppCompatActivity
78
import androidx.compose.foundation.layout.fillMaxSize
89
import androidx.compose.material3.MaterialTheme
910
import androidx.compose.material3.Surface
1011
import androidx.compose.ui.Modifier
1112
import com.d4rk.cleaner.ui.settings.display.theme.style.AppTheme
12-
import com.d4rk.cleaner.utils.IntentUtils
13-
import com.google.android.play.core.review.ReviewManager
14-
import com.google.android.play.core.review.ReviewManagerFactory
1513

1614
class HelpActivity : AppCompatActivity() {
17-
private lateinit var reviewManager : ReviewManager
15+
private val viewModel: HelpViewModel by viewModels()
1816
override fun onCreate(savedInstanceState : Bundle?) {
1917
super.onCreate(savedInstanceState)
2018
enableEdgeToEdge()
@@ -23,36 +21,10 @@ class HelpActivity : AppCompatActivity() {
2321
Surface(
2422
modifier = Modifier.fillMaxSize() , color = MaterialTheme.colorScheme.background
2523
) {
26-
HelpComposable(this@HelpActivity)
24+
HelpComposable(this@HelpActivity, viewModel)
2725
}
2826
}
2927
}
3028

3129
}
32-
33-
/**
34-
* Initiates the feedback process for the app.
35-
*
36-
* This function uses the Google Play In-App Review API to prompt the user for feedback.
37-
* If the request to launch the in-app review flow is successful, the review dialog is displayed.
38-
* If the request fails, it opens the Google Play Store page for the app's reviews.
39-
*
40-
* @see com.google.android.play.core.review.ReviewManagerFactory
41-
* @see com.google.android.play.core.review.ReviewManager
42-
* @param context The context used to create the ReviewManager instance and launch review flows.
43-
*/
44-
fun feedback() {
45-
reviewManager = ReviewManagerFactory.create(this)
46-
val task = reviewManager.requestReviewFlow()
47-
task.addOnSuccessListener { reviewInfo ->
48-
reviewManager.launchReviewFlow(this , reviewInfo)
49-
}.addOnFailureListener {
50-
IntentUtils.openUrl(
51-
this ,
52-
"https://play.google.com/store/apps/details?id=${this.packageName}&showAllReviews=true"
53-
)
54-
}.addOnFailureListener {
55-
IntentUtils.sendEmailToDeveloper(this)
56-
}
57-
}
5830
}

app/src/main/kotlin/com/d4rk/cleaner/ui/help/HelpComposable.kt

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import androidx.compose.material3.Text
3333
import androidx.compose.material3.TopAppBarDefaults
3434
import androidx.compose.material3.rememberTopAppBarState
3535
import androidx.compose.runtime.Composable
36+
import androidx.compose.runtime.LaunchedEffect
3637
import androidx.compose.runtime.getValue
3738
import androidx.compose.runtime.mutableStateOf
3839
import androidx.compose.runtime.remember
@@ -52,11 +53,19 @@ import com.google.android.gms.oss.licenses.OssLicensesMenuActivity
5253

5354
@OptIn(ExperimentalMaterial3Api::class)
5455
@Composable
55-
fun HelpComposable(activity : HelpActivity) {
56+
fun HelpComposable(activity : HelpActivity, viewModel: HelpViewModel) {
5657
val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(rememberTopAppBarState())
5758
var showMenu by remember { mutableStateOf(false) }
5859
val context = LocalContext.current
5960
val showDialog = remember { mutableStateOf(false) }
61+
val reviewInfo = viewModel.reviewInfo.value
62+
63+
if (reviewInfo != null) {
64+
LaunchedEffect(key1 = reviewInfo) {
65+
viewModel.requestReviewFlow()
66+
}
67+
}
68+
6069
Scaffold(modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection) , topBar = {
6170
LargeTopAppBar(title = { Text(stringResource(R.string.help)) } , navigationIcon = {
6271
IconButton(onClick = {
@@ -138,8 +147,10 @@ fun HelpComposable(activity : HelpActivity) {
138147
ExtendedFloatingActionButton(
139148
text = { Text(stringResource(id = R.string.feedback)) } ,
140149
onClick = {
141-
activity.feedback()
142-
} ,
150+
viewModel.reviewInfo.value?.let { safeReviewInfo ->
151+
viewModel.launchReviewFlow(activity, safeReviewInfo)
152+
}
153+
},
143154
icon = {
144155
Icon(
145156
Icons.Default.MailOutline , contentDescription = null
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.d4rk.cleaner.ui.help
2+
3+
import android.app.Application
4+
import androidx.compose.runtime.*
5+
import androidx.lifecycle.AndroidViewModel
6+
import androidx.lifecycle.viewModelScope
7+
import com.google.android.play.core.review.ReviewInfo
8+
import com.google.android.play.core.review.ReviewManagerFactory
9+
import kotlinx.coroutines.Dispatchers
10+
import kotlinx.coroutines.launch
11+
12+
class HelpViewModel(application: Application) : AndroidViewModel(application) {
13+
14+
private var _reviewInfo: MutableState<ReviewInfo?> = mutableStateOf(null)
15+
val reviewInfo: State<ReviewInfo?> = _reviewInfo
16+
17+
fun requestReviewFlow() {
18+
viewModelScope.launch(Dispatchers.IO) {
19+
val reviewManager = ReviewManagerFactory.create(getApplication())
20+
val request = reviewManager.requestReviewFlow()
21+
request.addOnCompleteListener { task ->
22+
if (task.isSuccessful) {
23+
_reviewInfo.value = task.result
24+
} else {
25+
task.exception?.printStackTrace()
26+
}
27+
}
28+
}
29+
}
30+
31+
fun launchReviewFlow(activity: HelpActivity, reviewInfo: ReviewInfo) {
32+
val reviewManager = ReviewManagerFactory.create(activity)
33+
reviewManager.launchReviewFlow(activity, reviewInfo)
34+
}
35+
}

app/src/main/kotlin/com/d4rk/cleaner/ui/support/SupportActivity.kt

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,30 @@ package com.d4rk.cleaner.ui.support
55
import android.os.Bundle
66
import androidx.activity.compose.setContent
77
import androidx.activity.enableEdgeToEdge
8+
import androidx.activity.viewModels
89
import androidx.appcompat.app.AppCompatActivity
910
import androidx.compose.foundation.layout.fillMaxSize
1011
import androidx.compose.material3.MaterialTheme
1112
import androidx.compose.material3.Surface
12-
import androidx.compose.runtime.snapshots.SnapshotStateMap
1313
import androidx.compose.ui.Modifier
1414
import com.android.billingclient.api.BillingClient
1515
import com.android.billingclient.api.BillingFlowParams
1616
import com.android.billingclient.api.SkuDetails
17-
import com.android.billingclient.api.SkuDetailsParams
1817
import com.d4rk.cleaner.ui.settings.display.theme.style.AppTheme
1918

2019
class SupportActivity : AppCompatActivity() {
21-
override fun onCreate(savedInstanceState : Bundle?) {
20+
private val viewModel: SupportViewModel by viewModels()
21+
22+
override fun onCreate(savedInstanceState: Bundle?) {
2223
super.onCreate(savedInstanceState)
2324
enableEdgeToEdge()
2425
setContent {
2526
AppTheme {
2627
Surface(
27-
modifier = Modifier.fillMaxSize() , color = MaterialTheme.colorScheme.background
28+
modifier = Modifier.fillMaxSize(),
29+
color = MaterialTheme.colorScheme.background
2830
) {
29-
SupportComposable(this@SupportActivity)
31+
SupportComposable(viewModel, this@SupportActivity)
3032
}
3133
}
3234
}
@@ -41,20 +43,4 @@ class SupportActivity : AppCompatActivity() {
4143
billingClient.launchBillingFlow(this , flowParams)
4244
}
4345
}
44-
45-
fun querySkuDetails(
46-
billingClient : BillingClient , skuDetailsMap : SnapshotStateMap<String , SkuDetails>
47-
) {
48-
val skuList =
49-
listOf("low_donation" , "normal_donation" , "high_donation" , "extreme_donation")
50-
val params = SkuDetailsParams.newBuilder().setSkusList(skuList)
51-
.setType(BillingClient.SkuType.INAPP).build()
52-
billingClient.querySkuDetailsAsync(params) { billingResult , skuDetailsList ->
53-
if (billingResult.responseCode == BillingClient.BillingResponseCode.OK && skuDetailsList != null) {
54-
for (skuDetails in skuDetailsList) {
55-
skuDetailsMap[skuDetails.sku] = skuDetails
56-
}
57-
}
58-
}
59-
}
6046
}

0 commit comments

Comments
 (0)