Skip to content
This repository has been archived by the owner on Jul 18, 2024. It is now read-only.

Commit

Permalink
app: Cleanup MainActivity
Browse files Browse the repository at this point in the history
  • Loading branch information
YuKongA committed Apr 28, 2024
1 parent 4316f49 commit 16d774a
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 82 deletions.
91 changes: 12 additions & 79 deletions app/src/main/kotlin/top/yukonga/update/activity/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -1,23 +1,16 @@
package top.yukonga.update.activity

import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.net.Uri
import android.os.Build
import android.os.Bundle
import android.text.Editable
import android.text.Html
import android.text.InputType
import android.text.TextWatcher
import android.text.method.LinkMovementMethod
import android.view.View
import android.view.View.OnFocusChangeListener
import android.view.WindowInsets
import android.view.WindowManager
import android.view.inputmethod.InputMethodManager
import android.widget.ArrayAdapter
import android.widget.LinearLayout
import android.widget.TextView
Expand All @@ -26,13 +19,11 @@ import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.isVisible
import androidx.lifecycle.ViewModelProvider
import androidx.preference.PreferenceManager
import com.google.android.material.button.MaterialButton
import com.google.android.material.checkbox.MaterialCheckBox
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.google.android.material.textfield.MaterialAutoCompleteTextView
import com.google.android.material.textfield.TextInputEditText
import com.google.android.material.textfield.TextInputLayout
import com.google.android.material.textview.MaterialTextView
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
Expand All @@ -53,10 +44,12 @@ import top.yukonga.update.logic.utils.AnimUtils.fadOutAnimation
import top.yukonga.update.logic.utils.AnimUtils.setTextAnimation
import top.yukonga.update.logic.utils.AppUtils
import top.yukonga.update.logic.utils.AppUtils.dp
import top.yukonga.update.logic.utils.AppUtils.hideKeyBoard
import top.yukonga.update.logic.utils.AppUtils.isLandscape
import top.yukonga.update.logic.utils.AppUtils.json
import top.yukonga.update.logic.utils.AppUtils.setCopyClickListener
import top.yukonga.update.logic.utils.AppUtils.setDownloadClickListener
import top.yukonga.update.logic.utils.FileUtils
import top.yukonga.update.logic.utils.FileUtils.downloadRomFile
import top.yukonga.update.logic.utils.HapticUtils.hapticConfirm
import top.yukonga.update.logic.utils.HapticUtils.hapticReject
import top.yukonga.update.logic.utils.InfoUtils.getRecoveryRomInfo
Expand Down Expand Up @@ -411,10 +404,10 @@ class MainActivity : AppCompatActivity() {

// Hide input method when focus is on dropdown.
deviceRegionDropdown.onFocusChangeListener = OnFocusChangeListener { view, hasFocus ->
if (hasFocus) hideIme(view)
if (hasFocus) hideKeyBoard(this@MainActivity, view)
}
androidVersionDropdown.onFocusChangeListener = OnFocusChangeListener { view, hasFocus ->
if (hasFocus) hideIme(view)
if (hasFocus) hideKeyBoard(this@MainActivity, view)
}

// Setup default device information.
Expand Down Expand Up @@ -506,14 +499,14 @@ class MainActivity : AppCompatActivity() {
filenameInfo.setTextAnimation(mainViewModel.filename)
filesizeInfo.setTextAnimation(mainViewModel.filesize)
changelogInfo.setTextAnimation(mainViewModel.changelog)
changelogInfo.setCopyClickListener(mainViewModel.changelog)
changelogInfo.setCopyClickListener(this@MainActivity, mainViewModel.changelog)
official.text = mainViewModel.officialText
officialDownload.setDownloadClickListener(mainViewModel.filename, mainViewModel.officialDownload!!)
officialCopy.setCopyClickListener(mainViewModel.officialDownload)
cdn1Download.setDownloadClickListener(mainViewModel.filename, mainViewModel.cdn1Download!!)
cdn1Copy.setCopyClickListener(mainViewModel.cdn1Download)
cdn2Download.setDownloadClickListener(mainViewModel.filename, mainViewModel.cdn2Download!!)
cdn2Copy.setCopyClickListener(mainViewModel.cdn2Download)
officialDownload.setDownloadClickListener(this@MainActivity, mainViewModel.filename, mainViewModel.officialDownload!!)
officialCopy.setCopyClickListener(this@MainActivity, mainViewModel.officialDownload)
cdn1Download.setDownloadClickListener(this@MainActivity, mainViewModel.filename, mainViewModel.cdn1Download!!)
cdn1Copy.setCopyClickListener(this@MainActivity, mainViewModel.cdn1Download)
cdn2Download.setDownloadClickListener(this@MainActivity, mainViewModel.filename, mainViewModel.cdn2Download!!)
cdn2Copy.setCopyClickListener(this@MainActivity, mainViewModel.cdn2Download)
} else {
secondViewArray.forEach {
if (it.isVisible) it.fadOutAnimation()
Expand Down Expand Up @@ -600,64 +593,4 @@ class MainActivity : AppCompatActivity() {
this.layoutParams = layoutParams
}
}

private fun MaterialButton.setDownloadClickListener(fileName: String?, fileLink: String) {
setOnClickListener {
fileName?.let {
hapticConfirm(this)
MaterialAlertDialogBuilder(this@MainActivity).apply {
setTitle(R.string.download_method)
setMessage(R.string.download_method_desc)
setNegativeButton(R.string.android_default) { _, _ ->
hapticConfirm(this@setDownloadClickListener)
downloadRomFile(this@MainActivity, fileLink, it)
}
setPositiveButton(R.string.other) { _, _ ->
hapticConfirm(this@setDownloadClickListener)
Intent().apply {
action = Intent.ACTION_VIEW
data = Uri.parse(fileLink)
flags = Intent.FLAG_ACTIVITY_NEW_TASK
}.let {
this@MainActivity.startActivity(it)
}
}
setNeutralButton(R.string.cancel) { dialog, _ ->
hapticReject(this@setDownloadClickListener)
dialog.dismiss()
}
}.show()
}
}
}

private fun MaterialButton.setCopyClickListener(link: CharSequence?) {
setOnClickListener {
hapticConfirm(this)
copyText(link)
showStringToast(this@MainActivity, getString(R.string.toast_copied_to_pasteboard), 1)
}
}

private fun MaterialTextView.setCopyClickListener(text: CharSequence?) {
setOnClickListener {
hapticConfirm(this)
copyText(text)
showStringToast(this@MainActivity, getString(R.string.toast_copied_to_pasteboard), 1)
}
}

private fun copyText(text: CharSequence?) {
val cm: ClipboardManager = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
cm.setPrimaryClip(ClipData.newPlainText(packageName, text))
}

private fun hideIme(view: View) {
if (AppUtils.atLeast(Build.VERSION_CODES.R)) {
view.windowInsetsController?.hide(WindowInsets.Type.ime())
} else {
val imm = getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(view.windowToken, 0)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,5 @@ class MainViewModel : ViewModel() {
var officialText: String? = null
var cdn1Download: String? = null
var cdn2Download: String? = null
var cdn3Download: String? = null
var changelog: String? = null
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,6 @@ object AnimUtils {
}
}

// ViewExtensions

fun View.fadOutAnimation(duration: Long = 300, visibility: Int = View.GONE, completion: (() -> Unit)? = null) {
animate().alpha(0f).setDuration(duration).withEndAction {
this.visibility = visibility
Expand Down
68 changes: 68 additions & 0 deletions app/src/main/kotlin/top/yukonga/update/logic/utils/AppUtils.kt
Original file line number Diff line number Diff line change
@@ -1,10 +1,26 @@
package top.yukonga.update.logic.utils

import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.content.Intent
import android.content.res.Configuration
import android.content.res.Resources.getSystem
import android.net.Uri
import android.os.Build
import android.util.TypedValue
import android.view.View
import android.view.WindowInsets
import android.view.inputmethod.InputMethodManager
import androidx.appcompat.app.AppCompatActivity.INPUT_METHOD_SERVICE
import com.google.android.material.button.MaterialButton
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import kotlinx.serialization.json.Json
import top.yukonga.miuiStringToast.MiuiStringToast.showStringToast
import top.yukonga.update.R
import top.yukonga.update.logic.utils.FileUtils.downloadRomFile
import top.yukonga.update.logic.utils.HapticUtils.hapticConfirm
import top.yukonga.update.logic.utils.HapticUtils.hapticReject

object AppUtils {

Expand All @@ -18,4 +34,56 @@ object AppUtils {

val Int.px: Int get() = (this / getSystem().displayMetrics.density + 0.5f).toInt()

private fun copyText(context: Context, text: CharSequence?) {
val cm: ClipboardManager = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
cm.setPrimaryClip(ClipData.newPlainText(context.packageName, text))
}

fun hideKeyBoard(context: Context, view: View) {
if (atLeast(Build.VERSION_CODES.R)) {
view.windowInsetsController?.hide(WindowInsets.Type.ime())
} else {
val imm = context.getSystemService(INPUT_METHOD_SERVICE) as InputMethodManager
imm.hideSoftInputFromWindow(view.windowToken, 0)
}
}

fun MaterialButton.setDownloadClickListener(context: Context, fileName: String?, fileLink: String) {
setOnClickListener {
fileName?.let {
hapticConfirm(this)
MaterialAlertDialogBuilder(context).apply {
setTitle(R.string.download_method)
setMessage(R.string.download_method_desc)
setNegativeButton(R.string.android_default) { _, _ ->
hapticConfirm(this@setDownloadClickListener)
downloadRomFile(context, fileLink, it)
}
setPositiveButton(R.string.other) { _, _ ->
hapticConfirm(this@setDownloadClickListener)
Intent().apply {
action = Intent.ACTION_VIEW
data = Uri.parse(fileLink)
flags = Intent.FLAG_ACTIVITY_NEW_TASK
}.let {
context.startActivity(it)
}
}
setNeutralButton(R.string.cancel) { dialog, _ ->
hapticReject(this@setDownloadClickListener)
dialog.dismiss()
}
}.show()
}
}
}

fun View.setCopyClickListener(context: Context, text: CharSequence?) {
setOnClickListener {
hapticConfirm(this)
copyText(context, text)
showStringToast(context, context.getString(R.string.toast_copied_to_pasteboard), 1)
}
}

}

0 comments on commit 16d774a

Please sign in to comment.