Adding support for putting arbitary attributes in InvariantDeviceProfile
This would allow derivative projects to profile profile specific customization options Change-Id: Id4703dc54d649a8d8a930f72c836c4ec23ffc45d
This commit is contained in:
parent
108c6e74ca
commit
5bc1846375
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue