parent
f87efa47ca
commit
369663073e
@ -0,0 +1,36 @@ |
||||
package io.legado.app.lib.theme.prefs |
||||
|
||||
import android.content.Context |
||||
import android.os.Build |
||||
import android.preference.PreferenceCategory |
||||
import android.util.AttributeSet |
||||
import android.view.View |
||||
import android.widget.TextView |
||||
import androidx.annotation.RequiresApi |
||||
import io.legado.app.lib.theme.ThemeStore |
||||
|
||||
|
||||
class ATEPreferenceCategory : PreferenceCategory { |
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) |
||||
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super( |
||||
context, |
||||
attrs, |
||||
defStyleAttr, |
||||
defStyleRes |
||||
) |
||||
|
||||
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) |
||||
|
||||
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) |
||||
|
||||
constructor(context: Context) : super(context) |
||||
|
||||
override fun onBindView(view: View) { |
||||
super.onBindView(view) |
||||
if (view is TextView) { |
||||
view.setTextColor(ThemeStore.accentColor(view.getContext()))//设置title文本的颜色 |
||||
} |
||||
} |
||||
|
||||
} |
@ -0,0 +1,52 @@ |
||||
package io.legado.app.lib.theme.prefs |
||||
|
||||
import android.content.Context |
||||
import android.os.Build |
||||
import android.preference.SwitchPreference |
||||
import android.util.AttributeSet |
||||
import android.view.View |
||||
import android.view.ViewGroup |
||||
import android.widget.Switch |
||||
import androidx.annotation.RequiresApi |
||||
import io.legado.app.lib.theme.ATH |
||||
import io.legado.app.lib.theme.ThemeStore |
||||
import java.util.* |
||||
|
||||
class ATESwitchPreference : SwitchPreference { |
||||
|
||||
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) |
||||
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super( |
||||
context, |
||||
attrs, |
||||
defStyleAttr, |
||||
defStyleRes |
||||
) |
||||
|
||||
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) |
||||
|
||||
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) |
||||
|
||||
constructor(context: Context) : super(context) |
||||
|
||||
override fun onBindView(view: View) { |
||||
super.onBindView(view) |
||||
|
||||
if (view is ViewGroup) { |
||||
val queue = LinkedList<ViewGroup>() |
||||
queue.add(view) |
||||
while (!queue.isEmpty()) { |
||||
val current = queue.removeFirst() |
||||
for (i in 0 until current.childCount) { |
||||
if (current.getChildAt(i) is Switch) { |
||||
ATH.setTint(current.getChildAt(i), ThemeStore.accentColor(view.getContext())) |
||||
return |
||||
} else if (current.getChildAt(i) is ViewGroup) { |
||||
queue.addLast(current.getChildAt(i) as ViewGroup) |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
} |
||||
|
||||
} |
@ -0,0 +1,95 @@ |
||||
package io.legado.app.lib.theme.prefs |
||||
|
||||
import android.annotation.SuppressLint |
||||
import android.app.Activity |
||||
import android.app.AlertDialog.Builder |
||||
import android.content.Context |
||||
import android.graphics.drawable.Drawable |
||||
import android.preference.ListPreference |
||||
import android.util.AttributeSet |
||||
import android.view.View |
||||
import android.view.ViewGroup |
||||
import android.widget.ArrayAdapter |
||||
import android.widget.CheckedTextView |
||||
import android.widget.ImageView |
||||
import android.widget.ListAdapter |
||||
import io.legado.app.R |
||||
import java.util.* |
||||
|
||||
|
||||
class IconListPreference(context: Context, attrs: AttributeSet) : ListPreference(context, attrs) { |
||||
|
||||
private val mEntryDrawables = ArrayList<Drawable>() |
||||
|
||||
init { |
||||
|
||||
val a = context.theme.obtainStyledAttributes(attrs, R.styleable.IconListPreference, 0, 0) |
||||
|
||||
val drawables: Array<CharSequence> |
||||
|
||||
try { |
||||
drawables = a.getTextArray(R.styleable.IconListPreference_icons) |
||||
} finally { |
||||
a.recycle() |
||||
} |
||||
|
||||
for (drawable in drawables) { |
||||
val resId = context.resources.getIdentifier(drawable.toString(), "mipmap", context.packageName) |
||||
|
||||
val d = context.resources.getDrawable(resId) |
||||
|
||||
mEntryDrawables.add(d) |
||||
} |
||||
|
||||
widgetLayoutResource = R.layout.view_icon |
||||
} |
||||
|
||||
protected fun createListAdapter(): ListAdapter { |
||||
val selectedValue = value |
||||
val selectedIndex = findIndexOfValue(selectedValue) |
||||
return AppArrayAdapter(context, R.layout.item_icon_preference, entries, mEntryDrawables, selectedIndex) |
||||
} |
||||
|
||||
override fun onBindView(view: View) { |
||||
super.onBindView(view) |
||||
|
||||
val selectedValue = value |
||||
val selectedIndex = findIndexOfValue(selectedValue) |
||||
|
||||
val drawable = mEntryDrawables[selectedIndex] |
||||
|
||||
(view.findViewById<View>(R.id.preview) as ImageView).setImageDrawable(drawable) |
||||
} |
||||
|
||||
override fun onPrepareDialogBuilder(builder: Builder) { |
||||
builder.setAdapter(createListAdapter(), this) |
||||
super.onPrepareDialogBuilder(builder) |
||||
} |
||||
|
||||
inner class AppArrayAdapter( |
||||
context: Context, textViewResourceId: Int, |
||||
objects: Array<CharSequence>, imageDrawables: List<Drawable>, |
||||
selectedIndex: Int |
||||
) : ArrayAdapter<CharSequence>(context, textViewResourceId, objects) { |
||||
private var mImageDrawables: List<Drawable>? = null |
||||
private var mSelectedIndex = 0 |
||||
|
||||
init { |
||||
mSelectedIndex = selectedIndex |
||||
mImageDrawables = imageDrawables |
||||
} |
||||
|
||||
@SuppressLint("ViewHolder") |
||||
override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { |
||||
val inflater = (context as Activity).layoutInflater |
||||
val view = inflater.inflate(R.layout.item_icon_preference, parent, false) |
||||
val textView = view.findViewById<View>(R.id.label) as CheckedTextView |
||||
textView.text = getItem(position) |
||||
textView.isChecked = position == mSelectedIndex |
||||
|
||||
val imageView = view.findViewById<View>(R.id.icon) as ImageView |
||||
imageView.setImageDrawable(mImageDrawables!![position]) |
||||
return view |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,33 @@ |
||||
package io.legado.app.lib.theme.view |
||||
|
||||
import android.content.Context |
||||
import android.graphics.Color |
||||
import android.util.AttributeSet |
||||
import androidx.appcompat.widget.AppCompatTextView |
||||
import io.legado.app.lib.theme.ColorUtil |
||||
import io.legado.app.lib.theme.Selector |
||||
import io.legado.app.lib.theme.ThemeStore |
||||
import io.legado.app.utils.dp |
||||
|
||||
class ATEAccentBgTextView : AppCompatTextView { |
||||
constructor(context: Context) : super(context) { |
||||
init(context, null) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
private fun init(context: Context, attrs: AttributeSet?) { |
||||
background = Selector.shapeBuild() |
||||
.setCornerRadius(3.dp) |
||||
.setDefaultBgColor(ThemeStore.accentColor(context)) |
||||
.setPressedBgColor(ColorUtil.darkenColor(ThemeStore.accentColor(context))) |
||||
.create() |
||||
setTextColor(Color.WHITE) |
||||
} |
||||
} |
@ -0,0 +1,39 @@ |
||||
package io.legado.app.lib.theme.view |
||||
|
||||
import android.content.Context |
||||
import android.util.AttributeSet |
||||
import androidx.appcompat.widget.AppCompatTextView |
||||
import io.legado.app.R |
||||
import io.legado.app.lib.theme.Selector |
||||
import io.legado.app.lib.theme.ThemeStore |
||||
import io.legado.app.utils.dp |
||||
|
||||
class ATEAccentStrokeTextView : AppCompatTextView { |
||||
constructor(context: Context) : super(context) { |
||||
init(context, null) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
private fun init(context: Context, attrs: AttributeSet?) { |
||||
background = Selector.shapeBuild() |
||||
.setCornerRadius(3.dp) |
||||
.setStrokeWidth(1.dp) |
||||
.setDisabledStrokeColor(context.resources.getColor(R.color.md_grey_500)) |
||||
.setDefaultStrokeColor(ThemeStore.accentColor(context)) |
||||
.setPressedBgColor(context.resources.getColor(R.color.transparent30)) |
||||
.create() |
||||
setTextColor( |
||||
Selector.colorBuild() |
||||
.setDefaultColor(ThemeStore.accentColor(context)) |
||||
.setDisabledColor(context.resources.getColor(R.color.md_grey_500)) |
||||
.create() |
||||
) |
||||
} |
||||
} |
@ -0,0 +1,33 @@ |
||||
package io.legado.app.lib.theme.view |
||||
|
||||
import android.content.Context |
||||
import android.os.Build |
||||
import android.util.AttributeSet |
||||
import androidx.appcompat.widget.AppCompatAutoCompleteTextView |
||||
import io.legado.app.lib.theme.Selector |
||||
import io.legado.app.lib.theme.ThemeStore |
||||
|
||||
|
||||
class ATEAutoCompleteTextView : AppCompatAutoCompleteTextView { |
||||
|
||||
constructor(context: Context) : super(context) { |
||||
init(context) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { |
||||
init(context) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { |
||||
init(context) |
||||
} |
||||
|
||||
private fun init(context: Context) { |
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { |
||||
backgroundTintList = Selector.colorBuild() |
||||
.setFocusedColor(ThemeStore.accentColor(context)) |
||||
.setDefaultColor(ThemeStore.textColorPrimary(context)) |
||||
.create() |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,29 @@ |
||||
package io.legado.app.lib.theme.view |
||||
|
||||
import android.content.Context |
||||
import android.util.AttributeSet |
||||
import androidx.appcompat.widget.AppCompatCheckBox |
||||
import io.legado.app.lib.theme.ATH |
||||
import io.legado.app.lib.theme.ThemeStore |
||||
|
||||
/** |
||||
* @author Aidan Follestad (afollestad) |
||||
*/ |
||||
class ATECheckBox : AppCompatCheckBox { |
||||
|
||||
constructor(context: Context) : super(context) { |
||||
init(context, null) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
private fun init(context: Context, attrs: AttributeSet?) { |
||||
ATH.setTint(this, ThemeStore.accentColor(context)) |
||||
} |
||||
} |
@ -0,0 +1,29 @@ |
||||
package io.legado.app.lib.theme.view |
||||
|
||||
import android.content.Context |
||||
import android.util.AttributeSet |
||||
import androidx.appcompat.widget.AppCompatEditText |
||||
import io.legado.app.lib.theme.ATH |
||||
import io.legado.app.lib.theme.ThemeStore |
||||
|
||||
/** |
||||
* @author Aidan Follestad (afollestad) |
||||
*/ |
||||
class ATEEditText : AppCompatEditText { |
||||
|
||||
constructor(context: Context) : super(context) { |
||||
init(context, null) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
private fun init(context: Context, attrs: AttributeSet?) { |
||||
ATH.setTint(this, ThemeStore.accentColor(context)) |
||||
} |
||||
} |
@ -0,0 +1,28 @@ |
||||
package io.legado.app.lib.theme.view |
||||
|
||||
import android.content.Context |
||||
import android.util.AttributeSet |
||||
import androidx.appcompat.widget.AppCompatTextView |
||||
import io.legado.app.lib.theme.ThemeStore |
||||
|
||||
/** |
||||
* @author Aidan Follestad (afollestad) |
||||
*/ |
||||
class ATEPrimaryTextView : AppCompatTextView { |
||||
|
||||
constructor(context: Context) : super(context) { |
||||
init(context, null) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
private fun init(context: Context, attrs: AttributeSet?) { |
||||
setTextColor(ThemeStore.textColorPrimary(context)) |
||||
} |
||||
} |
@ -0,0 +1,41 @@ |
||||
package io.legado.app.lib.theme.view |
||||
|
||||
import android.annotation.TargetApi |
||||
import android.content.Context |
||||
import android.os.Build |
||||
import android.util.AttributeSet |
||||
import android.widget.ProgressBar |
||||
import io.legado.app.lib.theme.ATH |
||||
import io.legado.app.lib.theme.ThemeStore |
||||
|
||||
/** |
||||
* @author Aidan Follestad (afollestad) |
||||
*/ |
||||
class ATEProgressBar : ProgressBar { |
||||
|
||||
constructor(context: Context) : super(context) { |
||||
init(context, null) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
@TargetApi(Build.VERSION_CODES.LOLLIPOP) |
||||
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super( |
||||
context, |
||||
attrs, |
||||
defStyleAttr, |
||||
defStyleRes |
||||
) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
private fun init(context: Context, attrs: AttributeSet?) { |
||||
ATH.setTint(this, ThemeStore.accentColor(context)) |
||||
} |
||||
} |
@ -0,0 +1,29 @@ |
||||
package io.legado.app.lib.theme.view |
||||
|
||||
import android.content.Context |
||||
import android.util.AttributeSet |
||||
import androidx.appcompat.widget.AppCompatRadioButton |
||||
import io.legado.app.lib.theme.ATH |
||||
import io.legado.app.lib.theme.ThemeStore |
||||
|
||||
/** |
||||
* @author Aidan Follestad (afollestad) |
||||
*/ |
||||
class ATERadioButton : AppCompatRadioButton { |
||||
|
||||
constructor(context: Context) : super(context) { |
||||
init(context, null) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
private fun init(context: Context, attrs: AttributeSet?) { |
||||
ATH.setTint(this, ThemeStore.accentColor(context)) |
||||
} |
||||
} |
@ -0,0 +1,37 @@ |
||||
package io.legado.app.lib.theme.view |
||||
|
||||
import android.content.Context |
||||
import android.graphics.Color |
||||
import android.util.AttributeSet |
||||
import androidx.appcompat.widget.AppCompatRadioButton |
||||
import io.legado.app.lib.theme.Selector |
||||
import io.legado.app.lib.theme.ThemeStore |
||||
import io.legado.app.utils.dp |
||||
|
||||
/** |
||||
* @author Aidan Follestad (afollestad) |
||||
*/ |
||||
class ATERadioNoButton : AppCompatRadioButton { |
||||
|
||||
constructor(context: Context) : super(context) { |
||||
init(context, null) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
private fun init(context: Context, attrs: AttributeSet?) { |
||||
background = Selector.shapeBuild() |
||||
.setCornerRadius(3.dp) |
||||
.setStrokeWidth(3.dp) |
||||
.setCheckedBgColor(ThemeStore.accentColor(context)) |
||||
.setCheckedStrokeColor(ThemeStore.accentColor(context)) |
||||
.setDefaultStrokeColor(Color.WHITE) |
||||
.create() |
||||
} |
||||
} |
@ -0,0 +1,28 @@ |
||||
package io.legado.app.lib.theme.view |
||||
|
||||
import android.content.Context |
||||
import android.util.AttributeSet |
||||
import androidx.appcompat.widget.AppCompatTextView |
||||
import io.legado.app.lib.theme.ThemeStore |
||||
|
||||
/** |
||||
* @author Aidan Follestad (afollestad) |
||||
*/ |
||||
class ATESecondaryTextView : AppCompatTextView { |
||||
|
||||
constructor(context: Context) : super(context) { |
||||
init(context, null) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
private fun init(context: Context, attrs: AttributeSet?) { |
||||
setTextColor(ThemeStore.textColorSecondary(context)) |
||||
} |
||||
} |
@ -0,0 +1,29 @@ |
||||
package io.legado.app.lib.theme.view |
||||
|
||||
import android.content.Context |
||||
import android.util.AttributeSet |
||||
import androidx.appcompat.widget.AppCompatSeekBar |
||||
import io.legado.app.lib.theme.ATH |
||||
import io.legado.app.lib.theme.ThemeStore |
||||
|
||||
/** |
||||
* @author Aidan Follestad (afollestad) |
||||
*/ |
||||
class ATESeekBar : AppCompatSeekBar { |
||||
|
||||
constructor(context: Context) : super(context) { |
||||
init(context, null) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
private fun init(context: Context, attrs: AttributeSet?) { |
||||
ATH.setTint(this, ThemeStore.accentColor(context)) |
||||
} |
||||
} |
@ -0,0 +1,34 @@ |
||||
package io.legado.app.lib.theme.view |
||||
|
||||
import android.content.Context |
||||
import android.util.AttributeSet |
||||
import android.view.View |
||||
import android.widget.Switch |
||||
import io.legado.app.lib.theme.ATH |
||||
import io.legado.app.lib.theme.ThemeStore |
||||
|
||||
/** |
||||
* @author Aidan Follestad (afollestad) |
||||
*/ |
||||
class ATEStockSwitch : Switch { |
||||
|
||||
constructor(context: Context) : super(context) { |
||||
init(context, null) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
private fun init(context: Context, attrs: AttributeSet?) { |
||||
ATH.setTint(this, ThemeStore.accentColor(context)) |
||||
} |
||||
|
||||
override fun isShown(): Boolean { |
||||
return parent != null && visibility == View.VISIBLE |
||||
} |
||||
} |
@ -0,0 +1,41 @@ |
||||
package io.legado.app.lib.theme.view |
||||
|
||||
import android.content.Context |
||||
import android.util.AttributeSet |
||||
import androidx.appcompat.widget.AppCompatTextView |
||||
import io.legado.app.R |
||||
import io.legado.app.lib.theme.Selector |
||||
import io.legado.app.lib.theme.ThemeStore |
||||
import io.legado.app.utils.dp |
||||
|
||||
class ATEStrokeTextView : AppCompatTextView { |
||||
constructor(context: Context) : super(context) { |
||||
init(context, null) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
private fun init(context: Context, attrs: AttributeSet?) { |
||||
background = Selector.shapeBuild() |
||||
.setCornerRadius(1.dp) |
||||
.setStrokeWidth(1.dp) |
||||
.setDisabledStrokeColor(context.resources.getColor(R.color.md_grey_500)) |
||||
.setDefaultStrokeColor(ThemeStore.textColorSecondary(context)) |
||||
.setSelectedStrokeColor(ThemeStore.accentColor(context)) |
||||
.setPressedBgColor(context.resources.getColor(R.color.transparent30)) |
||||
.create() |
||||
setTextColor( |
||||
Selector.colorBuild() |
||||
.setDefaultColor(ThemeStore.textColorSecondary(context)) |
||||
.setSelectedColor(ThemeStore.accentColor(context)) |
||||
.setDisabledColor(context.resources.getColor(R.color.md_grey_500)) |
||||
.create() |
||||
) |
||||
} |
||||
} |
@ -0,0 +1,34 @@ |
||||
package io.legado.app.lib.theme.view |
||||
|
||||
import android.content.Context |
||||
import android.util.AttributeSet |
||||
import android.view.View |
||||
import android.widget.Switch |
||||
import io.legado.app.lib.theme.ATH |
||||
import io.legado.app.lib.theme.ThemeStore |
||||
|
||||
/** |
||||
* @author Aidan Follestad (afollestad) |
||||
*/ |
||||
class ATESwitch : Switch { |
||||
|
||||
constructor(context: Context) : super(context) { |
||||
init(context, null) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { |
||||
init(context, attrs) |
||||
} |
||||
|
||||
private fun init(context: Context, attrs: AttributeSet?) { |
||||
ATH.setTint(this, ThemeStore.accentColor(context)) |
||||
} |
||||
|
||||
override fun isShown(): Boolean { |
||||
return parent != null && visibility == View.VISIBLE |
||||
} |
||||
} |
@ -0,0 +1,31 @@ |
||||
package io.legado.app.lib.theme.view |
||||
|
||||
import android.content.Context |
||||
import android.graphics.Canvas |
||||
import android.util.AttributeSet |
||||
import com.google.android.material.textfield.TextInputLayout |
||||
import io.legado.app.lib.theme.Selector |
||||
import io.legado.app.lib.theme.ThemeStore |
||||
|
||||
class ATETextInputLayout : TextInputLayout { |
||||
constructor(context: Context) : super(context) { |
||||
init(context) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) { |
||||
init(context) |
||||
} |
||||
|
||||
constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) { |
||||
init(context) |
||||
} |
||||
|
||||
private fun init(context: Context) { |
||||
defaultHintTextColor = Selector.colorBuild().setDefaultColor(ThemeStore.accentColor(context)).create() |
||||
} |
||||
|
||||
override fun draw(canvas: Canvas) { |
||||
|
||||
super.draw(canvas) |
||||
} |
||||
} |
@ -0,0 +1,16 @@ |
||||
package io.legado.app.utils |
||||
|
||||
import android.content.res.Resources |
||||
|
||||
|
||||
val Float.dp: Float // [xxhdpi](360 -> 1080) |
||||
get() = android.util.TypedValue.applyDimension( |
||||
android.util.TypedValue.COMPLEX_UNIT_DIP, this, Resources.getSystem().displayMetrics |
||||
) |
||||
|
||||
|
||||
val Float.sp: Float // [xxhdpi](360 -> 1080) |
||||
get() = android.util.TypedValue.applyDimension( |
||||
android.util.TypedValue.COMPLEX_UNIT_SP, this, Resources.getSystem().displayMetrics |
||||
) |
||||
|
@ -0,0 +1,13 @@ |
||||
package io.legado.app.utils |
||||
|
||||
import android.content.res.Resources |
||||
|
||||
val Int.dp: Int |
||||
get() = android.util.TypedValue.applyDimension( |
||||
android.util.TypedValue.COMPLEX_UNIT_DIP, this.toFloat(), Resources.getSystem().displayMetrics |
||||
).toInt() |
||||
|
||||
val Int.sp: Int |
||||
get() = android.util.TypedValue.applyDimension( |
||||
android.util.TypedValue.COMPLEX_UNIT_SP, this.toFloat(), Resources.getSystem().displayMetrics |
||||
).toInt() |
@ -0,0 +1,31 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" |
||||
xmlns:tools="http://schemas.android.com/tools" |
||||
android:layout_width="match_parent" |
||||
android:layout_height="?android:attr/listPreferredItemHeight" |
||||
android:padding="6dip"> |
||||
|
||||
<ImageView |
||||
android:id="@+id/icon" |
||||
android:layout_width="wrap_content" |
||||
android:layout_height="match_parent" |
||||
android:adjustViewBounds="true" |
||||
android:padding="6dip"/> |
||||
|
||||
<CheckedTextView |
||||
android:id="@+id/label" |
||||
android:layout_width="wrap_content" |
||||
android:layout_height="wrap_content" |
||||
android:layout_alignParentEnd="true" |
||||
android:layout_toRightOf="@+id/icon" |
||||
android:checkMark="?android:attr/listChoiceIndicatorSingle" |
||||
android:ellipsize="marquee" |
||||
android:gravity="center_vertical" |
||||
android:minHeight="?android:attr/listPreferredItemHeight" |
||||
android:singleLine="true" |
||||
android:textAppearance="?android:attr/textAppearanceMedium" |
||||
android:textColor="?android:attr/textColorAlertDialogListItem" |
||||
android:textIsSelectable="false" |
||||
tools:ignore="RtlHardcoded"/> |
||||
|
||||
</RelativeLayout> |
@ -0,0 +1,5 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<ImageView android:id="@+id/preview" |
||||
xmlns:android="http://schemas.android.com/apk/res/android" |
||||
android:layout_width="48dp" |
||||
android:layout_height="48dp"/> |
Loading…
Reference in new issue