Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Objects;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

Expand Down Expand Up @@ -119,6 +120,8 @@
import io.github.muntashirakon.AppManager.logs.Log;
import io.github.muntashirakon.AppManager.magisk.MagiskDenyList;
import io.github.muntashirakon.AppManager.magisk.MagiskHide;
import io.github.muntashirakon.AppManager.magisk.MagiskModule;
import io.github.muntashirakon.AppManager.magisk.MagiskModuleInfo;
import io.github.muntashirakon.AppManager.magisk.MagiskProcess;
import io.github.muntashirakon.AppManager.profiles.ProfileManager;
import io.github.muntashirakon.AppManager.profiles.ProfileMetaManager;
Expand All @@ -129,6 +132,7 @@
import io.github.muntashirakon.AppManager.scanner.ScannerActivity;
import io.github.muntashirakon.AppManager.settings.FeatureController;
import io.github.muntashirakon.AppManager.settings.Ops;
import io.github.muntashirakon.AppManager.settings.Prefs;
import io.github.muntashirakon.AppManager.sharedpref.SharedPrefsActivity;
import io.github.muntashirakon.AppManager.ssaid.ChangeSsaidDialog;
import io.github.muntashirakon.AppManager.types.PackageSizeInfo;
Expand Down Expand Up @@ -648,8 +652,20 @@ private void setupTagCloud(AppInfoViewModel.TagCloud tagCloud) {
});
}
if (tagCloud.isSystemApp) {
if (tagCloud.isSystemlessPath) {
addChip(R.string.systemless_app);
if (tagCloud.systemlessPathInfo != null) {
addChip(R.string.systemless_app).setOnClickListener(v -> {
MagiskModuleInfo moduleInfo = tagCloud.systemlessPathInfo;
ScrollableDialogBuilder dialogBuilder = new ScrollableDialogBuilder(mActivity)
.setTitle(R.string.magisk_module_info_title)
.setMessage(moduleInfo.toLocalizedString(mActivity))
.setNegativeButton(R.string.close, null);
if (Objects.equals(moduleInfo.id, MagiskModule.MODULE_NAME)) {
// This is App Manager module, offer to uninstall the app
dialogBuilder.setNeutralButton(R.string.uninstall, (dialog, which, isChecked) ->
doUninstallSystemlessAppWithAPrompt());
}
dialogBuilder.show();
});
} else addChip(R.string.system_app);
if (tagCloud.isUpdatedSystemApp) {
addChip(R.string.updated_app);
Expand Down Expand Up @@ -835,6 +851,45 @@ private void setupTagCloud(AppInfoViewModel.TagCloud tagCloud) {
}
}

private void doUninstallSystemlessAppWithAPrompt() {
new ScrollableDialogBuilder(mActivity, R.string.uninstall_app_message)
.setTitle(mPackageLabel)
.setPositiveButton(R.string.uninstall, (dialog, which, keepData) ->
doUninstallSystemless(keepData))
.setNegativeButton(R.string.cancel, null)
.show();
}

private void doUninstallSystemless(boolean keepData) {
executor.submit(() -> {
boolean uninstalled = false;
String destPath = PackageUtils.getHiddenCodePathOrDefault(mApplicationInfo);
if (destPath != null) {
try {
MagiskModule magiskModule = MagiskModule.getInstance();
magiskModule.uninstall(mPackageName, destPath);
PackageInstallerCompat installer = PackageInstallerCompat
.getNewInstance();
installer.setAppLabel(mPackageLabel);
installer.uninstall(mPackageName, UserHandleHidden.USER_ALL, keepData);
uninstalled = true;
} catch (IOException e) {
e.printStackTrace();
}
}
boolean finalUninstalled = uninstalled;
runOnUiThread(() -> {
if (finalUninstalled) {
displayLongToast(R.string.uninstalled_successfully, mPackageLabel);
// TODO: 3/3/23 Ask for reboot
mActivity.finish();
} else {
displayLongToast(R.string.failed_to_uninstall, mPackageLabel);
}
});
});
}

@UiThread
private void displayMagiskHideDialog() {
SearchableMultiChoiceDialogBuilder<MagiskProcess> builder;
Expand Down Expand Up @@ -964,20 +1019,26 @@ private void setHorizontalActions() {
ScrollableDialogBuilder builder = new ScrollableDialogBuilder(mActivity,
isSystemApp ? R.string.uninstall_system_app_message : R.string.uninstall_app_message)
.setTitle(mPackageLabel)
.setPositiveButton(R.string.uninstall, (dialog, which, keepData) -> executor.submit(() -> {
PackageInstallerCompat installer = PackageInstallerCompat
.getNewInstance();
installer.setAppLabel(mPackageLabel);
boolean uninstalled = installer.uninstall(mPackageName, userId, keepData);
runOnUiThread(() -> {
if (uninstalled) {
displayLongToast(R.string.uninstalled_successfully, mPackageLabel);
mActivity.finish();
} else {
displayLongToast(R.string.failed_to_uninstall, mPackageLabel);
}
.setPositiveButton(R.string.uninstall, (dialog, which, keepData) -> {
if (isSystemApp && Prefs.Installer.isSystemless()) {
doUninstallSystemless(keepData);
return;
}
executor.submit(() -> {
PackageInstallerCompat installer = PackageInstallerCompat
.getNewInstance();
installer.setAppLabel(mPackageLabel);
boolean uninstalled = installer.uninstall(mPackageName, userId, keepData);
runOnUiThread(() -> {
if (uninstalled) {
displayLongToast(R.string.uninstalled_successfully, mPackageLabel);
mActivity.finish();
} else {
displayLongToast(R.string.failed_to_uninstall, mPackageLabel);
}
});
});
}))
})
.setNegativeButton(R.string.cancel, (dialog, which, keepData) -> {
if (dialog != null) dialog.cancel();
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
import io.github.muntashirakon.AppManager.details.AppDetailsViewModel;
import io.github.muntashirakon.AppManager.magisk.MagiskDenyList;
import io.github.muntashirakon.AppManager.magisk.MagiskHide;
import io.github.muntashirakon.AppManager.magisk.MagiskModuleInfo;
import io.github.muntashirakon.AppManager.magisk.MagiskProcess;
import io.github.muntashirakon.AppManager.magisk.MagiskUtils;
import io.github.muntashirakon.AppManager.misc.OsEnvironment;
Expand Down Expand Up @@ -138,9 +139,12 @@ public void loadTagCloud() {
tagCloud.areAllTrackersBlocked &= componentRule.isBlocked();
}
tagCloud.isSystemApp = (applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0;
tagCloud.isSystemlessPath = !mainModel.getIsExternalApk() && Ops.isRoot()
&& MagiskUtils.isSystemlessPath(PackageUtils.getHiddenCodePathOrDefault(packageName,
applicationInfo.publicSourceDir));
if (!mainModel.getIsExternalApk() && Ops.isRoot()) {
String codePath = PackageUtils.getHiddenCodePathOrDefault(applicationInfo);
if (codePath != null) {
tagCloud.systemlessPathInfo = MagiskUtils.getSystemlessPathInfo(codePath);
}
}
tagCloud.isUpdatedSystemApp = (applicationInfo.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
tagCloud.splitCount = mainModel.getSplitCount();
tagCloud.isDebuggable = (applicationInfo.flags & ApplicationInfo.FLAG_DEBUGGABLE) != 0;
Expand Down Expand Up @@ -374,7 +378,8 @@ public static class TagCloud {
public List<ComponentRule> trackerComponents;
public boolean areAllTrackersBlocked = true;
public boolean isSystemApp;
public boolean isSystemlessPath;
@Nullable
public MagiskModuleInfo systemlessPathInfo;
public boolean isUpdatedSystemApp;
public int splitCount;
public boolean isDebuggable;
Expand Down
Loading