Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ed6d6c9e authored by Chaohui Wang's avatar Chaohui Wang
Browse files

Migrate PlatformCompat App List to SPA

So hidden modules are not shown in the list.

This will also improve the developer experience.

Bug: 273913035
Test: Manually with App Compatibility Changes
Test: Unit test
Change-Id: Ic78a51819159a0f848db6173f751b1be8c6b1e70
parent 9aa7466c
Loading
Loading
Loading
Loading
+0 −2
Original line number Diff line number Diff line
@@ -10542,8 +10542,6 @@
    <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] -->
    <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=30] -->
    <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>
+1 −1
Original line number Diff line number Diff line
@@ -258,7 +258,7 @@
            android:key="platform_compat_dashboard"
            android:title="@string/platform_compat_dashboard_title"
            android:summary="@string/platform_compat_dashboard_summary"
            android:fragment="com.android.settings.development.compat.PlatformCompatDashboard"
            settings:controller="com.android.settings.spa.development.compat.PlatformCompatPreferenceController"
            />

        <SwitchPreference
+0 −8
Original line number Diff line number Diff line
@@ -25,12 +25,4 @@ public interface DevelopmentOptionsActivityRequestCodes {
    int REQUEST_CODE_DEBUG_APP = 1;

    int REQUEST_MOCK_LOCATION_APP = 2;

    int REQUEST_CODE_ANGLE_ALL_USE_ANGLE = 3;

    int REQUEST_CODE_ANGLE_DRIVER_PKGS = 4;

    int REQUEST_CODE_ANGLE_DRIVER_VALUES = 5;

    int REQUEST_COMPAT_CHANGE_APP = 6;
}
+12 −82
Original line number Diff line number Diff line
@@ -17,21 +17,16 @@
package com.android.settings.development.compat;

import static com.android.internal.compat.OverrideAllowedState.ALLOWED;
import static com.android.settings.development.DevelopmentOptionsActivityRequestCodes.REQUEST_COMPAT_CHANGE_APP;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.settings.SettingsEnums;
import android.compat.Compatibility.ChangeConfig;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.text.TextUtils;
import android.util.ArraySet;

import androidx.annotation.VisibleForTesting;
@@ -40,35 +35,28 @@ import androidx.preference.Preference.OnPreferenceChangeListener;
import androidx.preference.PreferenceCategory;
import androidx.preference.SwitchPreference;

import com.android.internal.compat.AndroidBuildClassifier;
import com.android.internal.compat.CompatibilityChangeConfig;
import com.android.internal.compat.CompatibilityChangeInfo;
import com.android.internal.compat.IPlatformCompat;
import com.android.settings.R;
import com.android.settings.dashboard.DashboardFragment;
import com.android.settings.development.AppPicker;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;


/**
 * Dashboard for Platform Compat preferences.
 */
public class PlatformCompatDashboard extends DashboardFragment {
    private static final String TAG = "PlatformCompatDashboard";
    private static final String COMPAT_APP = "compat_app";
    public static final String COMPAT_APP = "compat_app";

    private IPlatformCompat mPlatformCompat;

    private CompatibilityChangeInfo[] mChanges;

    private AndroidBuildClassifier mAndroidBuildClassifier = new AndroidBuildClassifier();

    private boolean mShouldStartAppPickerOnResume = true;

    @VisibleForTesting
    String mSelectedApp;

@@ -108,32 +96,6 @@ public class PlatformCompatDashboard extends DashboardFragment {
        } catch (RemoteException e) {
            throw new RuntimeException("Could not list changes!", e);
        }
        if (icicle != null) {
            mShouldStartAppPickerOnResume = false;
            mSelectedApp = icicle.getString(COMPAT_APP);
        }
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_COMPAT_CHANGE_APP) {
            mShouldStartAppPickerOnResume = false;
            switch (resultCode) {
                case Activity.RESULT_OK:
                    mSelectedApp = data.getAction();
                    break;
                case Activity.RESULT_CANCELED:
                    if (TextUtils.isEmpty(mSelectedApp)) {
                        finish();
                    }
                    break;
                case AppPicker.RESULT_NO_MATCHING_APPS:
                    mSelectedApp = null;
                    break;
            }
            return;
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

    @Override
@@ -142,33 +104,18 @@ public class PlatformCompatDashboard extends DashboardFragment {
        if (isFinishingOrDestroyed()) {
            return;
        }
        if (!mShouldStartAppPickerOnResume) {
            if (TextUtils.isEmpty(mSelectedApp)) {
                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();
        Bundle arguments = getArguments();
        if (arguments == null) {
            finish();
            return;
        }
        mSelectedApp = arguments.getString(COMPAT_APP);
        try {
            final ApplicationInfo applicationInfo = getApplicationInfo();
            addPreferences(applicationInfo);
                return;
            } catch (PackageManager.NameNotFoundException e) {
                mShouldStartAppPickerOnResume = true;
                mSelectedApp = null;
            }
        } catch (PackageManager.NameNotFoundException ignored) {
            finish();
        }
        startAppPicker();
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString(COMPAT_APP, mSelectedApp);
    }

    private void addPreferences(ApplicationInfo applicationInfo) {
@@ -266,12 +213,6 @@ public class PlatformCompatDashboard extends DashboardFragment {
        appPreference.setIcon(icon);
        appPreference.setSummary(getString(R.string.platform_compat_selected_app_summary,
                                         mSelectedApp, applicationInfo.targetSdkVersion));
        appPreference.setKey(mSelectedApp);
        appPreference.setOnPreferenceClickListener(
                preference -> {
                    startAppPicker();
                    return true;
                });
        return appPreference;
    }

@@ -294,17 +235,6 @@ public class PlatformCompatDashboard extends DashboardFragment {
        }
    }

    private void startAppPicker() {
        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
        final boolean debuggableBuild = mAndroidBuildClassifier.isDebuggableBuild();
        if (!debuggableBuild) {
            intent.putExtra(AppPicker.EXTRA_DEBUGGABLE, true /* value */);
        }
        startActivityForResult(intent, REQUEST_COMPAT_CHANGE_APP);
    }

    private class CompatChangePreferenceChangeListener implements OnPreferenceChangeListener {
        private final long changeId;

+3 −1
Original line number Diff line number Diff line
@@ -36,6 +36,7 @@ import com.android.settings.spa.app.specialaccess.WifiControlAppListProvider
import com.android.settings.spa.app.specialaccess.UseFullScreenIntentAppListProvider
import com.android.settings.spa.core.instrumentation.SpaLogProvider
import com.android.settings.spa.development.UsageStatsPageProvider
import com.android.settings.spa.development.compat.PlatformCompatAppListPageProvider
import com.android.settings.spa.home.HomePageProvider
import com.android.settings.spa.network.NetworkAndInternetPageProvider
import com.android.settings.spa.notification.AppListNotificationsPageProvider
@@ -83,6 +84,7 @@ open class SettingsSpaEnvironment(context: Context) : SpaEnvironment(context) {
                LanguageAndInputPageProvider,
                AppLanguagesPageProvider,
                UsageStatsPageProvider,
                PlatformCompatAppListPageProvider,
                BackgroundInstalledAppsPageProvider,
                CloneAppInfoSettingsProvider,
                NetworkAndInternetPageProvider,
Loading