From 6e01a5938c40f9f2d055ad877bf62593c71b83a2 Mon Sep 17 00:00:00 2001 From: NekoInverter <7741672-NekoInverter@users.noreply.gitlab.com> Date: Thu, 21 Jan 2021 16:03:07 +0800 Subject: [PATCH] Handle insets for preferences --- .../hippo/ehviewer/ui/SettingsActivity.java | 23 +++++- .../hippo/ehviewer/ui/ToolbarActivity.java | 75 ------------------- .../ehviewer/ui/fragment/BaseFragment.java | 22 ++++++ .../ui/fragment/BasePreferenceFragment.java | 26 +++++++ .../main/res/layout/activity_preference.xml | 22 +++++- app/src/main/res/layout/activity_toolbar.xml | 20 ----- .../main/res/layout/widget_content_layout.xml | 3 +- 7 files changed, 90 insertions(+), 101 deletions(-) delete mode 100644 app/src/main/java/com/hippo/ehviewer/ui/ToolbarActivity.java delete mode 100644 app/src/main/res/layout/activity_toolbar.xml diff --git a/app/src/main/java/com/hippo/ehviewer/ui/SettingsActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/SettingsActivity.java index 665495f92..03efc9b92 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/SettingsActivity.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/SettingsActivity.java @@ -16,30 +16,47 @@ package com.hippo.ehviewer.ui; +import android.os.Build; import android.os.Bundle; import android.view.MenuItem; import androidx.annotation.StringRes; +import androidx.appcompat.app.ActionBar; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowCompat; +import androidx.core.view.WindowInsetsCompat; import com.google.android.material.snackbar.Snackbar; import com.hippo.ehviewer.R; import com.hippo.ehviewer.ui.fragment.SettingsFragment; import com.hippo.ehviewer.ui.scene.BaseScene; -public final class SettingsActivity extends ToolbarActivity { +public final class SettingsActivity extends EhActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_preference); - setTitle(R.string.settings); - setNavigationIcon(R.drawable.v_arrow_left_dark_x24); + setSupportActionBar(findViewById(R.id.toolbar)); + ActionBar bar = getSupportActionBar(); + if (bar != null) { + bar.setDisplayHomeAsUpEnabled(true); + } if (savedInstanceState == null) { getSupportFragmentManager() .beginTransaction() .replace(R.id.fragment, new SettingsFragment()) .commitAllowingStateLoss(); } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + WindowCompat.setDecorFitsSystemWindows(getWindow(), false); + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.snackbar), (v, insets) -> { + Insets insets1 = insets.getInsets(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.ime()); + v.setPadding(insets1.left, insets1.top, insets1.right, 0); + return insets; + }); + } } public void showTip(@StringRes int id, int length) { diff --git a/app/src/main/java/com/hippo/ehviewer/ui/ToolbarActivity.java b/app/src/main/java/com/hippo/ehviewer/ui/ToolbarActivity.java deleted file mode 100644 index a87196323..000000000 --- a/app/src/main/java/com/hippo/ehviewer/ui/ToolbarActivity.java +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright 2016 Hippo Seven - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.hippo.ehviewer.ui; - -import android.graphics.drawable.Drawable; -import android.view.View; -import android.view.ViewGroup; - -import androidx.annotation.DrawableRes; -import androidx.annotation.LayoutRes; -import androidx.annotation.Nullable; -import androidx.annotation.StringRes; -import androidx.appcompat.app.ActionBar; -import androidx.appcompat.widget.Toolbar; - -import com.hippo.ehviewer.R; - -public abstract class ToolbarActivity extends EhActivity { - - @Override - public void setContentView(@LayoutRes int layoutResID) { - super.setContentView(R.layout.activity_toolbar); - getLayoutInflater().inflate(layoutResID, findViewById(R.id.content_panel), true); - setSupportActionBar(findViewById(R.id.toolbar)); - } - - @Override - public void setContentView(View view) { - super.setContentView(R.layout.activity_toolbar); - ((ViewGroup) findViewById(R.id.content_panel)).addView(view); - setSupportActionBar(findViewById(R.id.toolbar)); - } - - @Override - public void setContentView(View view, ViewGroup.LayoutParams params) { - super.setContentView(R.layout.activity_toolbar); - ((ViewGroup) findViewById(R.id.content_panel)).addView(view, params); - setSupportActionBar(findViewById(R.id.toolbar)); - } - - public void setNavigationIcon(@DrawableRes int resId) { - View toolbar = findViewById(R.id.toolbar); - if (toolbar != null) { - ((Toolbar) toolbar).setNavigationIcon(resId); - } - } - - public void setNavigationIcon(@Nullable Drawable icon) { - View toolbar = findViewById(R.id.toolbar); - if (toolbar != null) { - ((Toolbar) toolbar).setNavigationIcon(icon); - } - } - - public void setTitle(@StringRes int string) { - ActionBar actionBar = getSupportActionBar(); - if (actionBar != null) { - actionBar.setTitle(string); - } - } -} diff --git a/app/src/main/java/com/hippo/ehviewer/ui/fragment/BaseFragment.java b/app/src/main/java/com/hippo/ehviewer/ui/fragment/BaseFragment.java index a45e36a0a..1a2ff8d86 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/fragment/BaseFragment.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/fragment/BaseFragment.java @@ -1,7 +1,17 @@ package com.hippo.ehviewer.ui.fragment; +import android.os.Build; +import android.os.Bundle; +import android.view.View; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; import androidx.annotation.StringRes; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; import androidx.fragment.app.Fragment; +import androidx.recyclerview.widget.RecyclerView; import com.hippo.ehviewer.ui.SettingsActivity; @@ -28,4 +38,16 @@ public class BaseFragment extends Fragment { public void showTip(CharSequence message, int length) { ((SettingsActivity) requireActivity()).showTip(message, length); } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + ViewCompat.setOnApplyWindowInsetsListener(view, (v, insets) -> { + Insets insets1 = insets.getInsets(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.ime()); + v.setPadding(0, 0, 0, insets1.bottom); + return WindowInsetsCompat.CONSUMED; + }); + } + } } diff --git a/app/src/main/java/com/hippo/ehviewer/ui/fragment/BasePreferenceFragment.java b/app/src/main/java/com/hippo/ehviewer/ui/fragment/BasePreferenceFragment.java index 152b646e5..476a8800f 100644 --- a/app/src/main/java/com/hippo/ehviewer/ui/fragment/BasePreferenceFragment.java +++ b/app/src/main/java/com/hippo/ehviewer/ui/fragment/BasePreferenceFragment.java @@ -1,11 +1,22 @@ package com.hippo.ehviewer.ui.fragment; +import android.os.Build; import android.os.Bundle; +import android.view.View; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.StringRes; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowCompat; +import androidx.core.view.WindowInsetsCompat; import androidx.preference.Preference; +import androidx.recyclerview.widget.RecyclerView; +import com.hippo.ehviewer.R; import com.hippo.ehviewer.ui.SettingsActivity; import com.takisoft.preferencex.PreferenceFragmentCompat; @@ -48,4 +59,19 @@ public class BasePreferenceFragment extends PreferenceFragmentCompat public void showTip(CharSequence message, int length) { ((SettingsActivity) requireActivity()).showTip(message, length); } + + @Override + public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + RecyclerView recyclerView = getListView(); + recyclerView.setClipToPadding(false); + recyclerView.setClipChildren(false); + ViewCompat.setOnApplyWindowInsetsListener(recyclerView, (v, insets) -> { + Insets insets1 = insets.getInsets(WindowInsetsCompat.Type.systemBars() | WindowInsetsCompat.Type.ime()); + v.setPadding(0, 0, 0, insets1.bottom); + return WindowInsetsCompat.CONSUMED; + }); + } + } } diff --git a/app/src/main/res/layout/activity_preference.xml b/app/src/main/res/layout/activity_preference.xml index 8913b5107..4886a4a8e 100644 --- a/app/src/main/res/layout/activity_preference.xml +++ b/app/src/main/res/layout/activity_preference.xml @@ -1,11 +1,29 @@ + android:layout_height="match_parent" + android:clipChildren="false"> + + + + + + android:layout_height="match_parent" + android:clipChildren="false" + app:layout_behavior="@string/appbar_scrolling_view_behavior" /> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_toolbar.xml b/app/src/main/res/layout/activity_toolbar.xml deleted file mode 100644 index 1891bcf7a..000000000 --- a/app/src/main/res/layout/activity_toolbar.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - diff --git a/app/src/main/res/layout/widget_content_layout.xml b/app/src/main/res/layout/widget_content_layout.xml index 69b2ebfe2..54426a975 100644 --- a/app/src/main/res/layout/widget_content_layout.xml +++ b/app/src/main/res/layout/widget_content_layout.xml @@ -57,7 +57,8 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:indeterminate="true" - android:layout_gravity="bottom" /> + android:layout_gravity="bottom" + android:visibility="gone" />