From 6464307c7dacb0509a49866dd4edf67c9e4c1450 Mon Sep 17 00:00:00 2001 From: Karim Abou Zeid Date: Sat, 25 Aug 2018 15:14:35 +0200 Subject: [PATCH] Notch support via WindowInsets --- .../ui/activities/MainActivity.java | 13 +- .../mainactivity/AbsMainActivityFragment.java | 25 ---- .../mainactivity/folders/FoldersFragment.java | 2 +- .../mainactivity/library/LibraryFragment.java | 2 +- .../player/card/CardPlayerFragment.java | 11 +- .../views/StatusBarMarginFrameLayout.java | 33 +++++ .../gramophone/views/StatusBarView.java | 25 ++-- .../res/layout-land/fragment_card_player.xml | 5 +- .../res/layout-land/fragment_flat_player.xml | 4 +- .../main/res/layout/activity_main_content.xml | 23 +++- .../layout/activity_main_drawer_layout.xml | 8 +- .../main/res/layout/fragment_card_player.xml | 14 +- app/src/main/res/layout/fragment_folder.xml | 123 ++++++++---------- app/src/main/res/layout/fragment_library.xml | 77 +++++------ build.gradle | 2 +- 15 files changed, 170 insertions(+), 197 deletions(-) create mode 100644 app/src/main/java/com/kabouzeid/gramophone/views/StatusBarMarginFrameLayout.java diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java index 0dfe27df..adaef870 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/activities/MainActivity.java @@ -43,7 +43,6 @@ import com.kabouzeid.gramophone.ui.activities.intro.AppIntroActivity; import com.kabouzeid.gramophone.ui.fragments.mainactivity.folders.FoldersFragment; import com.kabouzeid.gramophone.ui.fragments.mainactivity.library.LibraryFragment; import com.kabouzeid.gramophone.util.PreferenceUtil; -import com.kabouzeid.gramophone.util.Util; import com.sothree.slidinguppanel.SlidingUpPanelLayout; import java.util.ArrayList; @@ -76,19 +75,11 @@ public class MainActivity extends AbsSlidingMusicPanelActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setDrawUnderStatusbar(true); ButterKnife.bind(this); if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT) { - Util.setStatusBarTranslucent(getWindow()); - drawerLayout.setFitsSystemWindows(false); - navigationView.setFitsSystemWindows(false); - //noinspection ConstantConditions - findViewById(R.id.drawer_content_container).setFitsSystemWindows(false); - } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - drawerLayout.setOnApplyWindowInsetsListener((view, windowInsets) -> { - navigationView.dispatchApplyWindowInsets(windowInsets); - return windowInsets.replaceSystemWindowInsets(0, 0, 0, 0); - }); + navigationView.setFitsSystemWindows(false); // for header to go below statusbar } setUpDrawerLayout(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/AbsMainActivityFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/AbsMainActivityFragment.java index 9c7a3e0e..104f68c9 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/AbsMainActivityFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/AbsMainActivityFragment.java @@ -1,13 +1,8 @@ package com.kabouzeid.gramophone.ui.fragments.mainactivity; -import android.os.Build; import android.os.Bundle; import android.support.v4.app.Fragment; -import android.view.View; -import com.kabouzeid.appthemehelper.ThemeStore; -import com.kabouzeid.appthemehelper.util.ColorUtil; -import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.ui.activities.MainActivity; /** @@ -24,24 +19,4 @@ public abstract class AbsMainActivityFragment extends Fragment { super.onActivityCreated(savedInstanceState); setHasOptionsMenu(true); } - - // WORKAROUND - public void setStatusbarColor(View view, int color) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { - final View statusBar = view.findViewById(R.id.status_bar); - if (statusBar != null) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - statusBar.setBackgroundColor(ColorUtil.darkenColor(color)); - getMainActivity().setLightStatusbarAuto(color); - } else { - statusBar.setBackgroundColor(color); - } - } - } - } - - public void setStatusbarColorAuto(View view) { - // we don't want to use statusbar color because we are doing the color darkening on our own to support KitKat - setStatusbarColor(view, ThemeStore.primaryColor(getContext())); - } } diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/folders/FoldersFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/folders/FoldersFragment.java index ca3d44f4..4d136e7a 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/folders/FoldersFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/folders/FoldersFragment.java @@ -156,7 +156,7 @@ public class FoldersFragment extends AbsMainActivityFragment implements MainActi @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { - setStatusbarColorAuto(view); + getMainActivity().setStatusbarColorAuto(); getMainActivity().setNavigationbarColorAuto(); getMainActivity().setTaskDescriptionColorAuto(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/LibraryFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/LibraryFragment.java index 6991be37..1e11b85e 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/LibraryFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/mainactivity/library/LibraryFragment.java @@ -90,7 +90,7 @@ public class LibraryFragment extends AbsMainActivityFragment implements CabHolde @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { PreferenceUtil.getInstance(getActivity()).registerOnSharedPreferenceChangedListener(this); - setStatusbarColorAuto(view); + getMainActivity().setStatusbarColorAuto(); getMainActivity().setNavigationbarColorAuto(); getMainActivity().setTaskDescriptionColorAuto(); diff --git a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/card/CardPlayerFragment.java b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/card/CardPlayerFragment.java index 71f82728..62a3e86b 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/card/CardPlayerFragment.java +++ b/app/src/main/java/com/kabouzeid/gramophone/ui/fragments/player/card/CardPlayerFragment.java @@ -463,10 +463,9 @@ public class CardPlayerFragment extends AbsPlayerFragment implements PlayerAlbum public AnimatorSet createDefaultColorChangeAnimatorSet(int newColor) { Animator backgroundAnimator; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - int topMargin = fragment.getResources().getDimensionPixelSize(R.dimen.status_bar_padding); //noinspection ConstantConditions int x = (int) (fragment.playbackControlsFragment.playPauseFab.getX() + fragment.playbackControlsFragment.playPauseFab.getWidth() / 2 + fragment.playbackControlsFragment.getView().getX()); - int y = (int) (topMargin + fragment.playbackControlsFragment.playPauseFab.getY() + fragment.playbackControlsFragment.playPauseFab.getHeight() / 2 + fragment.playbackControlsFragment.getView().getY()); + int y = (int) (fragment.playbackControlsFragment.playPauseFab.getY() + fragment.playbackControlsFragment.playPauseFab.getHeight() / 2 + fragment.playbackControlsFragment.getView().getY() + fragment.playbackControlsFragment.progressSlider.getHeight()); float startRadius = Math.max(fragment.playbackControlsFragment.playPauseFab.getWidth() / 2, fragment.playbackControlsFragment.playPauseFab.getHeight() / 2); float endRadius = Math.max(fragment.colorBackground.getWidth(), fragment.colorBackground.getHeight()); fragment.colorBackground.setBackgroundColor(newColor); @@ -552,10 +551,9 @@ public class CardPlayerFragment extends AbsPlayerFragment implements PlayerAlbum @Override public void setUpPanelAndAlbumCoverHeight() { WidthFitSquareLayout albumCoverContainer = fragment.getView().findViewById(R.id.album_cover_container); - int topMargin = fragment.getResources().getDimensionPixelSize(R.dimen.status_bar_padding); - final int availablePanelHeight = fragment.slidingUpPanelLayout.getHeight() - fragment.getView().findViewById(R.id.player_content).getHeight() + topMargin; - final int minPanelHeight = (int) ViewUtil.convertDpToPixel(72 + 24, fragment.getResources()) + topMargin; + final int availablePanelHeight = fragment.slidingUpPanelLayout.getHeight() - fragment.getView().findViewById(R.id.player_content).getHeight() + (int) ViewUtil.convertDpToPixel(8, fragment.getResources()); + final int minPanelHeight = (int) ViewUtil.convertDpToPixel(72 + 24, fragment.getResources()); if (availablePanelHeight < minPanelHeight) { albumCoverContainer.getLayoutParams().height = albumCoverContainer.getHeight() - (minPanelHeight - availablePanelHeight); albumCoverContainer.forceSquare(false); @@ -595,8 +593,7 @@ public class CardPlayerFragment extends AbsPlayerFragment implements PlayerAlbum @Override public void setUpPanelAndAlbumCoverHeight() { - int topMargin = fragment.getResources().getDimensionPixelSize(R.dimen.status_bar_padding); - int panelHeight = fragment.slidingUpPanelLayout.getHeight() - fragment.playbackControlsFragment.getView().getHeight() + topMargin; + int panelHeight = fragment.slidingUpPanelLayout.getHeight() - fragment.playbackControlsFragment.getView().getHeight(); fragment.slidingUpPanelLayout.setPanelHeight(panelHeight); ((AbsSlidingMusicPanelActivity) fragment.getActivity()).setAntiDragView(fragment.slidingUpPanelLayout.findViewById(R.id.player_panel)); diff --git a/app/src/main/java/com/kabouzeid/gramophone/views/StatusBarMarginFrameLayout.java b/app/src/main/java/com/kabouzeid/gramophone/views/StatusBarMarginFrameLayout.java new file mode 100644 index 00000000..878cab91 --- /dev/null +++ b/app/src/main/java/com/kabouzeid/gramophone/views/StatusBarMarginFrameLayout.java @@ -0,0 +1,33 @@ +package com.kabouzeid.gramophone.views; + +import android.content.Context; +import android.os.Build; +import android.util.AttributeSet; +import android.view.WindowInsets; +import android.widget.FrameLayout; + +public class StatusBarMarginFrameLayout extends FrameLayout { + + + public StatusBarMarginFrameLayout(Context context) { + super(context); + } + + public StatusBarMarginFrameLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public StatusBarMarginFrameLayout(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + public WindowInsets onApplyWindowInsets(WindowInsets insets) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + MarginLayoutParams lp = (MarginLayoutParams) getLayoutParams(); + lp.topMargin = insets.getSystemWindowInsetTop(); + setLayoutParams(lp); + } + return super.onApplyWindowInsets(insets); + } +} diff --git a/app/src/main/java/com/kabouzeid/gramophone/views/StatusBarView.java b/app/src/main/java/com/kabouzeid/gramophone/views/StatusBarView.java index 07a2587a..46c3d1fd 100644 --- a/app/src/main/java/com/kabouzeid/gramophone/views/StatusBarView.java +++ b/app/src/main/java/com/kabouzeid/gramophone/views/StatusBarView.java @@ -1,13 +1,11 @@ package com.kabouzeid.gramophone.views; import android.content.Context; -import android.content.res.Resources; +import android.os.Build; import android.util.AttributeSet; import android.view.View; - -/* - This is a temporally fix -*/ +import android.view.ViewGroup; +import android.view.WindowInsets; public class StatusBarView extends View { @@ -25,17 +23,12 @@ public class StatusBarView extends View { } @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - setMeasuredDimension( - MeasureSpec.getSize(widthMeasureSpec), getStatusBarHeight(getResources())); - } - - public static int getStatusBarHeight(Resources r) { - int result = 0; - int resourceId = r.getIdentifier("status_bar_height", "dimen", "android"); - if (resourceId > 0) { - result = r.getDimensionPixelSize(resourceId); + public WindowInsets onApplyWindowInsets(WindowInsets insets) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { + ViewGroup.LayoutParams lp = getLayoutParams(); + lp.height = insets.getSystemWindowInsetTop(); + setLayoutParams(lp); } - return result; + return super.onApplyWindowInsets(insets); } } diff --git a/app/src/main/res/layout-land/fragment_card_player.xml b/app/src/main/res/layout-land/fragment_card_player.xml index 813846de..51886f1c 100644 --- a/app/src/main/res/layout-land/fragment_card_player.xml +++ b/app/src/main/res/layout-land/fragment_card_player.xml @@ -70,6 +70,7 @@ @@ -78,10 +79,10 @@ android:id="@+id/playing_queue_card" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="16dp" + android:layout_marginBottom="-8dp" android:layout_marginLeft="16dp" android:layout_marginRight="16dp" - android:layout_marginTop="@dimen/status_bar_padding" + android:layout_marginTop="0dp" app:cardBackgroundColor="?cardBackgroundColor" app:cardElevation="@dimen/card_elevation" app:cardUseCompatPadding="false"> diff --git a/app/src/main/res/layout-land/fragment_flat_player.xml b/app/src/main/res/layout-land/fragment_flat_player.xml index 6762967e..65a8a1df 100644 --- a/app/src/main/res/layout-land/fragment_flat_player.xml +++ b/app/src/main/res/layout-land/fragment_flat_player.xml @@ -11,12 +11,12 @@ android:elevation="@dimen/toolbar_elevation" tools:ignore="UnusedAttribute"> - - diff --git a/app/src/main/res/layout/activity_main_content.xml b/app/src/main/res/layout/activity_main_content.xml index a9ee9c50..a9e82bc6 100644 --- a/app/src/main/res/layout/activity_main_content.xml +++ b/app/src/main/res/layout/activity_main_content.xml @@ -1,5 +1,22 @@ - \ No newline at end of file + android:layout_height="match_parent" + android:orientation="vertical"> + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main_drawer_layout.xml b/app/src/main/res/layout/activity_main_drawer_layout.xml index ead1e1e6..f70e5345 100644 --- a/app/src/main/res/layout/activity_main_drawer_layout.xml +++ b/app/src/main/res/layout/activity_main_drawer_layout.xml @@ -3,14 +3,12 @@ xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/drawer_layout" android:layout_width="match_parent" - android:layout_height="match_parent" - android:fitsSystemWindows="true"> + android:layout_height="match_parent"> - + android:layout_height="match_parent" /> + android:layout_height="@dimen/status_bar_padding" /> - + android:layout_height="wrap_content" + android:layout_marginTop="@dimen/status_bar_padding" + android:orientation="vertical"> @@ -149,7 +151,7 @@ - + diff --git a/app/src/main/res/layout/fragment_folder.xml b/app/src/main/res/layout/fragment_folder.xml index 11840e70..c8768820 100644 --- a/app/src/main/res/layout/fragment_folder.xml +++ b/app/src/main/res/layout/fragment_folder.xml @@ -1,89 +1,72 @@ - - - - - - - - - + app:layout_scrollFlags="scroll|enterAlways"> - + + + + - - - - - - - - - - - - - - - - - - + android:layout_height="?attr/actionBarSize" /> - + - + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_library.xml b/app/src/main/res/layout/fragment_library.xml index e402e90f..255b237a 100644 --- a/app/src/main/res/layout/fragment_library.xml +++ b/app/src/main/res/layout/fragment_library.xml @@ -1,67 +1,50 @@ - - - - - - - - - + app:layout_scrollFlags="scroll|enterAlways"> - + + + + + android:layout_height="?attr/actionBarSize" /> - + - - - - - - - - - - - + android:layout_height="@dimen/tab_height" + app:tabContentStart="72dp" + app:tabMode="scrollable" /> - + - + + + diff --git a/build.gradle b/build.gradle index 1728dd71..275d16f8 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.3' + classpath 'com.android.tools.build:gradle:3.1.4' } }