pull/34/head
parent
27188c5b72
commit
c0b6fd8eed
@ -1,172 +0,0 @@ |
||||
package io.legado.app.lib.theme.prefs |
||||
|
||||
import android.annotation.SuppressLint |
||||
import android.app.Dialog |
||||
import android.content.Context |
||||
import android.content.DialogInterface |
||||
import android.os.Bundle |
||||
import android.os.Parcel |
||||
import android.os.Parcelable |
||||
import android.preference.Preference |
||||
import android.util.AttributeSet |
||||
import android.view.LayoutInflater |
||||
import android.view.View |
||||
import android.view.WindowManager |
||||
import android.widget.EditText |
||||
import android.widget.TextView |
||||
import androidx.appcompat.app.AlertDialog |
||||
import androidx.preference.EditTextPreference |
||||
import io.legado.app.lib.theme.ATH |
||||
import io.legado.app.lib.theme.ThemeStore |
||||
import io.legado.app.utils.applyTint |
||||
|
||||
class ATEEditTextPreference(context: Context?, attrs: AttributeSet?) : |
||||
EditTextPreference(context, attrs), |
||||
DialogInterface.OnClickListener, DialogInterface.OnDismissListener { |
||||
|
||||
private var builder: AlertDialog.Builder? = null |
||||
private var dialog: AlertDialog? = null |
||||
private var editText: EditText? = null |
||||
|
||||
/** Which button was clicked. */ |
||||
private var mWhichButtonClicked: Int = 0 |
||||
|
||||
override fun onClick() { |
||||
if (dialog?.isShowing == true) return |
||||
showDialog(null) |
||||
} |
||||
|
||||
protected fun showDialog(state: Bundle?) { |
||||
val context = context |
||||
|
||||
mWhichButtonClicked = DialogInterface.BUTTON_NEGATIVE |
||||
|
||||
builder = AlertDialog.Builder(context) |
||||
.setTitle(dialogTitle) |
||||
.setIcon(dialogIcon) |
||||
.setPositiveButton(positiveButtonText, this) |
||||
.setNegativeButton(negativeButtonText, this) |
||||
|
||||
val builder = this.builder!! |
||||
|
||||
val contentView = onCreateDialogView() |
||||
if (contentView != null) { |
||||
onBindDialogView(contentView) |
||||
builder.setView(contentView) |
||||
} else { |
||||
builder.setMessage(dialogMessage) |
||||
} |
||||
|
||||
// Create the dialog |
||||
dialog = builder.create() |
||||
|
||||
val dialog = this.dialog!! |
||||
if (state != null) { |
||||
dialog.onRestoreInstanceState(state) |
||||
} |
||||
requestInputMethod(dialog) |
||||
dialog.setOnDismissListener(this) |
||||
dialog.show() |
||||
dialog.applyTint() |
||||
} |
||||
|
||||
protected fun onCreateDialogView(): View? { |
||||
if (dialogLayoutResource == 0) { |
||||
return null |
||||
} |
||||
|
||||
val inflater = LayoutInflater.from(context) |
||||
return inflater.inflate(dialogLayoutResource, null) |
||||
} |
||||
|
||||
private fun requestInputMethod(dialog: Dialog?) { |
||||
dialog?.window?.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE) |
||||
} |
||||
|
||||
|
||||
protected fun onBindDialogView(view: View) { |
||||
editText = view.findViewById(android.R.id.edit) |
||||
|
||||
checkNotNull(editText) { "Dialog view must contain an EditText with id" + " @android:id/edit" } |
||||
|
||||
view.findViewById<TextView>(android.R.id.message).visibility = View.GONE |
||||
|
||||
editText?.let { |
||||
ATH.setTint(it, ThemeStore.accentColor(context)) |
||||
it.requestFocus() |
||||
it.setText(text) |
||||
// Place cursor at the end |
||||
it.setSelection(it.length()) |
||||
} |
||||
} |
||||
|
||||
override fun onClick(dialog: DialogInterface?, which: Int) { |
||||
mWhichButtonClicked = which |
||||
} |
||||
|
||||
override fun onDismiss(dialog: DialogInterface?) { |
||||
if (mWhichButtonClicked == DialogInterface.BUTTON_POSITIVE) { |
||||
text = editText?.text.toString() |
||||
callChangeListener(text) |
||||
} |
||||
} |
||||
|
||||
override fun onSaveInstanceState(): Parcelable { |
||||
val superState = super.onSaveInstanceState() |
||||
if (dialog == null || !dialog!!.isShowing) { |
||||
return superState |
||||
} |
||||
|
||||
val myState = SavedState(superState) |
||||
myState.isDialogShowing = true |
||||
myState.dialogBundle = dialog!!.onSaveInstanceState() |
||||
return myState |
||||
} |
||||
|
||||
override fun onRestoreInstanceState(state: Parcelable?) { |
||||
if (state == null || state.javaClass != SavedState::class.java) { |
||||
// Didn't save state for us in onSaveInstanceState |
||||
super.onRestoreInstanceState(state) |
||||
return |
||||
} |
||||
|
||||
val myState = state as SavedState? |
||||
super.onRestoreInstanceState(myState!!.superState) |
||||
if (myState.isDialogShowing) { |
||||
showDialog(myState.dialogBundle) |
||||
} |
||||
} |
||||
|
||||
private class SavedState : Preference.BaseSavedState { |
||||
internal var isDialogShowing: Boolean = false |
||||
internal var dialogBundle: Bundle? = null |
||||
|
||||
@SuppressLint("ParcelClassLoader") |
||||
constructor(source: Parcel) : super(source) { |
||||
isDialogShowing = source.readInt() == 1 |
||||
dialogBundle = source.readBundle() |
||||
} |
||||
|
||||
override fun writeToParcel(dest: Parcel, flags: Int) { |
||||
super.writeToParcel(dest, flags) |
||||
dest.writeInt(if (isDialogShowing) 1 else 0) |
||||
dest.writeBundle(dialogBundle) |
||||
} |
||||
|
||||
constructor(superState: Parcelable) : super(superState) |
||||
|
||||
companion object { |
||||
|
||||
@JvmField |
||||
val CREATOR: Parcelable.Creator<SavedState> = object : Parcelable.Creator<SavedState> { |
||||
override fun createFromParcel(`in`: Parcel): SavedState { |
||||
return SavedState(`in`) |
||||
} |
||||
|
||||
override fun newArray(size: Int): Array<SavedState?> { |
||||
return arrayOfNulls(size) |
||||
} |
||||
} |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue