Merge "Skip back for unknown sources" into sc-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
634a39bce8
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user