diff --git a/app/src/main/java/org/cssnr/remotewallpaper/ui/dialogs/DialogExtensions.kt b/app/src/main/java/org/cssnr/remotewallpaper/ui/dialogs/DialogExtensions.kt new file mode 100644 index 0000000..672f860 --- /dev/null +++ b/app/src/main/java/org/cssnr/remotewallpaper/ui/dialogs/DialogExtensions.kt @@ -0,0 +1,33 @@ +package org.cssnr.remotewallpaper.ui.dialogs + +import android.app.Dialog +import android.os.Build +import android.view.Window +import android.view.WindowInsets +import android.view.WindowManager + +/** + * Shows the soft keyboard for this dialog window. + * + * Copied from androidx.preference PreferenceDialogFragmentCompat.requestInputMethod() + * which is how EditTextPreference dialogs shows the keyboard when a dialog is shown. + * + * https://github.com/androidx/androidx/blob/androidx-main/preference/preference/src/main/java/androidx/preference/PreferenceDialogFragmentCompat.java + * + * AI NOTE: Call AFTER create() and BEFORE show() (like the library calls requestInputMethod + * in onCreateDialog). The focused editor and window flags must be in place before the + * dialog window gains focus or the keyboard will not show reliably. + */ +fun Dialog.showKeyboard() { + val window: Window = window ?: return + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + // Same as androidx.preference Api30Impl.showIme(window) + window.decorView.windowInsetsController?.show(WindowInsets.Type.ime()) + } else { + // NOTE: or SOFT_INPUT_ADJUST_PAN to prevent dialog shrinking + window.setSoftInputMode( + WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE or + WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN + ) + } +} diff --git a/app/src/main/java/org/cssnr/remotewallpaper/ui/home/HomeFragment.kt b/app/src/main/java/org/cssnr/remotewallpaper/ui/home/HomeFragment.kt index 6b5ab2f..6940817 100644 --- a/app/src/main/java/org/cssnr/remotewallpaper/ui/home/HomeFragment.kt +++ b/app/src/main/java/org/cssnr/remotewallpaper/ui/home/HomeFragment.kt @@ -34,6 +34,7 @@ import org.cssnr.remotewallpaper.db.HistoryDatabase import org.cssnr.remotewallpaper.db.HistoryItem import org.cssnr.remotewallpaper.db.Remote import org.cssnr.remotewallpaper.db.RemoteDatabase +import org.cssnr.remotewallpaper.ui.dialogs.showKeyboard import java.io.File import java.io.FileOutputStream import java.time.ZonedDateTime @@ -180,7 +181,6 @@ fun Context.showAddDialog() { .create() dialog.setOnShowListener { - input.requestFocus() val sendButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE) sendButton.setOnClickListener { sendButton.isEnabled = false @@ -206,6 +206,9 @@ fun Context.showAddDialog() { } dialog.setButton(AlertDialog.BUTTON_POSITIVE, "Set Image") { _, _ -> } + + dialog.showKeyboard() + input.requestFocus() dialog.show() } diff --git a/app/src/main/java/org/cssnr/remotewallpaper/ui/remotes/RemotesFragment.kt b/app/src/main/java/org/cssnr/remotewallpaper/ui/remotes/RemotesFragment.kt index 9522143..0382bb3 100644 --- a/app/src/main/java/org/cssnr/remotewallpaper/ui/remotes/RemotesFragment.kt +++ b/app/src/main/java/org/cssnr/remotewallpaper/ui/remotes/RemotesFragment.kt @@ -23,6 +23,7 @@ import org.cssnr.remotewallpaper.R import org.cssnr.remotewallpaper.databinding.FragmentRemotesBinding import org.cssnr.remotewallpaper.db.Remote import org.cssnr.remotewallpaper.db.RemoteDatabase +import org.cssnr.remotewallpaper.ui.dialogs.showKeyboard const val LOG_TAG = "Remotes" @@ -172,7 +173,6 @@ class RemotesFragment : Fragment() { .create() dialog.setOnShowListener { - input.requestFocus() val sendButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE) sendButton.setOnClickListener { sendButton.isEnabled = false @@ -208,6 +208,9 @@ class RemotesFragment : Fragment() { } dialog.setButton(AlertDialog.BUTTON_POSITIVE, "Add") { _, _ -> } + + dialog.showKeyboard() + input.requestFocus() dialog.show() } diff --git a/app/src/main/java/org/cssnr/remotewallpaper/ui/settings/SettingsFragment.kt b/app/src/main/java/org/cssnr/remotewallpaper/ui/settings/SettingsFragment.kt index f12a829..6b8f345 100644 --- a/app/src/main/java/org/cssnr/remotewallpaper/ui/settings/SettingsFragment.kt +++ b/app/src/main/java/org/cssnr/remotewallpaper/ui/settings/SettingsFragment.kt @@ -28,6 +28,7 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.cssnr.remotewallpaper.R import org.cssnr.remotewallpaper.api.FeedbackApi +import org.cssnr.remotewallpaper.ui.dialogs.showKeyboard import org.cssnr.remotewallpaper.work.enqueueWorkRequest class SettingsFragment : PreferenceFragmentCompat() { @@ -212,8 +213,10 @@ class SettingsFragment : PreferenceFragmentCompat() { input.error = "Feedback is Required" } } - input.requestFocus() } + + dialog.showKeyboard() + input.requestFocus() dialog.show() }