diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b6a6fb81a..fd8fcabbc 100755 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -48,7 +48,7 @@ android:name="com.hippo.ehviewer.ui.MainActivity" android:configChanges="screenSize" android:launchMode="singleTask" - android:windowSoftInputMode="stateAlwaysHidden" + android:windowSoftInputMode="adjustResize|stateAlwaysHidden" android:exported="true"> diff --git a/app/src/main/java/com/hippo/ehviewer/WindowInsetsAnimationHelper.java b/app/src/main/java/com/hippo/ehviewer/WindowInsetsAnimationHelper.java index 3eee26637..8053dc9aa 100644 --- a/app/src/main/java/com/hippo/ehviewer/WindowInsetsAnimationHelper.java +++ b/app/src/main/java/com/hippo/ehviewer/WindowInsetsAnimationHelper.java @@ -56,14 +56,22 @@ public class WindowInsetsAnimationHelper extends WindowInsetsAnimationCompat.Cal if (animation == null) { return insets; } - for (View view : views) { - if (view == null) { - continue; + WindowInsetsAnimationCompat imeAnimation = null; + for (WindowInsetsAnimationCompat animation : runningAnimations) { + if ((animation.getTypeMask() & WindowInsetsCompat.Type.ime()) != 0) { + imeAnimation = animation; + break; + } + } + if (imeAnimation != null) { + for (View view : views) { + if (view == null) { + continue; + } + int startPadding = startPaddings.containsKey(view) ? startPaddings.get(view) : 0; + int endPadding = endPaddings.containsKey(view) ? endPaddings.get(view) : 0; + view.setTranslationY(MathUtils.lerp(endPadding - startPadding, 0, animation.getInterpolatedFraction())); } - int startPadding = startPaddings.containsKey(view) ? startPaddings.get(view) : 0; - int endPadding = endPaddings.containsKey(view) ? endPaddings.get(view) : 0; - int offset = MathUtils.lerp(-(startPadding - endPadding), 0, animation.getInterpolatedFraction()); - view.setTranslationY(offset); } return insets; } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/BaseScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/BaseScene.java index 4604e8fcc..44c92ab8d 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/BaseScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/BaseScene.java @@ -34,6 +34,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; import androidx.core.view.WindowInsetsControllerCompat; import androidx.drawerlayout.widget.DrawerLayout; import androidx.fragment.app.FragmentActivity; @@ -185,9 +186,7 @@ public abstract class BaseScene extends SceneFragment { } public void setLightStatusBar(boolean set) { - if (insetsController == null) { - insetsController = ViewCompat.getWindowInsetsController(requireActivity().getWindow().getDecorView()); - } + var insetsController = getInsetsController(); if (insetsController != null) { insetsController.setAppearanceLightStatusBars(set && (requireActivity().getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_YES) <= 0); } @@ -222,7 +221,7 @@ public abstract class BaseScene extends SceneFragment { setNavCheckedItem(getNavCheckedItem()); // Hide soft ime - AppHelper.hideSoftInput(getActivity()); + hideSoftInput(); setLightStatusBar(needWhiteStatusBar); } @@ -247,25 +246,46 @@ public abstract class BaseScene extends SceneFragment { } public void hideSoftInput() { - FragmentActivity activity = getActivity(); - if (null != activity) { - AppHelper.hideSoftInput(activity); + var insetsController = getInsetsController(); + if (insetsController != null) { + insetsController.hide(WindowInsetsCompat.Type.ime()); } } public void showSoftInput(@Nullable View view) { - FragmentActivity activity = getActivity(); - if (null != activity && null != view) { - AppHelper.showSoftInput(activity, view); + if (view != null) { + view.requestFocus(); + view.post(() -> { + var insetsController = getInsetsController(); + if (insetsController != null) { + insetsController.show(WindowInsetsCompat.Type.ime()); + } + }); } } + public WindowInsetsControllerCompat getInsetsController() { + if (insetsController == null) { + var activity = getActivity(); + if (activity != null) { + insetsController = ViewCompat.getWindowInsetsController(activity.getWindow().getDecorView()); + } + } + return insetsController; + } + @Override public void onResume() { super.onResume(); Analytics.onSceneView(this); } + @Override + public void onDestroy() { + super.onDestroy(); + insetsController = null; + } + @Override public void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java index f607b7d67..f7cee84da 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/FavoritesScene.java @@ -75,7 +75,6 @@ import com.hippo.ehviewer.widget.GalleryInfoContentHelper; import com.hippo.ehviewer.widget.SearchBar; import com.hippo.scene.Announcer; import com.hippo.scene.SceneFragment; -import com.hippo.util.AppHelper; import com.hippo.widget.ContentLayout; import com.hippo.widget.FabLayout; import com.hippo.widget.SearchBarMover; @@ -721,7 +720,6 @@ public class FavoritesScene extends BaseScene implements } builder.setError(null); mHelper.goTo(goTo); - AppHelper.hideSoftInput(dialog); dialog.dismiss(); }); } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java index fa808eeaf..7cab58826 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/scene/GalleryListScene.java @@ -104,7 +104,6 @@ import com.hippo.ehviewer.widget.SearchBar; import com.hippo.ehviewer.widget.SearchLayout; import com.hippo.scene.Announcer; import com.hippo.scene.SceneFragment; -import com.hippo.util.AppHelper; import com.hippo.util.ExceptionUtils; import com.hippo.view.BringOutTransition; import com.hippo.view.ViewTransition; @@ -963,7 +962,6 @@ public final class GalleryListScene extends BaseScene } builder.setError(null); mHelper.goTo(goTo); - AppHelper.hideSoftInput(dialog); dialog.dismiss(); }); }