1
1
package com.d4rk.cleaner.ui.home
2
2
3
- import android.Manifest
4
3
import android.app.Activity
5
- import android.app.AppOpsManager
6
4
import android.app.Application
7
5
import android.app.usage.StorageStatsManager
8
6
import android.content.Context
9
- import android.content.Intent
10
- import android.content.pm.PackageManager
11
- import android.net.Uri
12
- import android.os.Build
13
- import android.os.Environment
14
7
import android.os.storage.StorageManager
15
- import android.provider.Settings
16
8
import androidx.compose.runtime.mutableStateMapOf
17
9
import androidx.compose.runtime.mutableStateOf
18
- import androidx.core.app.ActivityCompat
19
- import androidx.core.content.ContextCompat
20
10
import androidx.lifecycle.AndroidViewModel
21
11
import androidx.lifecycle.MutableLiveData
22
12
import androidx.lifecycle.viewModelScope
23
13
import com.d4rk.cleaner.data.datastore.DataStore
24
14
import com.d4rk.cleaner.utils.FileScanner
15
+ import com.d4rk.cleaner.utils.PermissionsUtils
25
16
import kotlinx.coroutines.Dispatchers
26
17
import kotlinx.coroutines.flow.MutableStateFlow
27
18
import kotlinx.coroutines.flow.StateFlow
@@ -123,8 +114,8 @@ class HomeViewModel(application: Application) : AndroidViewModel(application) {
123
114
* @param activity The Activity instance required to request permissions.
124
115
*/
125
116
fun analyze (activity : Activity ) {
126
- if (! hasRequiredPermissions( )) {
127
- requestPermissions (activity)
117
+ if (! PermissionsUtils .hasStoragePermissions(getApplication() )) {
118
+ PermissionsUtils .requestStoragePermissions (activity)
128
119
return
129
120
}
130
121
@@ -157,8 +148,8 @@ class HomeViewModel(application: Application) : AndroidViewModel(application) {
157
148
* @param activity The Activity instance required to request permissions.
158
149
*/
159
150
fun clean (activity : Activity ) {
160
- if (! hasRequiredPermissions( )) {
161
- requestPermissions (activity)
151
+ if (! PermissionsUtils .hasStoragePermissions(getApplication() )) {
152
+ PermissionsUtils .requestStoragePermissions (activity)
162
153
return
163
154
}
164
155
@@ -179,126 +170,4 @@ class HomeViewModel(application: Application) : AndroidViewModel(application) {
179
170
}
180
171
}
181
172
}
182
-
183
- /* *
184
- * Checks if the app has all the necessary permissions to perform scanning and cleaning.
185
- *
186
- * @return True if all required permissions are granted, false otherwise.
187
- */
188
- private fun hasRequiredPermissions (): Boolean {
189
- val hasStoragePermissions = when {
190
- Build .VERSION .SDK_INT <= Build .VERSION_CODES .Q ->
191
- ContextCompat .checkSelfPermission(
192
- getApplication(),
193
- Manifest .permission.WRITE_EXTERNAL_STORAGE
194
- ) == PackageManager .PERMISSION_GRANTED
195
-
196
- Build .VERSION .SDK_INT <= Build .VERSION_CODES .S_V2 ->
197
- ContextCompat .checkSelfPermission(
198
- getApplication(),
199
- Manifest .permission.READ_EXTERNAL_STORAGE
200
- ) == PackageManager .PERMISSION_GRANTED
201
-
202
- else -> true
203
- }
204
-
205
- val hasManageStoragePermission = if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .R ) {
206
- Environment .isExternalStorageManager()
207
- } else {
208
- true
209
- }
210
-
211
- val hasUsageStatsPermission = if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .R ) {
212
- isAccessGranted()
213
- } else {
214
- true
215
- }
216
-
217
- val hasMediaPermissions = if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .TIRAMISU ) {
218
- ContextCompat .checkSelfPermission(
219
- getApplication(),
220
- Manifest .permission.READ_MEDIA_AUDIO
221
- ) == PackageManager .PERMISSION_GRANTED && ContextCompat .checkSelfPermission(
222
- getApplication(),
223
- Manifest .permission.READ_MEDIA_IMAGES
224
- ) == PackageManager .PERMISSION_GRANTED && ContextCompat .checkSelfPermission(
225
- getApplication(),
226
- Manifest .permission.READ_MEDIA_VIDEO
227
- ) == PackageManager .PERMISSION_GRANTED
228
- } else {
229
- true
230
- }
231
-
232
- return hasStoragePermissions && hasManageStoragePermission &&
233
- hasUsageStatsPermission && hasMediaPermissions
234
- }
235
-
236
- /* *
237
- * Checks if the app has access to usage statistics.
238
- *
239
- * @return True if access is granted, false otherwise.
240
- */
241
- private fun isAccessGranted (): Boolean = try {
242
- val packageManager = getApplication<Application >().packageManager
243
- val applicationInfo =
244
- packageManager.getApplicationInfo(getApplication<Application >().packageName, 0 )
245
- val appOpsManager =
246
- getApplication<Application >().getSystemService(Context .APP_OPS_SERVICE ) as AppOpsManager
247
- @Suppress(" DEPRECATION" ) val mode: Int = appOpsManager.checkOpNoThrow(
248
- AppOpsManager .OPSTR_GET_USAGE_STATS ,
249
- applicationInfo.uid,
250
- applicationInfo.packageName
251
- )
252
- mode == AppOpsManager .MODE_ALLOWED
253
- } catch (e: PackageManager .NameNotFoundException ) {
254
- false
255
- }
256
-
257
- /* *
258
- * Requests necessary permissions for the app to function correctly.
259
- *
260
- * This function checks for and requests the following permissions:
261
- * - WRITE_EXTERNAL_STORAGE and READ_EXTERNAL_STORAGE: For accessing and managing files.
262
- * - MANAGE_EXTERNAL_STORAGE (Android R and above): For managing all files on external storage.
263
- * - PACKAGE_USAGE_STATS: For gathering app usage statistics.
264
- * - READ_MEDIA_AUDIO, READ_MEDIA_IMAGES, READ_MEDIA_VIDEO (Android Tiramisu and above):
265
- * For accessing media files.
266
- *
267
- * It utilizes ActivityCompat.requestPermissions to initiate the permission request process
268
- * and handles different Android versions to ensure compatibility.
269
- *
270
- * @param activity The Activity instance required to request permissions.
271
- */
272
- private fun requestPermissions (activity : Activity ) {
273
- val requiredPermissions = mutableListOf (
274
- Manifest .permission.WRITE_EXTERNAL_STORAGE ,
275
- Manifest .permission.READ_EXTERNAL_STORAGE
276
- )
277
-
278
- if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .R ) {
279
- if (! Environment .isExternalStorageManager()) {
280
- val intent = Intent (Settings .ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION )
281
- val uri = Uri .fromParts(" package" , getApplication<Application >().packageName, null )
282
- intent.data = uri
283
- activity.startActivity(intent)
284
- }
285
-
286
- if (! isAccessGranted()) {
287
- val intent = Intent (Settings .ACTION_USAGE_ACCESS_SETTINGS )
288
- activity.startActivity(intent)
289
- }
290
- }
291
-
292
- if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .TIRAMISU ) {
293
- requiredPermissions.addAll(
294
- listOf (
295
- Manifest .permission.READ_MEDIA_AUDIO ,
296
- Manifest .permission.READ_MEDIA_IMAGES ,
297
- Manifest .permission.READ_MEDIA_VIDEO
298
- )
299
- )
300
- }
301
-
302
- ActivityCompat .requestPermissions(activity, requiredPermissions.toTypedArray(), 1 )
303
- }
304
173
}
0 commit comments