1
1
package com.xayah.core.data.repository
2
2
3
- import android.annotation.SuppressLint
4
3
import android.content.Context
5
- import android.content.pm.ApplicationInfo
6
- import android.content.pm.PackageManager
7
4
import android.os.Build
8
- import android.os.UserHandle
9
5
import com.xayah.core.data.util.srcDir
10
6
import com.xayah.core.database.dao.PackageDao
11
- import com.xayah.core.datastore.readCheckKeystore
12
7
import com.xayah.core.datastore.readCompressionType
13
- import com.xayah.core.datastore.readCustomSUFile
14
- import com.xayah.core.datastore.readIconUpdateTime
15
- import com.xayah.core.datastore.readLoadSystemApps
16
8
import com.xayah.core.datastore.readReloadDumpApk
17
- import com.xayah.core.datastore.saveIconUpdateTime
18
9
import com.xayah.core.model.CompressionType
19
10
import com.xayah.core.model.DataState
20
11
import com.xayah.core.model.DataType
21
- import com.xayah.core.model.DefaultPreserveId
22
12
import com.xayah.core.model.OpType
23
13
import com.xayah.core.model.SortType
24
14
import com.xayah.core.model.database.MediaEntity
@@ -38,7 +28,6 @@ import com.xayah.core.util.DateUtil
38
28
import com.xayah.core.util.LogUtil
39
29
import com.xayah.core.util.PathUtil
40
30
import com.xayah.core.util.command.BaseUtil
41
- import com.xayah.core.util.command.PackageUtil
42
31
import com.xayah.core.util.command.Tar
43
32
import com.xayah.core.util.iconDir
44
33
import com.xayah.core.util.localBackupSaveDir
@@ -79,19 +68,10 @@ class PackageRepository @Inject constructor(
79
68
80
69
fun getArchiveDst (dstDir : String , dataType : DataType , ct : CompressionType ) = " ${dstDir} /${dataType.type} .${ct.suffix} "
81
70
82
- private suspend fun getPackage (packageName : String , opType : OpType , userId : Int , preserveId : Long , cloud : String , backupDir : String ) =
83
- packageDao.query(packageName, opType, userId, preserveId, cloud, backupDir)
84
-
85
- private suspend fun getInstalledPackages (userId : Int ) = rootService.getInstalledPackagesAsUser(PackageManager .GET_PERMISSIONS , userId).filter {
86
- // Filter itself
87
- it.packageName != context.packageName
88
- }
89
-
90
71
fun getKeyPredicateNew (key : String ): (PackageEntity ) -> Boolean = { p ->
91
72
p.packageInfo.label.lowercase().contains(key.lowercase()) || p.packageName.lowercase().contains(key.lowercase())
92
73
}
93
74
94
-
95
75
fun getShowSystemAppsPredicate (value : Boolean ): (PackageEntity ) -> Boolean = { p ->
96
76
value || p.isSystemApp.not ()
97
77
}
@@ -162,121 +142,6 @@ class PackageRepository @Inject constructor(
162
142
else -> sortByAlphabetNew(sortType)
163
143
}
164
144
165
- private suspend fun handlePackage (
166
- pm : PackageManager ,
167
- info : android.content.pm.PackageInfo ,
168
- checkKeystore : Boolean , userId : Int ,
169
- userHandle : UserHandle ? ,
170
- hasPassedOneDay : Boolean
171
- ): PackageEntity {
172
- val permissions = rootService.getPermissions(packageInfo = info)
173
- val uid = info.applicationInfo?.uid ? : - 1
174
- val hasKeystore = if (checkKeystore) PackageUtil .hasKeystore(context.readCustomSUFile().first(), uid) else false
175
- val ssaid = rootService.getPackageSsaidAsUser(packageName = info.packageName, uid = uid, userId = userId)
176
- val iconPath = pathUtil.getPackageIconPath(info.packageName, false )
177
- val iconExists = rootService.exists(iconPath)
178
- if (iconExists.not () || (iconExists && hasPassedOneDay)) {
179
- runCatching {
180
- val icon = info.applicationInfo!! .loadIcon(pm)
181
- BaseUtil .writeIcon(icon = icon, dst = iconPath)
182
- }.withLog()
183
- }
184
- val packageInfo = PackageInfo (
185
- label = info.applicationInfo?.loadLabel(pm).toString(),
186
- versionName = info.versionName ? : " " ,
187
- versionCode = if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .P ) {
188
- info.longVersionCode
189
- } else {
190
- info.versionCode.toLong()
191
- },
192
- flags = info.applicationInfo?.flags ? : 0 ,
193
- firstInstallTime = info.firstInstallTime,
194
- )
195
- val extraInfo = PackageExtraInfo (
196
- uid = uid,
197
- hasKeystore = hasKeystore,
198
- permissions = permissions,
199
- ssaid = ssaid,
200
- blocked = false ,
201
- activated = false ,
202
- firstUpdated = true ,
203
- enabled = true ,
204
- )
205
- val indexInfo = PackageIndexInfo (
206
- opType = OpType .BACKUP ,
207
- packageName = info.packageName,
208
- userId = userId,
209
- compressionType = context.readCompressionType().first(),
210
- preserveId = DefaultPreserveId ,
211
- cloud = " " ,
212
- backupDir = " "
213
- )
214
- val packageEntity =
215
- getPackage(packageName = info.packageName, opType = OpType .BACKUP , userId = userId, preserveId = DefaultPreserveId , cloud = " " , backupDir = " " )
216
- ? : PackageEntity (
217
- id = 0 ,
218
- indexInfo = indexInfo,
219
- packageInfo = packageInfo,
220
- extraInfo = extraInfo,
221
- dataStates = PackageDataStates (),
222
- storageStats = PackageStorageStats (),
223
- dataStats = PackageDataStats (),
224
- displayStats = PackageDataStats (),
225
- )
226
- // Update if exists.
227
- packageEntity.apply {
228
- this .packageInfo = packageInfo
229
- this .extraInfo.uid = uid
230
- this .extraInfo.hasKeystore = hasKeystore
231
- this .extraInfo.permissions = permissions
232
- this .extraInfo.ssaid = ssaid
233
- }
234
- if (userHandle != null ) {
235
- rootService.queryStatsForPackage(info, userHandle).also { stats ->
236
- if (stats != null ) {
237
- packageEntity.apply {
238
- this .storageStats.appBytes = stats.appBytes
239
- this .storageStats.cacheBytes = stats.cacheBytes
240
- this .storageStats.dataBytes = stats.dataBytes
241
- this .storageStats.externalCacheBytes = stats.externalCacheBytes
242
- }
243
- }
244
- }
245
- }
246
- return packageEntity
247
- }
248
-
249
- @SuppressLint(" StringFormatInvalid" )
250
- suspend fun refresh () = run {
251
- val checkKeystore = context.readCheckKeystore().first()
252
- val loadSystemApps = context.readLoadSystemApps().first()
253
- val pm = context.packageManager
254
- val userInfoList = rootService.getUsers()
255
- for (userInfo in userInfoList) {
256
- val userId = userInfo.id
257
- val userHandle = rootService.getUserHandle(userId)
258
- val installedPackages = getInstalledPackages(userId)
259
- val installedPackagesCount = (installedPackages.size - 1 ).coerceAtLeast(1 )
260
-
261
- // Get 1/10 of total count.
262
- val epoch: Int = ((installedPackagesCount + 1 ) / 10 ).coerceAtLeast(1 )
263
-
264
- // Update packages' info.
265
- BaseUtil .mkdirs(context.iconDir())
266
- val iconUpdateTime = context.readIconUpdateTime().first()
267
- val now = DateUtil .getTimestamp()
268
- val hasPassedOneDay = DateUtil .getNumberOfDaysPassed(iconUpdateTime, now) >= 1
269
- if (hasPassedOneDay) context.saveIconUpdateTime(now)
270
- installedPackages.forEachIndexed { index, info ->
271
- val isSystemApp = ((info.applicationInfo?.flags ? : 0 ) and ApplicationInfo .FLAG_SYSTEM ) != 0
272
- if (loadSystemApps || isSystemApp.not ()) {
273
- val packageEntity = handlePackage(pm, info, checkKeystore, userId, userHandle, hasPassedOneDay)
274
- upsert(packageEntity)
275
- }
276
- }
277
- }
278
- }
279
-
280
145
fun getDataSrcDir (dataType : DataType , userId : Int ) = dataType.srcDir(userId)
281
146
282
147
fun getDataSrc (srcDir : String , packageName : String ) = " $srcDir /$packageName "
@@ -736,12 +601,14 @@ class PackageRepository @Inject constructor(
736
601
versionCode = 0 ,
737
602
flags = 0 ,
738
603
firstInstallTime = 0 ,
604
+ lastUpdateTime = 0 ,
739
605
),
740
606
extraInfo = PackageExtraInfo (
741
607
uid = - 1 ,
742
608
hasKeystore = false ,
743
609
permissions = listOf (),
744
610
ssaid = " " ,
611
+ lastBackupTime = 0 ,
745
612
blocked = false ,
746
613
activated = false ,
747
614
firstUpdated = true ,
@@ -936,6 +803,7 @@ class PackageRepository @Inject constructor(
936
803
displayBytes = 0L ,
937
804
),
938
805
extraInfo = MediaExtraInfo (
806
+ lastBackupTime = 0L ,
939
807
blocked = false ,
940
808
activated = false ,
941
809
existed = true ,
@@ -1075,12 +943,14 @@ class PackageRepository @Inject constructor(
1075
943
versionCode = 0 ,
1076
944
flags = 0 ,
1077
945
firstInstallTime = 0 ,
946
+ lastUpdateTime = 0 ,
1078
947
),
1079
948
extraInfo = PackageExtraInfo (
1080
949
uid = - 1 ,
1081
950
hasKeystore = false ,
1082
951
permissions = listOf (),
1083
952
ssaid = " " ,
953
+ lastBackupTime = 0 ,
1084
954
blocked = false ,
1085
955
activated = false ,
1086
956
firstUpdated = true ,
@@ -1291,6 +1161,7 @@ class PackageRepository @Inject constructor(
1291
1161
displayBytes = 0L ,
1292
1162
),
1293
1163
extraInfo = MediaExtraInfo (
1164
+ lastBackupTime = 0L ,
1294
1165
blocked = false ,
1295
1166
activated = false ,
1296
1167
existed = true ,
0 commit comments