Skip to content

Commit

Permalink
Strategy bugfix & ColorPicker dev
Browse files Browse the repository at this point in the history
  • Loading branch information
ximsfei committed Apr 25, 2018
1 parent 85b7fe3 commit 0715fc7
Show file tree
Hide file tree
Showing 18 changed files with 946 additions and 255 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@

import skin.support.app.SkinActivityLifecycle;
import skin.support.app.SkinLayoutInflater;
import skin.support.content.res.SkinCompatColorManager;
import skin.support.load.SkinAssetsLoader;
import skin.support.load.SkinBuildInLoader;
import skin.support.load.SkinNoneLoader;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,315 @@
package skin.support.content.res;

import android.content.res.ColorStateList;
import android.graphics.Color;
import android.text.TextUtils;

import java.util.ArrayList;
import java.util.List;

import skin.support.exception.SkinCompatException;
import skin.support.utils.Slog;

public final class ColorState {
private static final String TAG = "ColorState";
boolean onlyDefaultColor;
String colorName;
String colorWindowFocused;
String colorSelected;
String colorFocused;
String colorEnabled;
String colorPressed;
String colorChecked;
String colorActivated;
String colorAccelerated;
String colorHovered;
String colorDragCanAccept;
String colorDragHovered;
String colorDefault;

ColorState(String colorWindowFocused, String colorSelected, String colorFocused,
String colorEnabled, String colorPressed, String colorChecked, String colorActivated,
String colorAccelerated, String colorHovered, String colorDragCanAccept,
String colorDragHovered, String colorDefault) {
this.colorWindowFocused = colorWindowFocused;
this.colorSelected = colorSelected;
this.colorFocused = colorFocused;
this.colorEnabled = colorEnabled;
this.colorPressed = colorPressed;
this.colorChecked = colorChecked;
this.colorActivated = colorActivated;
this.colorAccelerated = colorAccelerated;
this.colorHovered = colorHovered;
this.colorDragCanAccept = colorDragCanAccept;
this.colorDragHovered = colorDragHovered;
this.colorDefault = colorDefault;
this.onlyDefaultColor = TextUtils.isEmpty(colorWindowFocused)
&& TextUtils.isEmpty(colorSelected)
&& TextUtils.isEmpty(colorFocused)
&& TextUtils.isEmpty(colorEnabled)
&& TextUtils.isEmpty(colorPressed)
&& TextUtils.isEmpty(colorChecked)
&& TextUtils.isEmpty(colorActivated)
&& TextUtils.isEmpty(colorAccelerated)
&& TextUtils.isEmpty(colorHovered)
&& TextUtils.isEmpty(colorDragCanAccept)
&& TextUtils.isEmpty(colorDragHovered);
if (onlyDefaultColor) {
if (!colorDefault.startsWith("#")) {
throw new SkinCompatException("Default color cannot be a reference, when only default color is available!");
}
}
}

ColorState(String colorName, String colorDefault) {
this.colorName = colorName;
this.colorDefault = colorDefault;
this.onlyDefaultColor = true;
if (!colorDefault.startsWith("#")) {
throw new SkinCompatException("Default color cannot be a reference, when only default color is available!");
}
}

public boolean isOnlyDefaultColor() {
return onlyDefaultColor;
}

public String getColorName() {
return colorName;
}

public String getColorWindowFocused() {
return colorWindowFocused;
}

public String getColorSelected() {
return colorSelected;
}

public String getColorFocused() {
return colorFocused;
}

public String getColorEnabled() {
return colorEnabled;
}

public String getColorPressed() {
return colorPressed;
}

public String getColorChecked() {
return colorChecked;
}

public String getColorActivated() {
return colorActivated;
}

public String getColorAccelerated() {
return colorAccelerated;
}

public String getColorHovered() {
return colorHovered;
}

public String getColorDragCanAccept() {
return colorDragCanAccept;
}

public String getColorDragHovered() {
return colorDragHovered;
}

public String getColorDefault() {
return colorDefault;
}

ColorStateList parse() {
if (onlyDefaultColor) {
int defaultColor = Color.parseColor(colorDefault);
return ColorStateList.valueOf(defaultColor);
}
return parseAll();
}

private ColorStateList parseAll() {
int stateColorCount = 0;
List<int[]> stateSetList = new ArrayList<>();
List<Integer> stateColorList = new ArrayList<>();
if (!TextUtils.isEmpty(colorWindowFocused)) {
try {
String windowFocusedColorStr = getColorStr(colorWindowFocused);
if (!TextUtils.isEmpty(windowFocusedColorStr)) {
int windowFocusedColorInt = Color.parseColor(windowFocusedColorStr);
stateSetList.add(SkinCompatThemeUtils.WINDOW_FOCUSED_STATE_SET);
stateColorList.add(windowFocusedColorInt);
stateColorCount++;
}
} catch (Exception e) {
}
}
if (!TextUtils.isEmpty(colorSelected)) {
try {
String colorSelectedStr = getColorStr(colorSelected);
if (!TextUtils.isEmpty(colorSelectedStr)) {
int selectedColorInt = Color.parseColor(colorSelectedStr);
stateSetList.add(SkinCompatThemeUtils.SELECTED_STATE_SET);
stateColorList.add(selectedColorInt);
stateColorCount++;
}
} catch (Exception e) {
}
}
if (!TextUtils.isEmpty(colorFocused)) {
try {
String colorFocusedStr = getColorStr(colorFocused);
if (!TextUtils.isEmpty(colorFocusedStr)) {
int focusedColorInt = Color.parseColor(colorFocusedStr);
stateSetList.add(SkinCompatThemeUtils.FOCUSED_STATE_SET);
stateColorList.add(focusedColorInt);
stateColorCount++;
}
} catch (Exception e) {
}
}
if (!TextUtils.isEmpty(colorEnabled)) {
try {
String colorEnabledStr = getColorStr(colorEnabled);
if (!TextUtils.isEmpty(colorEnabledStr)) {
int enabledColorInt = Color.parseColor(colorEnabledStr);
stateSetList.add(SkinCompatThemeUtils.ENABLED_STATE_SET);
stateColorList.add(enabledColorInt);
stateColorCount++;
}
} catch (Exception e) {
}
}
if (!TextUtils.isEmpty(colorPressed)) {
try {
String colorPressedStr = getColorStr(colorPressed);
if (!TextUtils.isEmpty(colorPressedStr)) {
int pressedColorInt = Color.parseColor(colorPressedStr);
stateSetList.add(SkinCompatThemeUtils.PRESSED_STATE_SET);
stateColorList.add(pressedColorInt);
stateColorCount++;
}
} catch (Exception e) {
}
}
if (!TextUtils.isEmpty(colorChecked)) {
try {
String colorCheckedStr = getColorStr(colorChecked);
if (!TextUtils.isEmpty(colorCheckedStr)) {
int checkedColorInt = Color.parseColor(colorCheckedStr);
stateSetList.add(SkinCompatThemeUtils.CHECKED_STATE_SET);
stateColorList.add(checkedColorInt);
stateColorCount++;
}
} catch (Exception e) {
}
}
if (!TextUtils.isEmpty(colorActivated)) {
try {
String colorActivatedStr = getColorStr(colorActivated);
if (!TextUtils.isEmpty(colorActivatedStr)) {
int activatedColorInt = Color.parseColor(colorActivatedStr);
stateSetList.add(SkinCompatThemeUtils.ACTIVATED_STATE_SET);
stateColorList.add(activatedColorInt);
stateColorCount++;
}
} catch (Exception e) {
}
}
if (!TextUtils.isEmpty(colorAccelerated)) {
try {
String colorAcceleratedStr = getColorStr(colorAccelerated);
if (!TextUtils.isEmpty(colorAcceleratedStr)) {
int acceleratedColorInt = Color.parseColor(colorAcceleratedStr);
stateSetList.add(SkinCompatThemeUtils.ACCELERATED_STATE_SET);
stateColorList.add(acceleratedColorInt);
stateColorCount++;
}
} catch (Exception e) {
}
}
if (!TextUtils.isEmpty(colorHovered)) {
try {
String colorHoveredStr = getColorStr(colorHovered);
if (!TextUtils.isEmpty(colorHoveredStr)) {
int hoveredColorInt = Color.parseColor(colorHoveredStr);
stateSetList.add(SkinCompatThemeUtils.HOVERED_STATE_SET);
stateColorList.add(hoveredColorInt);
stateColorCount++;
}
} catch (Exception e) {
}
}
if (!TextUtils.isEmpty(colorDragCanAccept)) {
try {
String colorDragCanAcceptStr = getColorStr(colorDragCanAccept);
if (!TextUtils.isEmpty(colorDragCanAcceptStr)) {
int dragCanAcceptColorInt = Color.parseColor(colorDragCanAcceptStr);
stateSetList.add(SkinCompatThemeUtils.DRAG_CAN_ACCEPT_STATE_SET);
stateColorList.add(dragCanAcceptColorInt);
stateColorCount++;
}
} catch (Exception e) {
}
}
if (!TextUtils.isEmpty(colorDragHovered)) {
try {
String colorDragHoveredStr = getColorStr(colorDragHovered);
if (!TextUtils.isEmpty(colorDragHoveredStr)) {
int dragHoveredColorInt = Color.parseColor(colorDragHoveredStr);
stateSetList.add(SkinCompatThemeUtils.DRAG_HOVERED_STATE_SET);
stateColorList.add(dragHoveredColorInt);
stateColorCount++;
}
} catch (Exception e) {
}
}
try {
String colorDefaultStr = getColorStr(colorDefault);
if (!TextUtils.isEmpty(colorDefaultStr)) {
int baseColor = Color.parseColor(colorDefaultStr);
stateSetList.add(SkinCompatThemeUtils.EMPTY_STATE_SET);
stateColorList.add(baseColor);
stateColorCount++;
}

final int[][] states = new int[stateColorCount][];
final int[] colors = new int[stateColorCount];
for (int index = 0; index < stateColorCount; index++) {
states[index] = stateSetList.get(index);
colors[index] = stateColorList.get(index);
}
return new ColorStateList(states, colors);
} catch (Exception e) {
if (Slog.DEBUG) {
Slog.i(TAG, colorName + " parse failure.");
}
SkinCompatUserColorManager.get().removeColorState(colorName);
return null;
}
}

private String getColorStr(String colorName) {
if (colorName.startsWith("#")) {
return colorName;
} else {
ColorState stateRef = SkinCompatUserColorManager.get().getColorState(colorName);
if (stateRef != null) {
if (stateRef.isOnlyDefaultColor()) {
return stateRef.colorDefault;
} else {
if (Slog.DEBUG) {
Slog.i(TAG, colorName + " cannot reference " + stateRef.colorName);
}
}
}
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
import static skin.support.content.res.SkinCompatThemeUtils.getThemeAttrColor;
import static skin.support.content.res.SkinCompatThemeUtils.getThemeAttrColorStateList;

public final class SkinCompatDrawableManager {
final class SkinCompatDrawableManager {
private interface InflateDelegate {
Drawable createFromXmlInner(@NonNull Context context, @NonNull XmlPullParser parser,
@NonNull AttributeSet attrs, @Nullable Resources.Theme theme);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public void reset() {
mSkinName = "";
mStrategy = null;
isDefaultSkin = true;
SkinCompatColorManager.get().clearCaches();
SkinCompatUserColorManager.get().clearCaches();
SkinCompatDrawableManager.get().clearCaches();
}

Expand All @@ -52,7 +52,7 @@ public void setupSkin(Resources resources, String pkgName, String skinName, Skin
mSkinName = skinName;
mStrategy = strategy;
isDefaultSkin = TextUtils.isEmpty(skinName) || TextUtils.isEmpty(pkgName) || resources == null;
SkinCompatColorManager.get().clearCaches();
SkinCompatUserColorManager.get().clearCaches();
SkinCompatDrawableManager.get().clearCaches();
}

Expand Down Expand Up @@ -101,8 +101,8 @@ private int getTargetResId(Context context, int resId) {
}

private int getSkinColor(Context context, int resId) {
if (!SkinCompatColorManager.get().isEmpty()) {
ColorStateList colorStateList = SkinCompatColorManager.get().getColorStateList(resId);
if (!SkinCompatUserColorManager.get().isEmpty()) {
ColorStateList colorStateList = SkinCompatUserColorManager.get().getColorStateList(resId);
if (colorStateList != null) {
return colorStateList.getDefaultColor();
}
Expand All @@ -117,8 +117,8 @@ private int getSkinColor(Context context, int resId) {
}

private ColorStateList getSkinColorStateList(Context context, int resId) {
if (!SkinCompatColorManager.get().isEmpty()) {
ColorStateList colorStateList = SkinCompatColorManager.get().getColorStateList(resId);
if (!SkinCompatUserColorManager.get().isEmpty()) {
ColorStateList colorStateList = SkinCompatUserColorManager.get().getColorStateList(resId);
if (colorStateList != null) {
return colorStateList;
}
Expand All @@ -133,8 +133,8 @@ private ColorStateList getSkinColorStateList(Context context, int resId) {
}

private Drawable getSkinDrawable(Context context, int resId) {
if (!SkinCompatColorManager.get().isEmpty()) {
ColorStateList colorStateList = SkinCompatColorManager.get().getColorStateList(resId);
if (!SkinCompatUserColorManager.get().isEmpty()) {
ColorStateList colorStateList = SkinCompatUserColorManager.get().getColorStateList(resId);
if (colorStateList != null) {
return new ColorDrawable(colorStateList.getDefaultColor());
}
Expand All @@ -157,6 +157,12 @@ private Drawable getSkinDrawableCompat(Context context, int resId) {
e.printStackTrace();
}
}
if (!SkinCompatUserColorManager.get().isEmpty()) {
ColorStateList colorStateList = SkinCompatUserColorManager.get().getColorStateList(resId);
if (colorStateList != null) {
return new ColorDrawable(colorStateList.getDefaultColor());
}
}
return AppCompatResources.getDrawable(context, resId);
} else {
return getSkinDrawable(context, resId);
Expand Down
Loading

0 comments on commit 0715fc7

Please sign in to comment.