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

Commit 19a67f66 authored by Edgar Wang's avatar Edgar Wang
Browse files

Adding new api to allow set groupKey to the Tile

Bug: 333547416
Test: manual
Change-Id: Ie25293f351421001d70696d3c06146fbe922ec3c
parent 3e1862fb
Loading
Loading
Loading
Loading
+56 −99
Original line number Diff line number Diff line
@@ -19,7 +19,6 @@ package com.android.settingslib.drawer;
import static com.android.settingslib.drawer.TileUtils.META_DATA_KEY_ORDER;
import static com.android.settingslib.drawer.TileUtils.META_DATA_KEY_PROFILE;
import static com.android.settingslib.drawer.TileUtils.META_DATA_NEW_TASK;
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_GROUP_KEY;
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_ICON;
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_KEYHINT;
import static com.android.settingslib.drawer.TileUtils.META_DATA_PREFERENCE_SEARCHABLE;
@@ -52,16 +51,12 @@ import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;

/**
 * Description of a single dashboard tile that the user can select.
 */
/** Description of a single dashboard tile that the user can select. */
public abstract class Tile implements Parcelable {

    private static final String TAG = "Tile";

    /**
     * Optional list of user handles which the intent should be launched on.
     */
    /** Optional list of user handles which the intent should be launched on. */
    public ArrayList<UserHandle> userHandle = new ArrayList<>();

    public HashMap<UserHandle, PendingIntent> pendingIntentMap = new HashMap<>();
@@ -76,6 +71,7 @@ public abstract class Tile implements Parcelable {
    private CharSequence mSummaryOverride;
    private Bundle mMetaData;
    private String mCategory;
    private String mGroupKey;

    public Tile(ComponentInfo info, String category, Bundle metaData) {
        mComponentInfo = info;
@@ -102,6 +98,7 @@ public abstract class Tile implements Parcelable {
        if (isNewTask()) {
            mIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        }
        mGroupKey = in.readString();
    }

    @Override
@@ -121,16 +118,13 @@ public abstract class Tile implements Parcelable {
        }
        dest.writeString(mCategory);
        dest.writeBundle(mMetaData);
        dest.writeString(mGroupKey);
    }

    /**
     * Unique ID of the tile
     */
    /** Unique ID of the tile */
    public abstract int getId();

    /**
     * Human-readable description of the tile
     */
    /** Human-readable description of the tile */
    public abstract String getDescription();

    protected abstract ComponentInfo getComponentInfo(Context context);
@@ -147,16 +141,12 @@ public abstract class Tile implements Parcelable {
        return mComponentName;
    }

    /**
     * Intent to launch when the preference is selected.
     */
    /** Intent to launch when the preference is selected. */
    public Intent getIntent() {
        return mIntent;
    }

    /**
     * Category in which the tile should be placed.
     */
    /** Category in which the tile should be placed. */
    public String getCategory() {
        return mCategory;
    }
@@ -165,9 +155,7 @@ public abstract class Tile implements Parcelable {
        mCategory = newCategoryKey;
    }

    /**
     * Priority of this tile, used for display ordering.
     */
    /** Priority of this tile, used for display ordering. */
    public int getOrder() {
        if (hasOrder()) {
            return mMetaData.getInt(META_DATA_KEY_ORDER);
@@ -176,32 +164,24 @@ public abstract class Tile implements Parcelable {
        }
    }

    /**
     * Check whether tile has order.
     */
    /** Check whether tile has order. */
    public boolean hasOrder() {
        return mMetaData != null
                && mMetaData.containsKey(META_DATA_KEY_ORDER)
                && mMetaData.get(META_DATA_KEY_ORDER) instanceof Integer;
    }

    /**
     * Check whether tile has a switch.
     */
    /** Check whether tile has a switch. */
    public boolean hasSwitch() {
        return mMetaData != null && mMetaData.containsKey(META_DATA_PREFERENCE_SWITCH_URI);
    }

    /**
     * Check whether tile has a pending intent.
     */
    /** Check whether tile has a pending intent. */
    public boolean hasPendingIntent() {
        return !pendingIntentMap.isEmpty();
    }

    /**
     * Title of the tile that is shown to the user.
     */
    /** Title of the tile that is shown to the user. */
    public CharSequence getTitle(Context context) {
        CharSequence title = null;
        ensureMetadataNotStale(context);
@@ -238,9 +218,7 @@ public abstract class Tile implements Parcelable {
        mSummaryOverride = summaryOverride;
    }

    /**
     * Optional summary describing what this tile controls.
     */
    /** Optional summary describing what this tile controls. */
    public CharSequence getSummary(Context context) {
        if (mSummaryOverride != null) {
            return mSummaryOverride;
@@ -275,16 +253,12 @@ public abstract class Tile implements Parcelable {
        mMetaData = metaData;
    }

    /**
     * The metaData from the activity that defines this tile.
     */
    /** The metaData from the activity that defines this tile. */
    public Bundle getMetaData() {
        return mMetaData;
    }

    /**
     * Optional key to use for this tile.
     */
    /** Optional key to use for this tile. */
    public String getKey(Context context) {
        ensureMetadataNotStale(context);
        if (!hasKey()) {
@@ -297,9 +271,7 @@ public abstract class Tile implements Parcelable {
        }
    }

    /**
     * Check whether title has key.
     */
    /** Check whether title has key. */
    public boolean hasKey() {
        return mMetaData != null && mMetaData.containsKey(META_DATA_PREFERENCE_KEYHINT);
    }
@@ -325,8 +297,9 @@ public abstract class Tile implements Parcelable {
        if (iconResId != 0 && iconResId != android.R.color.transparent) {
            final Icon icon = Icon.createWithResource(componentInfo.packageName, iconResId);
            if (isIconTintable(context)) {
                final TypedArray a = context.obtainStyledAttributes(new int[]{
                        android.R.attr.colorControlNormal});
                final TypedArray a =
                        context.obtainStyledAttributes(
                                new int[] {android.R.attr.colorControlNormal});
                final int tintColor = a.getColor(0, 0);
                a.recycle();
                icon.setTint(tintColor);
@@ -349,26 +322,22 @@ public abstract class Tile implements Parcelable {
        return false;
    }

    /**
     * Whether the {@link Activity} should be launched in a separate task.
     */
    /** Whether the {@link Activity} should be launched in a separate task. */
    public boolean isNewTask() {
        if (mMetaData != null
                && mMetaData.containsKey(META_DATA_NEW_TASK)) {
        if (mMetaData != null && mMetaData.containsKey(META_DATA_NEW_TASK)) {
            return mMetaData.getBoolean(META_DATA_NEW_TASK);
        }
        return false;
    }

    /**
     * Ensures metadata is not stale for this tile.
     */
    /** Ensures metadata is not stale for this tile. */
    private void ensureMetadataNotStale(Context context) {
        final PackageManager pm = context.getApplicationContext().getPackageManager();

        try {
            final long lastUpdateTime = pm.getPackageInfo(mComponentPackage,
                    PackageManager.GET_META_DATA).lastUpdateTime;
            final long lastUpdateTime =
                    pm.getPackageInfo(mComponentPackage, PackageManager.GET_META_DATA)
                            .lastUpdateTime;
            if (lastUpdateTime == mLastUpdateTime) {
                // All good. Do nothing
                return;
@@ -382,7 +351,8 @@ public abstract class Tile implements Parcelable {
        }
    }

    public static final Creator<Tile> CREATOR = new Creator<Tile>() {
    public static final Creator<Tile> CREATOR =
            new Creator<Tile>() {
                public Tile createFromParcel(Parcel source) {
                    final boolean isProviderTile = source.readBoolean();
                    // reset the Parcel pointer before delegating to the real constructor.
@@ -395,59 +365,46 @@ public abstract class Tile implements Parcelable {
                }
            };

    /**
     * Check whether tile only has primary profile.
     */
    /** Check whether tile only has primary profile. */
    public boolean isPrimaryProfileOnly() {
        return isPrimaryProfileOnly(mMetaData);
    }

    static boolean isPrimaryProfileOnly(Bundle metaData) {
        String profile = metaData != null
                ? metaData.getString(META_DATA_KEY_PROFILE) : PROFILE_ALL;
        String profile = metaData != null ? metaData.getString(META_DATA_KEY_PROFILE) : PROFILE_ALL;
        profile = (profile != null ? profile : PROFILE_ALL);
        return TextUtils.equals(profile, PROFILE_PRIMARY);
    }

    /**
     * Returns whether the tile belongs to another group / category.
     */
    /** Returns whether the tile belongs to another group / category. */
    public boolean hasGroupKey() {
        return mMetaData != null
                && !TextUtils.isEmpty(mMetaData.getString(META_DATA_PREFERENCE_GROUP_KEY));
        return !TextUtils.isEmpty(mGroupKey);
    }

    /**
     * Returns the group / category key this tile belongs to.
     */
    /** Set the group / PreferenceCategory key this tile belongs to. */
    public void setGroupKey(String groupKey) {
        mGroupKey = groupKey;
    }

    /** Returns the group / category key this tile belongs to. */
    public String getGroupKey() {
        return (mMetaData == null) ? null : mMetaData.getString(META_DATA_PREFERENCE_GROUP_KEY);
        return mGroupKey;
    }

    /**
     * Returns if this is searchable.
     */
    /** Returns if this is searchable. */
    public boolean isSearchable() {
        return mMetaData == null || mMetaData.getBoolean(META_DATA_PREFERENCE_SEARCHABLE, true);
    }

    /**
     * The type of the tile.
     */
    /** The type of the tile. */
    public enum Type {
        /**
         * A preference that can be tapped on to open a new page.
         */
        /** A preference that can be tapped on to open a new page. */
        ACTION,

        /**
         * A preference that can be tapped on to open an external app.
         */
        /** A preference that can be tapped on to open an external app. */
        EXTERNAL_ACTION,

        /**
         * A preference that shows an on / off switch that can be toggled by the user.
         */
        /** A preference that shows an on / off switch that can be toggled by the user. */
        SWITCH,

        /**
@@ -460,7 +417,7 @@ public abstract class Tile implements Parcelable {
         * A preference category with a title that can be used to group multiple preferences
         * together.
         */
        GROUP;
        GROUP
    }

    /**
+55 −67
Original line number Diff line number Diff line
@@ -77,9 +77,7 @@ public class TileUtils {
     */
    public static final String IA_SETTINGS_ACTION = "com.android.settings.action.IA_SETTINGS";

    /**
     * Same as #EXTRA_SETTINGS_ACTION but used for the platform Settings activities.
     */
    /** Same as #EXTRA_SETTINGS_ACTION but used for the platform Settings activities. */
    private static final String SETTINGS_ACTION = "com.android.settings.action.SETTINGS";

    private static final String OPERATOR_SETTINGS =
@@ -101,9 +99,7 @@ public class TileUtils {
     */
    static final String EXTRA_CATEGORY_KEY = "com.android.settings.category";

    /**
     * The key used to get the package name of the icon resource for the preference.
     */
    /** The key used to get the package name of the icon resource for the preference. */
    static final String EXTRA_PREFERENCE_ICON_PACKAGE = "com.android.settings.icon_package";

    /**
@@ -145,18 +141,17 @@ public class TileUtils {
            "com.android.settings.bg.argb";

    /**
     * Name of the meta-data item that should be set in the AndroidManifest.xml
     * to specify the content provider providing the icon that should be displayed for
     * the preference.
     * Name of the meta-data item that should be set in the AndroidManifest.xml to specify the
     * content provider providing the icon that should be displayed for the preference.
     *
     * Icon provided by the content provider overrides any static icon.
     * <p>Icon provided by the content provider overrides any static icon.
     */
    public static final String META_DATA_PREFERENCE_ICON_URI = "com.android.settings.icon_uri";

    /**
     * Name of the meta-data item that should be set in the AndroidManifest.xml
     * to specify whether the icon is tintable. This should be a boolean value {@code true} or
     * {@code false}, set using {@code android:value}
     * Name of the meta-data item that should be set in the AndroidManifest.xml to specify whether
     * the icon is tintable. This should be a boolean value {@code true} or {@code false}, set using
     * {@code android:value}
     */
    public static final String META_DATA_PREFERENCE_ICON_TINTABLE =
            "com.android.settings.icon_tintable";
@@ -171,41 +166,36 @@ public class TileUtils {
    public static final String META_DATA_PREFERENCE_TITLE = "com.android.settings.title";

    /**
     * Name of the meta-data item that should be set in the AndroidManifest.xml
     * to specify the content provider providing the title text that should be displayed for the
     * preference.
     * Name of the meta-data item that should be set in the AndroidManifest.xml to specify the
     * content provider providing the title text that should be displayed for the preference.
     *
     * Title provided by the content provider overrides any static title.
     * <p>Title provided by the content provider overrides any static title.
     */
    public static final String META_DATA_PREFERENCE_TITLE_URI =
            "com.android.settings.title_uri";
    public static final String META_DATA_PREFERENCE_TITLE_URI = "com.android.settings.title_uri";

    /**
     * Name of the meta-data item that should be set in the AndroidManifest.xml
     * to specify the summary text that should be displayed for the preference.
     * Name of the meta-data item that should be set in the AndroidManifest.xml to specify the
     * summary text that should be displayed for the preference.
     */
    public static final String META_DATA_PREFERENCE_SUMMARY = "com.android.settings.summary";

    /**
     * Name of the meta-data item that should be set in the AndroidManifest.xml
     * to specify the content provider providing the summary text that should be displayed for the
     * preference.
     * Name of the meta-data item that should be set in the AndroidManifest.xml to specify the
     * content provider providing the summary text that should be displayed for the preference.
     *
     * Summary provided by the content provider overrides any static summary.
     * <p>Summary provided by the content provider overrides any static summary.
     */
    public static final String META_DATA_PREFERENCE_SUMMARY_URI =
            "com.android.settings.summary_uri";

    /**
     * Name of the meta-data item that should be set in the AndroidManifest.xml
     * to specify the content provider providing the switch that should be displayed for the
     * preference.
     * Name of the meta-data item that should be set in the AndroidManifest.xml to specify the
     * content provider providing the switch that should be displayed for the preference.
     *
     * This works with {@link #META_DATA_PREFERENCE_KEYHINT} which should also be set in the
     * <p>This works with {@link #META_DATA_PREFERENCE_KEYHINT} which should also be set in the
     * AndroidManifest.xml
     */
    public static final String META_DATA_PREFERENCE_SWITCH_URI =
            "com.android.settings.switch_uri";
    public static final String META_DATA_PREFERENCE_SWITCH_URI = "com.android.settings.switch_uri";

    /**
     * Name of the meta-data item that can be set from the content provider providing the intent
@@ -215,8 +205,8 @@ public class TileUtils {
            "com.android.settings.pending_intent";

    /**
     * Value for {@link #META_DATA_KEY_PROFILE}. When the device has a managed profile,
     * the app will always be run in the primary profile.
     * Value for {@link #META_DATA_KEY_PROFILE}. When the device has a managed profile, the app will
     * always be run in the primary profile.
     *
     * @see #META_DATA_KEY_PROFILE
     */
@@ -231,11 +221,11 @@ public class TileUtils {
    public static final String PROFILE_ALL = "all_profiles";

    /**
     * Name of the meta-data item that should be set in the AndroidManifest.xml
     * to specify the profile in which the app should be run when the device has a managed profile.
     * The default value is {@link #PROFILE_ALL} which means the user will be presented with a
     * dialog to choose the profile. If set to {@link #PROFILE_PRIMARY} the app will always be
     * run in the primary profile.
     * Name of the meta-data item that should be set in the AndroidManifest.xml to specify the
     * profile in which the app should be run when the device has a managed profile. The default
     * value is {@link #PROFILE_ALL} which means the user will be presented with a dialog to choose
     * the profile. If set to {@link #PROFILE_PRIMARY} the app will always be run in the primary
     * profile.
     *
     * @see #PROFILE_PRIMARY
     * @see #PROFILE_ALL
@@ -243,20 +233,16 @@ public class TileUtils {
    public static final String META_DATA_KEY_PROFILE = "com.android.settings.profile";

    /**
     * Name of the meta-data item that should be set in the AndroidManifest.xml
     * to specify whether the {@link android.app.Activity} should be launched in a separate task.
     * This should be a boolean value {@code true} or {@code false}, set using {@code android:value}
     * Name of the meta-data item that should be set in the AndroidManifest.xml to specify whether
     * the {@link android.app.Activity} should be launched in a separate task. This should be a
     * boolean value {@code true} or {@code false}, set using {@code android:value}
     */
    public static final String META_DATA_NEW_TASK = "com.android.settings.new_task";

    /**
     * If the entry should be shown in settings search results. Defaults to true.
     */
    /** If the entry should be shown in settings search results. Defaults to true. */
    public static final String META_DATA_PREFERENCE_SEARCHABLE = "com.android.settings.searchable";

    /**
     * Build a list of DashboardCategory.
     */
    /** Build a list of DashboardCategory. */
    public static List<DashboardCategory> getCategories(Context context,
            Map<Pair<String, String>, Tile> cache) {
        final long startTime = System.currentTimeMillis();
@@ -341,8 +327,8 @@ public class TileUtils {
            UserHandle user, Map<Pair<String, String>, Tile> addedCache,
            String defaultCategory, List<Tile> outTiles, Intent intent) {
        final PackageManager pm = context.getPackageManager();
        final List<ResolveInfo> results = pm.queryIntentContentProvidersAsUser(intent,
                0 /* flags */, user.getIdentifier());
        final List<ResolveInfo> results =
                pm.queryIntentContentProvidersAsUser(intent, 0 /* flags */, user.getIdentifier());
        for (ResolveInfo resolved : results) {
            if (!resolved.system) {
                // Do not allow any app to add to settings, only system ones.
@@ -403,6 +389,8 @@ public class TileUtils {
            tile.setMetaData(metaData);
        }

        tile.setGroupKey(metaData.getString(META_DATA_PREFERENCE_GROUP_KEY));

        if (!tile.userHandle.contains(user)) {
            tile.userHandle.add(user);
        }
@@ -448,11 +436,11 @@ public class TileUtils {
    /**
     * Returns the complete uri from the meta data key of the tile.
     *
     * A complete uri should contain at least one path segment and be one of the following types:
     *      content://authority/method
     *      content://authority/method/key
     * <p>A complete uri should contain at least one path segment and be one of the following types:
     * <br>content://authority/method
     * <br>content://authority/method/key
     *
     * If the uri from the tile is not complete, build a uri by the default method and the
     * <p>If the uri from the tile is not complete, build a uri by the default method and the
     * preference key.
     *
     * @param tile Tile which contains meta data