Merge "Skip back for unknown sources" into sc-dev

This commit is contained in:
Edward Cunningham
2021-04-07 08:55:07 +00:00
committed by Android (Google) Code Review

View File

@@ -16,6 +16,8 @@
*/ */
package com.android.packageinstaller; package com.android.packageinstaller;
import static android.content.Intent.FLAG_ACTIVITY_NO_HISTORY;
import static android.content.Intent.FLAG_ACTIVITY_REORDER_TO_FRONT;
import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS; import static android.view.WindowManager.LayoutParams.SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS;
import android.Manifest; import android.Manifest;
@@ -50,6 +52,8 @@ import android.widget.Button;
import com.android.internal.app.AlertActivity; import com.android.internal.app.AlertActivity;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.List;
/** /**
* This activity is launched when a new application is installed via side loading * This activity is launched when a new application is installed via side loading
@@ -92,6 +96,12 @@ public class PackageInstallerActivity extends AlertActivity {
private String mCallingAttributionTag; private String mCallingAttributionTag;
ApplicationInfo mSourceInfo; ApplicationInfo mSourceInfo;
/**
* A collection of unknown sources listeners that are actively listening for app ops mode
* changes
*/
private List<UnknownSourcesListener> mActiveUnknownSourcesListeners = new ArrayList<>(1);
// ApplicationInfo object primarily used for already existing applications // ApplicationInfo object primarily used for already existing applications
private ApplicationInfo mAppInfo = null; private ApplicationInfo mAppInfo = null;
@@ -381,6 +391,14 @@ public class PackageInstallerActivity extends AlertActivity {
outState.putBoolean(ALLOW_UNKNOWN_SOURCES_KEY, mAllowUnknownSources); outState.putBoolean(ALLOW_UNKNOWN_SOURCES_KEY, mAllowUnknownSources);
} }
@Override
protected void onDestroy() {
super.onDestroy();
while (!mActiveUnknownSourcesListeners.isEmpty()) {
unregister(mActiveUnknownSourcesListeners.get(0));
}
}
private void bindUi() { private void bindUi() {
mAlert.setIcon(mAppSnippet.icon); mAlert.setIcon(mAppSnippet.icon);
mAlert.setTitle(mAppSnippet.label); mAlert.setTitle(mAppSnippet.label);
@@ -707,24 +725,61 @@ public class PackageInstallerActivity extends AlertActivity {
} }
} }
private class UnknownSourcesListener implements AppOpsManager.OnOpChangedListener {
@Override
public void onOpChanged(String op, String packageName) {
if (!mOriginatingPackage.equals(packageName)) {
return;
}
unregister(this);
mActiveUnknownSourcesListeners.remove(this);
if (isDestroyed()) {
return;
}
getMainThreadHandler().postDelayed(() -> {
if (!isDestroyed()) {
startActivity(getIntent().addFlags(FLAG_ACTIVITY_REORDER_TO_FRONT));
}
}, 500);
}
}
private void register(UnknownSourcesListener listener) {
mAppOpsManager.startWatchingMode(
AppOpsManager.OPSTR_REQUEST_INSTALL_PACKAGES, mOriginatingPackage,
listener);
mActiveUnknownSourcesListeners.add(listener);
}
private void unregister(UnknownSourcesListener listener) {
mAppOpsManager.stopWatchingMode(listener);
mActiveUnknownSourcesListeners.remove(listener);
}
/** /**
* An error dialog shown when external sources are not allowed * An error dialog shown when external sources are not allowed
*/ */
public static class ExternalSourcesBlockedDialog extends AppErrorDialog { public static class ExternalSourcesBlockedDialog extends AppErrorDialog {
static AppErrorDialog newInstance(@NonNull String originationPkg) { static AppErrorDialog newInstance(@NonNull String originationPkg) {
ExternalSourcesBlockedDialog dialog = new ExternalSourcesBlockedDialog(); ExternalSourcesBlockedDialog dialog =
new ExternalSourcesBlockedDialog();
dialog.setArgument(originationPkg); dialog.setArgument(originationPkg);
return dialog; return dialog;
} }
@Override @Override
protected Dialog createDialog(@NonNull CharSequence argument) { protected Dialog createDialog(@NonNull CharSequence argument) {
final PackageInstallerActivity activity = (PackageInstallerActivity)getActivity();
try { try {
PackageManager pm = getActivity().getPackageManager(); PackageManager pm = activity.getPackageManager();
ApplicationInfo sourceInfo = pm.getApplicationInfo(argument.toString(), 0); ApplicationInfo sourceInfo = pm.getApplicationInfo(argument.toString(), 0);
return new AlertDialog.Builder(getActivity()) return new AlertDialog.Builder(activity)
.setTitle(pm.getApplicationLabel(sourceInfo)) .setTitle(pm.getApplicationLabel(sourceInfo))
.setIcon(pm.getApplicationIcon(sourceInfo)) .setIcon(pm.getApplicationIcon(sourceInfo))
.setMessage(R.string.untrusted_external_source_warning) .setMessage(R.string.untrusted_external_source_warning)
@@ -735,8 +790,10 @@ public class PackageInstallerActivity extends AlertActivity {
Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES); Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES);
final Uri packageUri = Uri.parse("package:" + argument); final Uri packageUri = Uri.parse("package:" + argument);
settingsIntent.setData(packageUri); settingsIntent.setData(packageUri);
settingsIntent.setFlags(FLAG_ACTIVITY_NO_HISTORY);
try { try {
getActivity().startActivityForResult(settingsIntent, activity.register(activity.new UnknownSourcesListener());
activity.startActivityForResult(settingsIntent,
REQUEST_TRUST_EXTERNAL_SOURCE); REQUEST_TRUST_EXTERNAL_SOURCE);
} catch (ActivityNotFoundException exc) { } catch (ActivityNotFoundException exc) {
Log.e(TAG, "Settings activity not found for action: " Log.e(TAG, "Settings activity not found for action: "
@@ -744,11 +801,11 @@ public class PackageInstallerActivity extends AlertActivity {
} }
}) })
.setNegativeButton(R.string.cancel, .setNegativeButton(R.string.cancel,
(dialog, which) -> getActivity().finish()) (dialog, which) -> activity.finish())
.create(); .create();
} catch (NameNotFoundException e) { } catch (NameNotFoundException e) {
Log.e(TAG, "Did not find app info for " + argument); Log.e(TAG, "Did not find app info for " + argument);
getActivity().finish(); activity.finish();
return null; return null;
} }
} }