From 1b9348a17e262393a5d97d4be5da1b6373e71f28 Mon Sep 17 00:00:00 2001 From: Muntashir Al-Islam Date: Mon, 8 Jul 2024 15:14:55 +0600 Subject: [PATCH] [Refactor] Fix delivering changes made via batch operations Signed-off-by: Muntashir Al-Islam --- .../AppManager/backup/BackupFiles.java | 4 +++ .../AppManager/backup/BackupManager.java | 3 +- .../AppManager/backup/BackupOp.java | 5 +-- .../AppManager/backup/BackupUtils.java | 17 +++------- .../AppManager/backup/MetadataManager.java | 2 +- .../backup/convert/OABConverter.java | 3 +- .../backup/convert/SBConverter.java | 3 +- .../backup/convert/TBConverter.java | 3 +- .../AppManager/batchops/BatchOpsService.java | 2 +- .../compat/PackageManagerCompat.java | 13 +++++--- .../AppManager/db/utils/AppDb.java | 32 ++++++++----------- .../details/AppDetailsViewModel.java | 6 ++-- .../types/PackageChangeReceiver.java | 12 +++---- .../AppManager/utils/BroadcastUtils.java | 21 ++++++++++++ .../AppManager/utils/DigestUtils.java | 1 + 15 files changed, 74 insertions(+), 53 deletions(-) diff --git a/app/src/main/java/io/github/muntashirakon/AppManager/backup/BackupFiles.java b/app/src/main/java/io/github/muntashirakon/AppManager/backup/BackupFiles.java index 298370a06ac..03f3269e1d4 100644 --- a/app/src/main/java/io/github/muntashirakon/AppManager/backup/BackupFiles.java +++ b/app/src/main/java/io/github/muntashirakon/AppManager/backup/BackupFiles.java @@ -81,6 +81,8 @@ public static void createNoMediaIfNotExists() throws IOException { } public static class BackupFile { + @NonNull + public final String backupName; @NonNull private final Path mBackupPath; @NonNull @@ -88,6 +90,8 @@ public static class BackupFile { private final boolean mIsTemporary; public BackupFile(@NonNull Path backupPath, boolean hasTemporary) throws IOException { + // For now, backup name is the same as the first path segment + backupName = backupPath.getName(); mBackupPath = backupPath; mIsTemporary = hasTemporary; if (mIsTemporary) { diff --git a/app/src/main/java/io/github/muntashirakon/AppManager/backup/BackupManager.java b/app/src/main/java/io/github/muntashirakon/AppManager/backup/BackupManager.java index 6b3bae22858..9e871f77448 100644 --- a/app/src/main/java/io/github/muntashirakon/AppManager/backup/BackupManager.java +++ b/app/src/main/java/io/github/muntashirakon/AppManager/backup/BackupManager.java @@ -110,7 +110,7 @@ private String[] getProcessedBackupNames(@Nullable String[] backupNames) { // Multiple backups requested if (backupNames == null) { // Create a singleton backupNames array with current time - backupNames = new String[]{DateUtils.formatDateTime(System.currentTimeMillis())}; + backupNames = new String[]{DateUtils.formatMediumDateTime(System.currentTimeMillis())}; } for (int i = 0; i < backupNames.length; ++i) { // Replace illegal characters @@ -175,7 +175,6 @@ public void restore(@Nullable String[] backupNames) throws BackupException { targetPackage.getUserHandle())) { restoreOp.runRestore(); requiresRestart |= restoreOp.requiresRestart(); - BackupUtils.putBackupToDbAndBroadcast(ContextUtils.getContext(), restoreOp.getMetadata()); } } else { Log.w(RestoreOp.TAG, "No backups found."); diff --git a/app/src/main/java/io/github/muntashirakon/AppManager/backup/BackupOp.java b/app/src/main/java/io/github/muntashirakon/AppManager/backup/BackupOp.java index ffdcf0b43da..12dbf8aeb7b 100644 --- a/app/src/main/java/io/github/muntashirakon/AppManager/backup/BackupOp.java +++ b/app/src/main/java/io/github/muntashirakon/AppManager/backup/BackupOp.java @@ -121,6 +121,7 @@ class BackupOp implements Closeable { this.mApplicationInfo = mPackageInfo.applicationInfo; // Override existing metadata this.mMetadata = this.mMetadataManager.setupMetadata(mPackageInfo, userId, backupFlags); + mMetadata.backupName = backupFile.backupName; } catch (Exception e) { this.mBackupFile.cleanup(); throw new BackupException("Failed to setup metadata.", e); @@ -284,7 +285,7 @@ private void backupData() throws BackupException { try { dataFiles = TarUtils.create(mMetadata.tarType, Paths.get(mMetadata.dataDirs[i]), mTempBackupPath, sourceBackupFilePrefix, null, null, - BackupUtils.getExcludeDirs(!mBackupFlags.backupCache(), null), false) + BackupUtils.getExcludeDirs(!mBackupFlags.backupCache()), false) .toArray(new Path[0]); } catch (Throwable th) { throw new BackupException("Failed to backup data directory at " + mMetadata.dataDirs[i], th); @@ -324,7 +325,7 @@ private void backupKeyStore() throws BackupException { // Called only when the throw new BackupException("Could not cache " + keyStoreFileName, e); } } - if (cachedKeyStoreFileNames.size() == 0) { + if (cachedKeyStoreFileNames.isEmpty()) { throw new BackupException("There were some KeyStore items but they couldn't be cached before taking a backup."); } String keyStorePrefix = KEYSTORE_PREFIX + getExt(mMetadata.tarType); diff --git a/app/src/main/java/io/github/muntashirakon/AppManager/backup/BackupUtils.java b/app/src/main/java/io/github/muntashirakon/AppManager/backup/BackupUtils.java index f716c3aa46d..be6a5f3b15d 100644 --- a/app/src/main/java/io/github/muntashirakon/AppManager/backup/BackupUtils.java +++ b/app/src/main/java/io/github/muntashirakon/AppManager/backup/BackupUtils.java @@ -5,7 +5,6 @@ import android.annotation.SuppressLint; import android.annotation.UserIdInt; import android.content.Context; -import android.content.Intent; import android.content.pm.ApplicationInfo; import android.os.Build; import android.os.UserHandleHidden; @@ -29,8 +28,8 @@ import io.github.muntashirakon.AppManager.logcat.helper.SaveLogHelper; import io.github.muntashirakon.AppManager.logs.Log; import io.github.muntashirakon.AppManager.misc.OsEnvironment; -import io.github.muntashirakon.AppManager.types.PackageChangeReceiver; import io.github.muntashirakon.AppManager.users.Users; +import io.github.muntashirakon.AppManager.utils.BroadcastUtils; import io.github.muntashirakon.AppManager.utils.Utils; import io.github.muntashirakon.io.Path; import io.github.muntashirakon.io.Paths; @@ -80,7 +79,7 @@ public static HashMap storeAllAndGetLatestBackupMetadata() { HashMap> allBackupMetadata = getAllMetadata(); List backups = new ArrayList<>(); for (List metadataList : allBackupMetadata.values()) { - if (metadataList.size() == 0) continue; + if (metadataList.isEmpty()) continue; Backup latestBackup = null; Backup backup; for (MetadataManager.Metadata metadata : metadataList) { @@ -117,20 +116,14 @@ public static void putBackupToDbAndBroadcast(@NonNull Context context, @NonNull AppDb appDb = new AppDb(); appDb.insert(Backup.fromBackupMetadata(metadata)); appDb.updateApplication(context, metadata.packageName); - Intent intent = new Intent(PackageChangeReceiver.ACTION_DB_PACKAGE_ALTERED); - intent.setPackage(context.getPackageName()); - intent.putExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST, new String[]{metadata.packageName}); - context.sendBroadcast(intent); + BroadcastUtils.sendDbPackageAltered(context, new String[]{metadata.packageName}); } public static void deleteBackupToDbAndBroadcast(@NonNull Context context, @NonNull MetadataManager.Metadata metadata) { AppDb appDb = new AppDb(); appDb.deleteBackup(Backup.fromBackupMetadata(metadata)); appDb.updateApplication(context, metadata.packageName); - Intent intent = new Intent(PackageChangeReceiver.ACTION_DB_PACKAGE_REMOVED); - intent.setPackage(context.getPackageName()); - intent.putExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST, new String[]{metadata.packageName}); - context.sendBroadcast(intent); + BroadcastUtils.sendDbPackageAltered(context, new String[]{metadata.packageName}); } @WorkerThread @@ -223,7 +216,7 @@ static int getUserHandleFromBackupName(@NonNull String backupFileName) { } @NonNull - static String[] getExcludeDirs(boolean includeCache, @Nullable String[] others) { + static String[] getExcludeDirs(boolean includeCache, @Nullable String ...others) { // Lib dirs has to be ignored by default List excludeDirs = new ArrayList<>(Arrays.asList(BackupManager.LIB_DIR)); if (includeCache) { diff --git a/app/src/main/java/io/github/muntashirakon/AppManager/backup/MetadataManager.java b/app/src/main/java/io/github/muntashirakon/AppManager/backup/MetadataManager.java index 15d90147cd8..dbf03cdcaf7 100644 --- a/app/src/main/java/io/github/muntashirakon/AppManager/backup/MetadataManager.java +++ b/app/src/main/java/io/github/muntashirakon/AppManager/backup/MetadataManager.java @@ -236,7 +236,7 @@ synchronized public void readMetadata(@NonNull BackupFiles.BackupFile backupFile JSONObject rootObject = new JSONObject(metadata); mMetadata = new Metadata(); mMetadata.backupFile = backupFile; - mMetadata.backupName = backupFile.getBackupPath().getName(); + mMetadata.backupName = backupFile.backupName; mMetadata.label = rootObject.getString("label"); mMetadata.packageName = rootObject.getString("package_name"); mMetadata.versionName = rootObject.getString("version_name"); diff --git a/app/src/main/java/io/github/muntashirakon/AppManager/backup/convert/OABConverter.java b/app/src/main/java/io/github/muntashirakon/AppManager/backup/convert/OABConverter.java index 0cefb7a41ce..ff2bf1a95ba 100644 --- a/app/src/main/java/io/github/muntashirakon/AppManager/backup/convert/OABConverter.java +++ b/app/src/main/java/io/github/muntashirakon/AppManager/backup/convert/OABConverter.java @@ -134,6 +134,7 @@ public void convert() throws BackupException { try { mTempBackupPath = backupFile.getBackupPath(); mCrypto = ConvertUtils.setupCrypto(mDestMetadata); + mDestMetadata.backupName = backupFile.backupName; try { mChecksum = backupFile.getChecksum(CryptoUtils.MODE_NO_ENCRYPTION); } catch (IOException e) { @@ -373,7 +374,7 @@ private void backupData() throws BackupException { } } String fileName = zipEntry.getName().replaceFirst(mPackageName + "/", ""); - if (fileName.equals("")) continue; + if (fileName.isEmpty()) continue; // New tar entry TarArchiveEntry tarArchiveEntry = new TarArchiveEntry(fileName); if (tmpFile != null) { diff --git a/app/src/main/java/io/github/muntashirakon/AppManager/backup/convert/SBConverter.java b/app/src/main/java/io/github/muntashirakon/AppManager/backup/convert/SBConverter.java index ac8c19f81ec..6e3b599b981 100644 --- a/app/src/main/java/io/github/muntashirakon/AppManager/backup/convert/SBConverter.java +++ b/app/src/main/java/io/github/muntashirakon/AppManager/backup/convert/SBConverter.java @@ -124,6 +124,7 @@ public void convert() throws BackupException { try { mTempBackupPath = backupFile.getBackupPath(); mCrypto = ConvertUtils.setupCrypto(mDestMetadata); + mDestMetadata.backupName = backupFile.backupName; try { mChecksum = backupFile.getChecksum(CryptoUtils.MODE_NO_ENCRYPTION); } catch (IOException e) { @@ -268,7 +269,7 @@ private void backupData() throws BackupException { } } String fileName = zipEntry.getName().replaceFirst(mPackageName + "/", ""); - if (fileName.equals("")) continue; + if (fileName.isEmpty()) continue; // New tar entry TarArchiveEntry tarArchiveEntry = new TarArchiveEntry(fileName); if (tmpFile != null) { diff --git a/app/src/main/java/io/github/muntashirakon/AppManager/backup/convert/TBConverter.java b/app/src/main/java/io/github/muntashirakon/AppManager/backup/convert/TBConverter.java index cc04436357e..c57a6f57f6f 100644 --- a/app/src/main/java/io/github/muntashirakon/AppManager/backup/convert/TBConverter.java +++ b/app/src/main/java/io/github/muntashirakon/AppManager/backup/convert/TBConverter.java @@ -136,6 +136,7 @@ public void convert() throws BackupException { try { mTempBackupPath = backupFile.getBackupPath(); mCrypto = ConvertUtils.setupCrypto(mDestMetadata); + mDestMetadata.backupName = backupFile.backupName; try { mChecksum = backupFile.getChecksum(CryptoUtils.MODE_NO_ENCRYPTION); } catch (IOException e) { @@ -331,7 +332,7 @@ private void backupData() throws BackupException { boolean isExternal = fileName.startsWith(EXTERNAL_PREFIX); // Get new file name fileName = fileName.replaceFirst((isExternal ? EXTERNAL_PREFIX : INTERNAL_PREFIX) + mPackageName + "/\\./", ""); - if (fileName.equals("")) continue; + if (fileName.isEmpty()) continue; // New tar entry TarArchiveEntry outTarEntry = new TarArchiveEntry(fileName); outTarEntry.setMode(inTarEntry.getMode()); diff --git a/app/src/main/java/io/github/muntashirakon/AppManager/batchops/BatchOpsService.java b/app/src/main/java/io/github/muntashirakon/AppManager/batchops/BatchOpsService.java index 432900a84e5..e807e644e7b 100644 --- a/app/src/main/java/io/github/muntashirakon/AppManager/batchops/BatchOpsService.java +++ b/app/src/main/java/io/github/muntashirakon/AppManager/batchops/BatchOpsService.java @@ -263,7 +263,7 @@ private void sendResults(int result, @Nullable BatchOpsManager.Result opResult) Intent broadcastIntent = new Intent(ACTION_BATCH_OPS_COMPLETED); broadcastIntent.putExtra(EXTRA_OP, op); broadcastIntent.putExtra(EXTRA_OP_PKG, packages != null ? packages.toArray(new String[0]) : new String[0]); - broadcastIntent.putExtra(EXTRA_FAILED_PKG, opResult != null ? opResult.getFailedPackages().toArray(new String[0]) : new String[0]); + broadcastIntent.putStringArrayListExtra(EXTRA_FAILED_PKG, opResult != null ? opResult.getFailedPackages() : null); sendBroadcast(broadcastIntent); sendNotification(result, opResult); } diff --git a/app/src/main/java/io/github/muntashirakon/AppManager/compat/PackageManagerCompat.java b/app/src/main/java/io/github/muntashirakon/AppManager/compat/PackageManagerCompat.java index d84d7a1bced..772950b7d22 100644 --- a/app/src/main/java/io/github/muntashirakon/AppManager/compat/PackageManagerCompat.java +++ b/app/src/main/java/io/github/muntashirakon/AppManager/compat/PackageManagerCompat.java @@ -378,13 +378,16 @@ public static boolean isPackageHidden(String packageName, @UserIdInt int userId) public static int installExistingPackageAsUser(@NonNull String packageName, @UserIdInt int userId, int installFlags, int installReason, @Nullable List whiteListedPermissions) throws RemoteException { + int returnCode; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { - return getPackageManager().installExistingPackageAsUser(packageName, userId, installFlags, installReason, whiteListedPermissions); - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - return getPackageManager().installExistingPackageAsUser(packageName, userId, installFlags, installReason); + returnCode = getPackageManager().installExistingPackageAsUser(packageName, userId, installFlags, installReason, whiteListedPermissions); + } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + returnCode = getPackageManager().installExistingPackageAsUser(packageName, userId, installFlags, installReason); + } else returnCode = getPackageManager().installExistingPackageAsUser(packageName, userId); + if (userId != UserHandleHidden.myUserId()) { + BroadcastUtils.sendPackageAdded(ContextUtils.getContext(), new String[]{packageName}); } - return getPackageManager().installExistingPackageAsUser(packageName, userId); + return returnCode; } public static void clearApplicationUserData(@NonNull UserPackagePair pair) throws AndroidException { diff --git a/app/src/main/java/io/github/muntashirakon/AppManager/db/utils/AppDb.java b/app/src/main/java/io/github/muntashirakon/AppManager/db/utils/AppDb.java index e59bfe2ea54..87c92e65a65 100644 --- a/app/src/main/java/io/github/muntashirakon/AppManager/db/utils/AppDb.java +++ b/app/src/main/java/io/github/muntashirakon/AppManager/db/utils/AppDb.java @@ -8,7 +8,6 @@ import android.annotation.UserIdInt; import android.content.Context; -import android.content.Intent; import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; @@ -39,13 +38,13 @@ import io.github.muntashirakon.AppManager.logs.Log; import io.github.muntashirakon.AppManager.rules.compontents.ComponentsBlocker; import io.github.muntashirakon.AppManager.ssaid.SsaidSettings; -import io.github.muntashirakon.AppManager.types.PackageChangeReceiver; import io.github.muntashirakon.AppManager.types.PackageSizeInfo; import io.github.muntashirakon.AppManager.uri.UriManager; import io.github.muntashirakon.AppManager.usage.AppUsageStatsManager; import io.github.muntashirakon.AppManager.usage.PackageUsageInfo; import io.github.muntashirakon.AppManager.usage.UsageUtils; import io.github.muntashirakon.AppManager.users.Users; +import io.github.muntashirakon.AppManager.utils.BroadcastUtils; import io.github.muntashirakon.AppManager.utils.KeyStoreUtils; import io.github.muntashirakon.AppManager.utils.PackageUtils; import io.github.muntashirakon.AppManager.utils.TextUtilsCompat; @@ -81,6 +80,12 @@ public List getAllApplications(String packageName) { } } + public List getAllApplications(String packageName, @UserIdInt int userId) { + synchronized (sLock) { + return appDao.getAll(packageName, userId); + } + } + public List getAllBackups() { synchronized (sLock) { return backupDao.getAll(); @@ -314,26 +319,17 @@ public void updateApplications(@NonNull Context context) { // Add new data appDao.delete(oldApps); appDao.insert(modifiedApps); - if (oldApps.size() > 0) { + if (!oldApps.isEmpty()) { // Delete broadcast - Intent intent = new Intent(PackageChangeReceiver.ACTION_DB_PACKAGE_REMOVED); - intent.setPackage(context.getPackageName()); - intent.putExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST, getPackageNamesFromApps(oldApps)); - context.sendBroadcast(intent); + BroadcastUtils.sendDbPackageRemoved(context, getPackageNamesFromApps(oldApps)); } - if (newApps.size() > 0) { + if (!newApps.isEmpty()) { // New apps - Intent intent = new Intent(PackageChangeReceiver.ACTION_DB_PACKAGE_ADDED); - intent.setPackage(context.getPackageName()); - intent.putExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST, newApps.toArray(new String[0])); - context.sendBroadcast(intent); + BroadcastUtils.sendDbPackageAdded(context, newApps.toArray(new String[0])); } - if (updatedApps.size() > 0) { + if (!updatedApps.isEmpty()) { // Altered apps - Intent intent = new Intent(PackageChangeReceiver.ACTION_DB_PACKAGE_ALTERED); - intent.setPackage(context.getPackageName()); - intent.putExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST, updatedApps.toArray(new String[0])); - context.sendBroadcast(intent); + BroadcastUtils.sendDbPackageAltered(context, updatedApps.toArray(new String[0])); } } } @@ -366,7 +362,7 @@ private static void updateVariableData(@NonNull Context context, @NonNull List= AppOpsManagerCompat._NUM_OP || opToOpEntryMap.get(op) != null) { - // Unsupported app operation + if (op == AppOpsManagerCompat.OP_NONE + || op >= AppOpsManagerCompat._NUM_OP + || opToOpEntryMap.get(op) != null) { + // Invalid/unsupported app operation continue; } otherOps.add(op); diff --git a/app/src/main/java/io/github/muntashirakon/AppManager/types/PackageChangeReceiver.java b/app/src/main/java/io/github/muntashirakon/AppManager/types/PackageChangeReceiver.java index 625c424443e..dfe6e4c316f 100644 --- a/app/src/main/java/io/github/muntashirakon/AppManager/types/PackageChangeReceiver.java +++ b/app/src/main/java/io/github/muntashirakon/AppManager/types/PackageChangeReceiver.java @@ -2,6 +2,8 @@ package io.github.muntashirakon.AppManager.types; +import static io.github.muntashirakon.AppManager.batchops.BatchOpsService.ACTION_BATCH_OPS_COMPLETED; + import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; @@ -20,7 +22,6 @@ import androidx.annotation.WorkerThread; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Objects; @@ -28,8 +29,6 @@ import io.github.muntashirakon.AppManager.batchops.BatchOpsManager; import io.github.muntashirakon.AppManager.batchops.BatchOpsService; -import static io.github.muntashirakon.AppManager.batchops.BatchOpsService.ACTION_BATCH_OPS_COMPLETED; - public abstract class PackageChangeReceiver extends BroadcastReceiver { /** * Specifies that some packages have been altered. This could be due to batch operations, database update, etc. @@ -150,14 +149,13 @@ public void handleMessage(@NonNull Message msg) { if (op != BatchOpsManager.OP_NONE && op != BatchOpsManager.OP_FREEZE && op != BatchOpsManager.OP_UNFREEZE && op != BatchOpsManager.OP_UNINSTALL) { String[] packages = intent.getStringArrayExtra(BatchOpsService.EXTRA_OP_PKG); - String[] failedPackages = intent.getStringArrayExtra(BatchOpsService.EXTRA_FAILED_PKG); + ArrayList failedPackages = intent.getStringArrayListExtra(BatchOpsService.EXTRA_FAILED_PKG); if (packages != null && failedPackages != null) { List packageList = new ArrayList<>(); - List failedPackageList = Arrays.asList(failedPackages); for (String packageName : packages) { - if (!failedPackageList.contains(packageName)) packageList.add(packageName); + if (!failedPackages.contains(packageName)) packageList.add(packageName); } - if (packageList.size() > 0) { + if (!packageList.isEmpty()) { onPackageChanged(intent, null, packageList.toArray(new String[0])); } } diff --git a/app/src/main/java/io/github/muntashirakon/AppManager/utils/BroadcastUtils.java b/app/src/main/java/io/github/muntashirakon/AppManager/utils/BroadcastUtils.java index 8231df04572..4fe4715e58b 100644 --- a/app/src/main/java/io/github/muntashirakon/AppManager/utils/BroadcastUtils.java +++ b/app/src/main/java/io/github/muntashirakon/AppManager/utils/BroadcastUtils.java @@ -30,4 +30,25 @@ public static void sendPackageRemoved(@NonNull Context context, String[] package intent.putExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST, packageNames); context.sendBroadcast(intent); } + + public static void sendDbPackageAdded(@NonNull Context context, String[] packageNames) { + Intent intent = new Intent(PackageChangeReceiver.ACTION_DB_PACKAGE_ADDED); + intent.setPackage(context.getPackageName()); + intent.putExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST, packageNames); + context.sendBroadcast(intent); + } + + public static void sendDbPackageAltered(@NonNull Context context, String[] packageNames) { + Intent intent = new Intent(PackageChangeReceiver.ACTION_DB_PACKAGE_ALTERED); + intent.setPackage(context.getPackageName()); + intent.putExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST, packageNames); + context.sendBroadcast(intent); + } + + public static void sendDbPackageRemoved(@NonNull Context context, String[] packageNames) { + Intent intent = new Intent(PackageChangeReceiver.ACTION_DB_PACKAGE_REMOVED); + intent.setPackage(context.getPackageName()); + intent.putExtra(Intent.EXTRA_CHANGED_PACKAGE_LIST, packageNames); + context.sendBroadcast(intent); + } } diff --git a/app/src/main/java/io/github/muntashirakon/AppManager/utils/DigestUtils.java b/app/src/main/java/io/github/muntashirakon/AppManager/utils/DigestUtils.java index cedb6cad006..2734e9f2fd0 100644 --- a/app/src/main/java/io/github/muntashirakon/AppManager/utils/DigestUtils.java +++ b/app/src/main/java/io/github/muntashirakon/AppManager/utils/DigestUtils.java @@ -65,6 +65,7 @@ public static String getHexDigest(@Algorithm String algo, @NonNull Path path) { List allFiles = Paths.getAll(path); List hashes = new ArrayList<>(allFiles.size()); for (Path file : allFiles) { + if (file.isDirectory()) continue; try (InputStream fileInputStream = file.openInputStream()) { hashes.add(DigestUtils.getHexDigest(algo, fileInputStream)); } catch (IOException e) {