Improved UX when no debuggable apps are available.

In AppPicker, add an extra to exclude the "Nothing" sentinel. This is
used when selecting a debug app, and makes sense in that context.
However it does not makes sense when choosing an app to modify
compatibilty options for, so exclude it.

Also update the AppPicker to return a new result code in the case that
there are no apps available which match the criteria given. This result
code can only be used when the new extra is defined which keep this
change low risk.

In PlatformCompatDashboard, use the new extra and handle the new result
code, showing a dialog to explain that only debuggable apps are shown in
user builds. This also results in the "Nothing" item being shown at the
top of the app list.

Bug: 157633308
Test: Manual
Change-Id: Ifb055dd7c030cda42556bca8a9d7e87606f0ff72
This commit is contained in:
Mathew Inwood
2020-06-01 10:31:46 +01:00
parent 8224a5ad3d
commit 43f9adea62
3 changed files with 26 additions and 4 deletions

View File

@@ -11267,6 +11267,10 @@
<string name="platform_compat_default_disabled_title">Default disabled changes</string> <string name="platform_compat_default_disabled_title">Default disabled changes</string>
<!-- Title for target SDK gated app compat changes category (do not translate 'targetSdkVersion') [CHAR LIMIT=50] --> <!-- Title for target SDK gated app compat changes category (do not translate 'targetSdkVersion') [CHAR LIMIT=50] -->
<string name="platform_compat_target_sdk_title">Enabled for targetSdkVersion &gt; <xliff:g id="number" example="29">%d</xliff:g></string> <string name="platform_compat_target_sdk_title">Enabled for targetSdkVersion &gt; <xliff:g id="number" example="29">%d</xliff:g></string>
<!-- Title for the dialog shown when no debuggable apps are available [CHAR LIMIT=20] -->
<string name="platform_compat_dialog_title_no_apps">No apps available</string>
<!-- Explanatory text shown when no debuggable apps are available [CHAR LIMIT=NONE] -->
<string name="platform_compat_dialog_text_no_apps">App compatibility changes can only be modified for debuggable apps. Install a debuggable app and try again.</string>
<!-- Slices Strings --> <!-- Slices Strings -->

View File

@@ -46,10 +46,14 @@ public class AppPicker extends ListActivity {
= "com.android.settings.extra.REQUESTIING_PERMISSION"; = "com.android.settings.extra.REQUESTIING_PERMISSION";
public static final String EXTRA_DEBUGGABLE = "com.android.settings.extra.DEBUGGABLE"; public static final String EXTRA_DEBUGGABLE = "com.android.settings.extra.DEBUGGABLE";
public static final String EXTRA_NON_SYSTEM = "com.android.settings.extra.NON_SYSTEM"; public static final String EXTRA_NON_SYSTEM = "com.android.settings.extra.NON_SYSTEM";
public static final String EXTRA_INCLUDE_NOTHING = "com.android.settings.extra.INCLUDE_NOTHING";
public static final int RESULT_NO_MATCHING_APPS = -2;
private String mPermissionName; private String mPermissionName;
private boolean mDebuggableOnly; private boolean mDebuggableOnly;
private boolean mNonSystemOnly; private boolean mNonSystemOnly;
private boolean mIncludeNothing;
@Override @Override
protected void onCreate(Bundle icicle) { protected void onCreate(Bundle icicle) {
@@ -58,9 +62,11 @@ public class AppPicker extends ListActivity {
mPermissionName = getIntent().getStringExtra(EXTRA_REQUESTIING_PERMISSION); mPermissionName = getIntent().getStringExtra(EXTRA_REQUESTIING_PERMISSION);
mDebuggableOnly = getIntent().getBooleanExtra(EXTRA_DEBUGGABLE, false); mDebuggableOnly = getIntent().getBooleanExtra(EXTRA_DEBUGGABLE, false);
mNonSystemOnly = getIntent().getBooleanExtra(EXTRA_NON_SYSTEM, false); mNonSystemOnly = getIntent().getBooleanExtra(EXTRA_NON_SYSTEM, false);
mIncludeNothing = getIntent().getBooleanExtra(EXTRA_INCLUDE_NOTHING, true);
mAdapter = new AppListAdapter(this); mAdapter = new AppListAdapter(this);
if (mAdapter.getCount() <= 0) { if (mAdapter.getCount() <= 0) {
setResult(RESULT_NO_MATCHING_APPS);
finish(); finish();
} else { } else {
setListAdapter(mAdapter); setListAdapter(mAdapter);
@@ -140,9 +146,11 @@ public class AppPicker extends ListActivity {
mPackageInfoList.add(info); mPackageInfoList.add(info);
} }
Collections.sort(mPackageInfoList, sDisplayNameComparator); Collections.sort(mPackageInfoList, sDisplayNameComparator);
MyApplicationInfo info = new MyApplicationInfo(); if (mIncludeNothing) {
info.label = context.getText(R.string.no_application); MyApplicationInfo info = new MyApplicationInfo();
mPackageInfoList.add(0, info); info.label = context.getText(R.string.no_application);
mPackageInfoList.add(0, info);
}
addAll(mPackageInfoList); addAll(mPackageInfoList);
} }

View File

@@ -20,6 +20,7 @@ import static com.android.internal.compat.OverrideAllowedState.ALLOWED;
import static com.android.settings.development.DevelopmentOptionsActivityRequestCodes.REQUEST_COMPAT_CHANGE_APP; import static com.android.settings.development.DevelopmentOptionsActivityRequestCodes.REQUEST_COMPAT_CHANGE_APP;
import android.app.Activity; import android.app.Activity;
import android.app.AlertDialog;
import android.app.settings.SettingsEnums; import android.app.settings.SettingsEnums;
import android.compat.Compatibility.ChangeConfig; import android.compat.Compatibility.ChangeConfig;
import android.content.Context; import android.content.Context;
@@ -124,6 +125,14 @@ public class PlatformCompatDashboard extends DashboardFragment {
} catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) {
startAppPicker(); startAppPicker();
} }
} else if (resultCode == AppPicker.RESULT_NO_MATCHING_APPS) {
new AlertDialog.Builder(getContext())
.setTitle(R.string.platform_compat_dialog_title_no_apps)
.setMessage(R.string.platform_compat_dialog_text_no_apps)
.setPositiveButton(R.string.okay, (dialog, which) -> finish())
.setOnDismissListener(dialog -> finish())
.setCancelable(false)
.show();
} }
return; return;
} }
@@ -254,7 +263,8 @@ public class PlatformCompatDashboard extends DashboardFragment {
} }
private void startAppPicker() { private void startAppPicker() {
final Intent intent = new Intent(getContext(), AppPicker.class); final Intent intent = new Intent(getContext(), AppPicker.class)
.putExtra(AppPicker.EXTRA_INCLUDE_NOTHING, false);
// If build is neither userdebug nor eng, only include debuggable apps // If build is neither userdebug nor eng, only include debuggable apps
final boolean debuggableBuild = mAndroidBuildClassifier.isDebuggableBuild(); final boolean debuggableBuild = mAndroidBuildClassifier.isDebuggableBuild();
if (!debuggableBuild) { if (!debuggableBuild) {