Skip to content

Commit

Permalink
[Refactor] Fix delivering changes made via batch operations
Browse files Browse the repository at this point in the history
Signed-off-by: Muntashir Al-Islam <muntashirakon@riseup.net>
  • Loading branch information
MuntashirAkon committed Jul 10, 2024
1 parent f65837c commit 1b9348a
Show file tree
Hide file tree
Showing 15 changed files with 74 additions and 53 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -81,13 +81,17 @@ public static void createNoMediaIfNotExists() throws IOException {
}

public static class BackupFile {
@NonNull
public final String backupName;
@NonNull
private final Path mBackupPath;
@NonNull
private final Path mTempBackupPath;
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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -80,7 +79,7 @@ public static HashMap<String, Backup> storeAllAndGetLatestBackupMetadata() {
HashMap<String, List<MetadataManager.Metadata>> allBackupMetadata = getAllMetadata();
List<Backup> backups = new ArrayList<>();
for (List<MetadataManager.Metadata> metadataList : allBackupMetadata.values()) {
if (metadataList.size() == 0) continue;
if (metadataList.isEmpty()) continue;
Backup latestBackup = null;
Backup backup;
for (MetadataManager.Metadata metadata : metadataList) {
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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<String> excludeDirs = new ArrayList<>(Arrays.asList(BackupManager.LIB_DIR));
if (includeCache) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<String> 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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -81,6 +80,12 @@ public List<App> getAllApplications(String packageName) {
}
}

public List<App> getAllApplications(String packageName, @UserIdInt int userId) {
synchronized (sLock) {
return appDao.getAll(packageName, userId);
}
}

public List<Backup> getAllBackups() {
synchronized (sLock) {
return backupDao.getAll();
Expand Down Expand Up @@ -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]));
}
}
}
Expand Down Expand Up @@ -366,7 +362,7 @@ private static void updateVariableData(@NonNull Context context, @NonNull List<A
try {
userIdSsaidSettingsMap.put(userId, new SsaidSettings(userId));
} catch (IOException e) {
e.printStackTrace();
Log.w(TAG, "Error: " + e.getMessage());
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1367,8 +1367,10 @@ private void loadAppOps() {
// Include defaults i.e. app ops without any associated permissions if requested
if (Prefs.AppDetailsPage.displayDefaultAppOps()) {
for (int op : AppOpsManagerCompat.getOpsWithoutPermissions()) {
if (op >= 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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -20,16 +22,13 @@
import androidx.annotation.WorkerThread;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;

import io.github.muntashirakon.AppManager.BuildConfig;
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.
Expand Down Expand Up @@ -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<String> failedPackages = intent.getStringArrayListExtra(BatchOpsService.EXTRA_FAILED_PKG);
if (packages != null && failedPackages != null) {
List<String> packageList = new ArrayList<>();
List<String> 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]));
}
}
Expand Down
Loading

0 comments on commit 1b9348a

Please sign in to comment.