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

Commit 5bc18463 authored by Sunny Goyal's avatar Sunny Goyal
Browse files

Adding support for putting arbitary attributes in InvariantDeviceProfile

This would allow derivative projects to profile profile specific
customization options

Change-Id: Id4703dc54d649a8d8a930f72c836c4ec23ffc45d
parent 108c6e74
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -30,12 +30,16 @@ import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.util.SparseArray;
import android.util.TypedValue;
import android.util.Xml;
import android.view.Display;
import android.view.WindowManager;

import com.android.launcher3.util.ConfigMonitor;
import com.android.launcher3.util.IntArray;
import com.android.launcher3.util.MainThreadInitializedObject;
import com.android.launcher3.util.Themes;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -44,6 +48,7 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;

import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;

public class InvariantDeviceProfile {
@@ -91,6 +96,8 @@ public class InvariantDeviceProfile {
    public int fillResIconDpi;
    public float iconTextSize;

    private SparseArray<TypedValue> mExtraAttrs;

    /**
     * Number of icons inside the hotseat area.
     */
@@ -122,6 +129,7 @@ public class InvariantDeviceProfile {
        numHotseatIcons = p.numHotseatIcons;
        defaultLayoutId = p.defaultLayoutId;
        demoModeLayoutId = p.demoModeLayoutId;
        mExtraAttrs = p.mExtraAttrs;
    }

    @TargetApi(23)
@@ -171,6 +179,8 @@ public class InvariantDeviceProfile {
        demoModeLayoutId = closestProfile.demoModeLayoutId;
        numFolderRows = closestProfile.numFolderRows;
        numFolderColumns = closestProfile.numFolderColumns;
        mExtraAttrs = closestProfile.extraAttrs;

        if (!closestProfile.name.equals(gridName)) {
            Utilities.getPrefs(context).edit()
                    .putString(KEY_IDP_GRID_NAME, closestProfile.name).apply();
@@ -210,6 +220,11 @@ public class InvariantDeviceProfile {
        }
    }

    @Nullable
    public TypedValue getAttrValue(int attr) {
        return mExtraAttrs == null ? null : mExtraAttrs.get(attr);
    }

    public void addOnChangeListener(OnIDPChangeListener listener) {
        mChangeListeners.add(listener);
    }
@@ -436,6 +451,8 @@ public class InvariantDeviceProfile {
        private final int defaultLayoutId;
        private final int demoModeLayoutId;

        private final SparseArray<TypedValue> extraAttrs;

        GridOption(Context context, AttributeSet attrs) {
            TypedArray a = context.obtainStyledAttributes(
                    attrs, R.styleable.GridDisplayOption);
@@ -454,6 +471,9 @@ public class InvariantDeviceProfile {
            numFolderColumns = a.getInt(
                    R.styleable.GridDisplayOption_numFolderColumns, numColumns);
            a.recycle();

            extraAttrs = Themes.createValueMap(context, attrs,
                    IntArray.wrap(R.styleable.GridDisplayOption));
        }
    }

+4 −1
Original line number Diff line number Diff line
@@ -49,6 +49,7 @@ import com.android.launcher3.MainThreadExecutor;
import com.android.launcher3.R;
import com.android.launcher3.Utilities;
import com.android.launcher3.anim.RoundedRectRevealOutlineProvider;
import com.android.launcher3.util.IntArray;
import com.android.launcher3.util.Themes;

import org.xmlpull.v1.XmlPullParser;
@@ -387,6 +388,8 @@ public abstract class FolderShape {

            final int depth = parser.getDepth();
            int[] radiusAttr = new int[] {R.attr.folderIconRadius};
            IntArray keysToIgnore = new IntArray(0);

            while (((type = parser.next()) != XmlPullParser.END_TAG ||
                    parser.getDepth() > depth) && type != XmlPullParser.END_DOCUMENT) {

@@ -396,7 +399,7 @@ public abstract class FolderShape {
                    FolderShape shape = getShapeDefinition(parser.getName(), a.getFloat(0, 1));
                    a.recycle();

                    shape.mAttrs = Themes.createValueMap(context, attrs);
                    shape.mAttrs = Themes.createValueMap(context, attrs, keysToIgnore);
                    result.add(shape);
                }
            }
+8 −5
Original line number Diff line number Diff line
@@ -112,16 +112,19 @@ public class Themes {
     * Creates a map for attribute-name to value for all the values in {@param attrs} which can be
     * held in memory for later use.
     */
    public static SparseArray<TypedValue> createValueMap(Context context, AttributeSet attrSet) {
    public static SparseArray<TypedValue> createValueMap(Context context, AttributeSet attrSet,
            IntArray keysToIgnore) {
        int count = attrSet.getAttributeCount();
        int[] attrNames = new int[count];
        IntArray attrNameArray = new IntArray(count);
        for (int i = 0; i < count; i++) {
            attrNames[i] = attrSet.getAttributeNameResource(i);
            attrNameArray.add(attrSet.getAttributeNameResource(i));
        }
        attrNameArray.removeAllValues(keysToIgnore);

        SparseArray<TypedValue> result = new SparseArray<>(count);
        int[] attrNames = attrNameArray.toArray();
        SparseArray<TypedValue> result = new SparseArray<>(attrNames.length);
        TypedArray ta = context.obtainStyledAttributes(attrSet, attrNames);
        for (int i = 0; i < count; i++) {
        for (int i = 0; i < attrNames.length; i++) {
            TypedValue tv = new TypedValue();
            ta.getValue(i, tv);
            result.put(attrNames[i], tv);