From 093a19c49153f2732ca497ec25f4345ecc14dc37 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Tue, 17 Jul 2018 23:01:19 +0800 Subject: [PATCH] feat(ui): spinner: textSize, textColor, textStyle, entryTextSize, entryTextColor, entryTextStyle --- .idea/caches/build_file_checksums.ser | Bin 733 -> 733 bytes app/build.gradle | 4 +- .../ui/inflater/DynamicLayoutInflater.java | 3 +- .../inflater/inflaters/SpinnerInflater.java | 63 ++++--- .../inflater/inflaters/TextViewInflater.java | 2 +- .../autojs/core/ui/widget/JsSpinner.java | 163 ++++++++++++++++++ .../autojs/core/ui/xml/XmlConverter.java | 3 +- .../java/com/stardust/util/IntentUtil.java | 1 + 8 files changed, 206 insertions(+), 33 deletions(-) create mode 100644 autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsSpinner.java diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index 5ad99a9c681db5117321269bb19c25a2f942a5b2..bf0552a3748826e28d512c2bc09b1d261dd17de6 100644 GIT binary patch delta 36 ucmV+<0NelF1>FUZm;|W6_cD>3cMxBd+Us}+i9UIj5OaZg-*mGh0lEQ0))1!v delta 36 ucmV+<0NelF1>FUZm;{KtQrVH5cMyS1$t?d4ZQ%ruEe!O*RU@+_0lEP;1`oXe diff --git a/app/build.gradle b/app/build.gradle index 9ae3d14d..ea809434 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "org.autojs.autojs" minSdkVersion 17 targetSdkVersion 23 - versionCode 403 - versionName "4.0.2 Alpha" + versionCode 406 + versionName "4.0.2 Alpha2" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" multiDexEnabled true ndk { diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/DynamicLayoutInflater.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/DynamicLayoutInflater.java index 47e2b6d9..a7c8bf26 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/DynamicLayoutInflater.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/DynamicLayoutInflater.java @@ -38,6 +38,7 @@ import com.stardust.autojs.core.ui.inflater.inflaters.TimePickerInflater; import com.stardust.autojs.core.ui.inflater.inflaters.ToolbarInflater; import com.stardust.autojs.core.ui.inflater.inflaters.ViewGroupInflater; import com.stardust.autojs.core.ui.inflater.util.Res; +import com.stardust.autojs.core.ui.widget.JsSpinner; import com.stardust.autojs.core.ui.widget.JsTabLayout; import com.stardust.autojs.core.ui.widget.JsToolbar; import com.stardust.autojs.core.ui.xml.XmlConverter; @@ -126,7 +127,7 @@ public class DynamicLayoutInflater { registerViewAttrSetter(DatePicker.class.getName(), new DatePickerInflater(mResourceParser)); registerViewAttrSetter(RadioGroup.class.getName(), new RadioGroupInflater<>(mResourceParser)); registerViewAttrSetter(ProgressBar.class.getName(), new ProgressBarInflater<>(mResourceParser)); - registerViewAttrSetter(Spinner.class.getName(), new SpinnerInflater(mResourceParser)); + registerViewAttrSetter(JsSpinner.class.getName(), new SpinnerInflater(mResourceParser)); registerViewAttrSetter(TimePicker.class.getName(), new TimePickerInflater(mResourceParser)); registerViewAttrSetter(AppBarLayout.class.getName(), new AppBarInflater<>(mResourceParser)); registerViewAttrSetter(JsTabLayout.class.getName(), new TabLayoutInflater<>(mResourceParser)); diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/SpinnerInflater.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/SpinnerInflater.java index c7fb8724..8c3a2a4a 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/SpinnerInflater.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/SpinnerInflater.java @@ -2,17 +2,22 @@ package com.stardust.autojs.core.ui.inflater.inflaters; import android.content.Context; import android.os.Build; +import android.support.annotation.NonNull; import android.support.annotation.Nullable; +import android.util.TypedValue; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.SimpleAdapter; import android.widget.Spinner; +import com.stardust.autojs.R; import com.stardust.autojs.core.ui.inflater.ResourceParser; import com.stardust.autojs.core.ui.inflater.ViewCreator; +import com.stardust.autojs.core.ui.inflater.util.Colors; import com.stardust.autojs.core.ui.inflater.util.Dimensions; import com.stardust.autojs.core.ui.inflater.util.Strings; import com.stardust.autojs.core.ui.inflater.util.ValueMapper; +import com.stardust.autojs.core.ui.widget.JsSpinner; import java.util.List; import java.util.Map; @@ -21,7 +26,7 @@ import java.util.Map; * Created by Stardust on 2017/11/29. */ -public class SpinnerInflater extends BaseViewInflater { +public class SpinnerInflater extends BaseViewInflater { protected static final ValueMapper SPINNER_MODES = new ValueMapper("spinnerMode") .map("dialog", Spinner.MODE_DIALOG) @@ -32,38 +37,48 @@ public class SpinnerInflater extends BaseViewInflater { } @Override - public boolean setAttr(Spinner view, String attr, String value, ViewGroup parent, Map attrs) { + public boolean setAttr(JsSpinner view, String attr, String value, ViewGroup parent, Map attrs) { switch (attr) { case "dropDownHorizontalOffset": - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - view.setDropDownHorizontalOffset(Dimensions.parseToIntPixel(value, view)); - } + view.setDropDownHorizontalOffset(Dimensions.parseToIntPixel(value, view)); break; case "dropDownSelector": Exceptions.unsupports(view, attr, value); break; case "dropDownVerticalOffset": - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - view.setDropDownVerticalOffset(Dimensions.parseToIntPixel(value, view)); - } + view.setDropDownVerticalOffset(Dimensions.parseToIntPixel(value, view)); break; case "dropDownWidth": - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - view.setDropDownWidth(Dimensions.parseToIntPixel(value, view)); - } + view.setDropDownWidth(Dimensions.parseToIntPixel(value, view)); break; case "popupBackground": - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { - view.setPopupBackgroundDrawable(getDrawables().parse(view, value)); - } + view.setPopupBackgroundDrawable(getDrawables().parse(view, value)); break; case "prompt": view.setPrompt(Strings.parse(view, value)); break; case "entries": - view.setAdapter(new ArrayAdapter<>(view.getContext(), + view.setAdapter(view.new Adapter(view.getContext(), android.R.layout.simple_spinner_dropdown_item, value.split("[|]"))); break; + case "textStyle": + view.setTextStyle(TextViewInflater.TEXT_STYLES.split(value)); + break; + case "textColor": + view.setTextColor(Colors.parse(view.getContext(), value)); + break; + case "textSize": + view.setTextSize(Dimensions.parseToPixel(value, view)); + break; + case "entryTextStyle": + view.setEntryTextStyle(TextViewInflater.TEXT_STYLES.split(value)); + break; + case "entryTextColor": + view.setEntryTextColor(Colors.parse(view.getContext(), value)); + break; + case "entryTextSize": + view.setEntryTextSize(Dimensions.parseToPixel(value, view)); + break; default: return super.setAttr(view, attr, value, parent, attrs); } @@ -73,22 +88,14 @@ public class SpinnerInflater extends BaseViewInflater { @Nullable @Override public ViewCreator getCreator() { - return new ViewCreator() { - @Override - public Spinner create(Context context, Map attrs) { - String mode = attrs.remove("android:spinnerMode"); - if (mode == null) { - return new Spinner(context); - } - return new Spinner(context, SPINNER_MODES.get(mode)); + return (context, attrs) -> { + String mode = attrs.remove("android:spinnerMode"); + if (mode == null) { + return new JsSpinner(context); } + return new JsSpinner(context, SPINNER_MODES.get(mode)); }; } - private static class EntryAdapter extends SimpleAdapter { - public EntryAdapter(Context context, List> data, int resource, String[] from, int[] to) { - super(context, data, resource, from, to); - } - } } diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/TextViewInflater.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/TextViewInflater.java index f92ae9d9..0bd1709a 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/TextViewInflater.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/TextViewInflater.java @@ -98,7 +98,7 @@ public class TextViewInflater extends BaseViewInflater { .map("number", InputType.TYPE_CLASS_NUMBER) .map("signed", InputType.TYPE_NUMBER_FLAG_SIGNED); - private static final ValueMapper TEXT_STYLES = new ValueMapper("textStyle") + static final ValueMapper TEXT_STYLES = new ValueMapper("textStyle") .map("bold", Typeface.BOLD) .map("italic", Typeface.ITALIC) .map("normal", Typeface.NORMAL); diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsSpinner.java b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsSpinner.java new file mode 100644 index 00000000..8649d7f4 --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsSpinner.java @@ -0,0 +1,163 @@ +package com.stardust.autojs.core.ui.widget; + +import android.content.Context; +import android.content.res.Resources; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.util.AttributeSet; +import android.util.TypedValue; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.Spinner; +import android.widget.TextView; + +public class JsSpinner extends android.support.v7.widget.AppCompatSpinner { + + private float mTextSize = -1; + private int mTextStyle = -1; + private int mTextColor = 0; + + private float mEntryTextSize = -1; + private int mEntryTextStyle = -1; + private int mEntryTextColor = 0; + + public JsSpinner(Context context) { + super(context); + } + + public JsSpinner(Context context, int mode) { + super(context, mode); + } + + public JsSpinner(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public JsSpinner(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + public JsSpinner(Context context, AttributeSet attrs, int defStyleAttr, int mode) { + super(context, attrs, defStyleAttr, mode); + } + + public JsSpinner(Context context, AttributeSet attrs, int defStyleAttr, int mode, Resources.Theme popupTheme) { + super(context, attrs, defStyleAttr, mode, popupTheme); + } + + + public float getTextSize() { + return mTextSize; + } + + public float getEntryTextSize() { + return mEntryTextSize; + } + + public void setEntryTextSize(float entryTextSize) { + mEntryTextSize = entryTextSize; + } + + public int getEntryTextStyle() { + return mEntryTextStyle; + } + + public void setEntryTextStyle(int entryTextStyle) { + mEntryTextStyle = entryTextStyle; + } + + public int getEntryTextColor() { + return mEntryTextColor; + } + + public void setEntryTextColor(int entryTextColor) { + mEntryTextColor = entryTextColor; + } + + public void setTextSize(float textSize) { + mTextSize = textSize; + for (int i = 0; i < getChildCount(); i++) { + View child = getChildAt(i); + if (child instanceof TextView) { + ((TextView) child).setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize); + } + } + } + + + public int getTextStyle() { + return mTextStyle; + } + + public void setTextStyle(int textStyle) { + mTextStyle = textStyle; + for (int i = 0; i < getChildCount(); i++) { + View child = getChildAt(i); + if (child instanceof TextView) { + ((TextView) child).setTypeface(((TextView) child).getTypeface(), mTextStyle); + } + } + } + + public int getTextColor() { + return mTextColor; + } + + public void setTextColor(int textColor) { + mTextColor = textColor; + for (int i = 0; i < getChildCount(); i++) { + View child = getChildAt(i); + if (child instanceof TextView) { + ((TextView) child).setTextColor(mTextColor); + } + } + } + + + public class Adapter extends ArrayAdapter { + + public Adapter(@NonNull Context context, int resource, @NonNull String[] objects) { + super(context, resource, objects); + } + + @NonNull + @Override + public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { + View view = super.getView(position, convertView, parent); + if (!(view instanceof TextView)) { + return view; + } + TextView textView = (TextView) view; + if (mTextColor != 0) { + textView.setTextColor(mTextColor); + } + if (mTextSize != -1) { + textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTextSize); + } + if (mTextStyle != -1) { + textView.setTypeface(textView.getTypeface(), mTextStyle); + } + return textView; + } + + @Override + public View getDropDownView(int position, @Nullable View convertView, @NonNull ViewGroup parent) { + View view = super.getDropDownView(position, convertView, parent); + if (!(view instanceof TextView)) { + return view; + } + TextView textView = (TextView) view; + if (mEntryTextColor != 0) { + textView.setTextColor(mEntryTextColor); + } + if (mEntryTextSize != -1) { + textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, mEntryTextSize); + } + if (mEntryTextStyle != -1) { + textView.setTypeface(textView.getTypeface(), mEntryTextStyle); + } + return textView; + } + } +} diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/xml/XmlConverter.java b/autojs/src/main/java/com/stardust/autojs/core/ui/xml/XmlConverter.java index a264b8d3..f2e27cad 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/xml/XmlConverter.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/xml/XmlConverter.java @@ -25,6 +25,7 @@ import com.stardust.autojs.core.ui.widget.JsImageView; import com.stardust.autojs.core.ui.widget.JsLinearLayout; import com.stardust.autojs.core.ui.widget.JsListView; import com.stardust.autojs.core.ui.widget.JsRelativeLayout; +import com.stardust.autojs.core.ui.widget.JsSpinner; import com.stardust.autojs.core.ui.widget.JsTabLayout; import com.stardust.autojs.core.ui.widget.JsTextView; import com.stardust.autojs.core.ui.widget.JsToolbar; @@ -68,7 +69,7 @@ public class XmlConverter { .map("webview", JsWebView.class.getName()) .map("progressbar", ProgressBar.class.getName()) .map("seekbar", SeekBar.class.getName()) - .map("spinner", Spinner.class.getName()) + .map("spinner", JsSpinner.class.getName()) .map("radio", RadioButton.class.getName()) .map("radiogroup", RadioGroup.class.getName()) .map("checkbox", CheckBox.class.getName()) diff --git a/common/src/main/java/com/stardust/util/IntentUtil.java b/common/src/main/java/com/stardust/util/IntentUtil.java index 3b595b84..93efdea4 100644 --- a/common/src/main/java/com/stardust/util/IntentUtil.java +++ b/common/src/main/java/com/stardust/util/IntentUtil.java @@ -84,6 +84,7 @@ public class IntentUtil { return goToAppDetailSettings(context, context.getPackageName()); } + // FIXME: 2018/7/11 Permission denial public static void installApk(Context context, String path) { Intent intent = new Intent(Intent.ACTION_VIEW);