diff --git a/app/src/main/java/com/topjohnwu/magisk/extensions/XString.kt b/app/src/main/java/com/topjohnwu/magisk/extensions/XString.kt index fb0a65840..ee2d279e2 100644 --- a/app/src/main/java/com/topjohnwu/magisk/extensions/XString.kt +++ b/app/src/main/java/com/topjohnwu/magisk/extensions/XString.kt @@ -25,3 +25,5 @@ fun String.trimEmptyToNull(): String? = if (isBlank()) null else this fun String.legalFilename() = replace(" ", "_").replace("'", "").replace("\"", "") .replace("$", "").replace("`", "").replace("*", "").replace("/", "_") .replace("#", "").replace("@", "").replace("\\", "_") + +fun String.isEmptyInternal() = isNullOrBlank() \ No newline at end of file diff --git a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.kt b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.kt index 9da82ee24..3a4012d1b 100644 --- a/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/com/topjohnwu/magisk/ui/settings/SettingsFragment.kt @@ -17,6 +17,7 @@ import com.topjohnwu.magisk.* import com.topjohnwu.magisk.base.BasePreferenceFragment import com.topjohnwu.magisk.data.database.RepoDao import com.topjohnwu.magisk.databinding.CustomDownloadDialogBinding +import com.topjohnwu.magisk.databinding.DialogCustomNameBinding import com.topjohnwu.magisk.extensions.subscribeK import com.topjohnwu.magisk.extensions.toLangTag import com.topjohnwu.magisk.model.download.DownloadService @@ -67,8 +68,9 @@ class SettingsFragment : BasePreferenceFragment() { val suCategory = findPreference("superuser")!! val hideManager = findPreference("hide")!! hideManager.setOnPreferenceClickListener { - // TODO: Add UI to allow user to customize app name - PatchAPK.hideManager(requireContext(), "Manager") + showManagerNameDialog { + PatchAPK.hideManager(requireContext(), "Manager") + } true } val restoreManager = findPreference("restore") @@ -224,26 +226,26 @@ class SettingsFragment : BasePreferenceFragment() { private fun setLocalePreference(lp: ListPreference) { lp.isEnabled = false availableLocales.map { - val names = mutableListOf() - val values = mutableListOf() + val names = mutableListOf() + val values = mutableListOf() - names.add( - ResourceMgr.getString(defaultLocale, R.string.system_default) - ) - values.add("") + names.add( + ResourceMgr.getString(defaultLocale, R.string.system_default) + ) + values.add("") - it.forEach { locale -> - names.add(locale.getDisplayName(locale)) - values.add(locale.toLangTag()) - } - - Pair(names.toTypedArray(), values.toTypedArray()) - }.subscribeK { (names, values) -> - lp.isEnabled = true - lp.entries = names - lp.entryValues = values - lp.summary = currentLocale.getDisplayName(currentLocale) + it.forEach { locale -> + names.add(locale.getDisplayName(locale)) + values.add(locale.toLangTag()) } + + Pair(names.toTypedArray(), values.toTypedArray()) + }.subscribeK { (names, values) -> + lp.isEnabled = true + lp.entries = names + lp.entryValues = values + lp.summary = currentLocale.getDisplayName(currentLocale) + } } private fun setSummary(key: String) { @@ -327,4 +329,27 @@ class SettingsFragment : BasePreferenceFragment() { .setNegativeButton(R.string.close, null) .show() } + + private inline fun showManagerNameDialog( + crossinline onSuccess: (String) -> Unit + ) { + val data = ManagerNameData() + val view = DialogCustomNameBinding + .inflate(LayoutInflater.from(requireContext())) + .also { it.data = data } + + AlertDialog.Builder(requireActivity()) + .setTitle(R.string.settings_app_name) + .setView(view.root) + .setPositiveButton(R.string.ok) { _, _ -> + if (view.dialogNameInput.error.isNullOrBlank()) { + onSuccess(data.name.value) + } + } + .show() + } + + inner class ManagerNameData { + val name = KObservableField(resources.getString(R.string.re_app_name)) + } } diff --git a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt index 17b0a2552..c1304aaff 100644 --- a/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt +++ b/app/src/main/java/com/topjohnwu/magisk/utils/DataBindingAdapters.kt @@ -16,6 +16,7 @@ import androidx.recyclerview.widget.RecyclerView import androidx.viewpager.widget.ViewPager import com.google.android.material.floatingactionbutton.FloatingActionButton import com.google.android.material.navigation.NavigationView +import com.google.android.material.textfield.TextInputLayout import com.topjohnwu.magisk.R import com.topjohnwu.magisk.extensions.replaceRandomWithSpecial import com.topjohnwu.magisk.extensions.subscribeK @@ -220,4 +221,11 @@ fun getScrollPosition(view: RecyclerView) = (view.layoutManager as? LinearLayout @BindingAdapter("isEnabled") fun setEnabled(view: View, isEnabled: Boolean) { view.isEnabled = isEnabled +} + +@BindingAdapter("error") +fun TextInputLayout.setErrorString(error: String) { + val newError = error.let { if (it.isEmpty()) null else it } + if (this.error == null && newError == null) return + this.error = newError } \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_custom_name.xml b/app/src/main/res/layout/dialog_custom_name.xml new file mode 100644 index 000000000..45d4ffafd --- /dev/null +++ b/app/src/main/res/layout/dialog_custom_name.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a73bd0dd5..664976811 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -150,6 +150,10 @@ Systemless hosts support for Adblock apps. Added systemless hosts module + Type desired app name + New name + App will be repackaged to this name + Invalid format Apps and ADB Apps only ADB only