From d09d3d153dbf08e8f177d246cd8927b1edb69bd1 Mon Sep 17 00:00:00 2001 From: Yoshihide Sogawa <12043975+YoshihideSogawa@users.noreply.github.com> Date: Tue, 25 Sep 2018 11:13:35 +0900 Subject: [PATCH 1/9] Update SDK - use support library 28.0.0 --- build.gradle | 2 +- library/build.gradle | 10 ++++------ sample/build.gradle | 4 +--- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/build.gradle b/build.gradle index 1c4196e..11f6a11 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ buildscript { google() } dependencies { - classpath 'com.android.tools.build:gradle:3.3.0-alpha11' + classpath 'com.android.tools.build:gradle:3.2.0' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.3' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/library/build.gradle b/library/build.gradle index 4360def..1a38089 100644 --- a/library/build.gradle +++ b/library/build.gradle @@ -2,8 +2,6 @@ apply plugin: 'com.android.library' android { compileSdkVersion 28 - buildToolsVersion '28.0.2' - defaultConfig { minSdkVersion 14 targetSdkVersion 28 @@ -13,9 +11,9 @@ android { } dependencies { - implementation 'com.android.support:support-annotations:28.0.0-rc02' - implementation 'com.android.support:support-compat:28.0.0-rc02' - implementation 'com.android.support:support-dynamic-animation:28.0.0-rc02' + implementation 'com.android.support:support-annotations:28.0.0' + implementation 'com.android.support:support-compat:28.0.0' + implementation 'com.android.support:support-dynamic-animation:28.0.0' } // build a jar with source files @@ -25,7 +23,7 @@ task sourcesJar(type: Jar) { } task javadoc(type: Javadoc) { - failOnError false + failOnError false source = android.sourceSets.main.java.sourceFiles classpath += project.files(android.getBootClasspath().join(File.pathSeparator)) } diff --git a/sample/build.gradle b/sample/build.gradle index 6720294..5b141aa 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -2,8 +2,6 @@ apply plugin: 'com.android.application' android { compileSdkVersion 28 - buildToolsVersion '28.0.2' - defaultConfig { applicationId "jp.co.recruit.floatingview" minSdkVersion 14 @@ -21,6 +19,6 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'com.android.support:preference-v14:28.0.0-rc02' + implementation 'com.android.support:preference-v14:28.0.0' implementation project(':library') } From 88a6d481aabc56356fbb49bc08ea9cf3200fbae1 Mon Sep 17 00:00:00 2001 From: Yoshihide Sogawa <12043975+YoshihideSogawa@users.noreply.github.com> Date: Tue, 25 Sep 2018 15:26:35 +0900 Subject: [PATCH 2/9] Created a convenient method in FloatingViewManager. --- README.md | 16 +++------- .../floatingview/FloatingViewManager.java | 30 +++++++++++++++-- .../fragment/FloatingViewControlFragment.java | 32 +++++++------------ 3 files changed, 43 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 3a52f10..a1073f8 100644 --- a/README.md +++ b/README.md @@ -123,25 +123,17 @@ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { 9) Add DisplayCutout process(API Level >= 28) -Note: `DisplayCutout` is obtained from `Fragment` or `Activity` (You can not get `DisplayCutout` from `Service`) -Note: You must set the `DisplayCutout` obtained on portrait orientation. -Note: You must not set `windowLayoutInDisplayCutoutMode` to `never` when getting a `DisplayCutout`. +Call `FloatingViewManager.findCutoutSafeArea(activity)`. +Note: Activity must be portrait oriented. +Note: You must not set `windowLayoutInDisplayCutoutMode` to `never`. example) - FloatingViewControlFragment.java ```java -final Rect safeInsetRect = new Rect(); -if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - final DisplayCutout displayCutout = activity.getWindow().getDecorView().getRootWindowInsets().getDisplayCutout(); - if (displayCutout != null) { - safeInsetRect.set(displayCutout.getSafeInsetLeft(), displayCutout.getSafeInsetTop(), displayCutout.getSafeInsetRight(), displayCutout.getSafeInsetBottom()); - } -} - final Intent intent = new Intent(activity, ChatHeadService.class); -intent.putExtra(ChatHeadService.EXTRA_CUTOUT_SAFE_AREA, safeInsetRect); +intent.putExtra(ChatHeadService.EXTRA_CUTOUT_SAFE_AREA, FloatingViewManager.findCutoutSafeArea(activity)); ContextCompat.startForegroundService(activity, intent); ``` diff --git a/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingViewManager.java b/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingViewManager.java index 67c1e6d..bedeacc 100644 --- a/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingViewManager.java +++ b/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingViewManager.java @@ -16,6 +16,7 @@ package jp.co.recruit_lifestyle.android.floatingview; +import android.app.Activity; import android.content.Context; import android.content.res.Configuration; import android.content.res.Resources; @@ -24,7 +25,9 @@ import android.os.Build; import android.support.annotation.DrawableRes; import android.support.annotation.IntDef; +import android.support.annotation.NonNull; import android.util.DisplayMetrics; +import android.view.DisplayCutout; import android.view.HapticFeedbackConstants; import android.view.MotionEvent; import android.view.View; @@ -439,13 +442,13 @@ public void setDisplayMode(@DisplayMode int displayMode) { mDisplayMode = displayMode; // 常に表示/フルスクリーン時に非表示にするモードの場合 if (mDisplayMode == DISPLAY_MODE_SHOW_ALWAYS || mDisplayMode == DISPLAY_MODE_HIDE_FULLSCREEN) { - for (FloatingView floatingView: mFloatingViewList) { + for (FloatingView floatingView : mFloatingViewList) { floatingView.setVisibility(View.VISIBLE); } } // 常に非表示にするモードの場合 else if (mDisplayMode == DISPLAY_MODE_HIDE_ALWAYS) { - for (FloatingView floatingView: mFloatingViewList) { + for (FloatingView floatingView : mFloatingViewList) { floatingView.setVisibility(View.GONE); } mTrashView.dismiss(); @@ -579,6 +582,29 @@ public void removeAllViewToWindow() { mFloatingViewList.clear(); } + /** + * Find the safe area of DisplayCutout. + * + * @param activity {@link Activity} (Portrait and `windowLayoutInDisplayCutoutMode` != never) + * @return Safe cutout insets. + */ + public static Rect findCutoutSafeArea(@NonNull Activity activity) { + final Rect safeInsetRect = new Rect(); + // TODO:Rewrite with android-x + // TODO:Consider alternatives + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.P) { + return safeInsetRect; + } + + // set safeInsetRect + final DisplayCutout displayCutout = activity.getWindow().getDecorView().getRootWindowInsets().getDisplayCutout(); + if (displayCutout != null) { + safeInsetRect.set(displayCutout.getSafeInsetLeft(), displayCutout.getSafeInsetTop(), displayCutout.getSafeInsetRight(), displayCutout.getSafeInsetBottom()); + } + + return safeInsetRect; + } + /** * FloatingViewを貼り付ける際のオプションを表すクラスです。 */ diff --git a/sample/src/main/java/jp/co/recruit_lifestyle/sample/fragment/FloatingViewControlFragment.java b/sample/src/main/java/jp/co/recruit_lifestyle/sample/fragment/FloatingViewControlFragment.java index d3461e5..c02d5fc 100644 --- a/sample/src/main/java/jp/co/recruit_lifestyle/sample/fragment/FloatingViewControlFragment.java +++ b/sample/src/main/java/jp/co/recruit_lifestyle/sample/fragment/FloatingViewControlFragment.java @@ -6,7 +6,6 @@ import android.content.Context; import android.content.Intent; import android.content.res.Configuration; -import android.graphics.Rect; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -15,13 +14,13 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentTransaction; import android.support.v4.content.ContextCompat; -import android.view.DisplayCutout; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; import jp.co.recruit.floatingview.R; +import jp.co.recruit_lifestyle.android.floatingview.FloatingViewManager; import jp.co.recruit_lifestyle.sample.service.ChatHeadService; import jp.co.recruit_lifestyle.sample.service.CustomFloatingViewService; @@ -143,35 +142,26 @@ private void showFloatingView(Context context, boolean isShowOverlayPermission, * @param isCustomFloatingView If true, it launches CustomFloatingViewService. */ private static void startFloatingViewService(Activity activity, boolean isCustomFloatingView) { - // set safe inset area - final Rect safeInsetRect = new Rect(); - // TODO:Rewrite with android-x - // TODO:Consider alternatives + // *** You must follow these rules when obtain the cutout(FloatingViewManager.findCutoutSafeArea) *** if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { - final DisplayCutout displayCutout = activity.getWindow().getDecorView().getRootWindowInsets().getDisplayCutout(); - if (displayCutout != null) { - safeInsetRect.set(displayCutout.getSafeInsetLeft(), displayCutout.getSafeInsetTop(), displayCutout.getSafeInsetRight(), displayCutout.getSafeInsetBottom()); - - // *** You must follow these rules when obtain the cutout *** - // 1. 'windowLayoutInDisplayCutoutMode' do not be set to 'never' - if (activity.getWindow().getAttributes().layoutInDisplayCutoutMode == WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER) { - throw new RuntimeException("'windowLayoutInDisplayCutoutMode' do not be set to 'never'"); - } - // 2. Do not set Activity to landscape - if(activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE){ - throw new RuntimeException("Do not set Activity to landscape"); - } + // 1. 'windowLayoutInDisplayCutoutMode' do not be set to 'never' + if (activity.getWindow().getAttributes().layoutInDisplayCutoutMode == WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER) { + throw new RuntimeException("'windowLayoutInDisplayCutoutMode' do not be set to 'never'"); + } + // 2. Do not set Activity to landscape + if (activity.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { + throw new RuntimeException("Do not set Activity to landscape"); } } // launch service if (isCustomFloatingView) { final Intent intent = new Intent(activity, CustomFloatingViewService.class); - intent.putExtra(CustomFloatingViewService.EXTRA_CUTOUT_SAFE_AREA, safeInsetRect); + intent.putExtra(CustomFloatingViewService.EXTRA_CUTOUT_SAFE_AREA, FloatingViewManager.findCutoutSafeArea(activity)); ContextCompat.startForegroundService(activity, intent); } else { final Intent intent = new Intent(activity, ChatHeadService.class); - intent.putExtra(ChatHeadService.EXTRA_CUTOUT_SAFE_AREA, safeInsetRect); + intent.putExtra(ChatHeadService.EXTRA_CUTOUT_SAFE_AREA, FloatingViewManager.findCutoutSafeArea(activity)); ContextCompat.startForegroundService(activity, intent); } } From 90243bc10f6d2e85669bfa83e3c8e749c9137eb9 Mon Sep 17 00:00:00 2001 From: Yoshihide Sogawa <12043975+YoshihideSogawa@users.noreply.github.com> Date: Tue, 25 Sep 2018 16:19:29 +0900 Subject: [PATCH 3/9] Fix typo and space --- .../co/recruit_lifestyle/android/floatingview/FloatingView.java | 2 +- .../android/floatingview/FloatingViewManager.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingView.java b/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingView.java index 43671eb..e7e0117 100644 --- a/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingView.java +++ b/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingView.java @@ -292,7 +292,7 @@ class FloatingView extends FrameLayout implements ViewTreeObserver.OnPreDrawList private int mStatusBarHeight; /** - * Navigation bar's height(portlait) + * Navigation bar's height(portrait) */ private final int mBaseNavigationBarHeight; diff --git a/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingViewManager.java b/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingViewManager.java index bedeacc..a57fefc 100644 --- a/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingViewManager.java +++ b/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingViewManager.java @@ -604,7 +604,7 @@ public static Rect findCutoutSafeArea(@NonNull Activity activity) { return safeInsetRect; } - + /** * FloatingViewを貼り付ける際のオプションを表すクラスです。 */ From 8608cde6cbb4652b3f44a0f2ad4e9ecae99bad8b Mon Sep 17 00:00:00 2001 From: Yoshihide Sogawa <12043975+YoshihideSogawa@users.noreply.github.com> Date: Thu, 27 Sep 2018 13:03:15 +0900 Subject: [PATCH 4/9] Fix find navigation bar --- .../android/floatingview/FloatingViewManager.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingViewManager.java b/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingViewManager.java index 67c1e6d..494f844 100644 --- a/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingViewManager.java +++ b/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingViewManager.java @@ -241,7 +241,7 @@ public void onScreenChanged(Rect windowRect, int visibility) { } // detect navigation bar - final boolean isHideNavigationBar; + boolean isHideNavigationBar; if (visibility == FullscreenObserverView.NO_LAST_VISIBILITY) { // At the first it can not get the correct value, so do special processing mWindowManager.getDefaultDisplay().getMetrics(mDisplayMetrics); @@ -249,8 +249,14 @@ public void onScreenChanged(Rect windowRect, int visibility) { } else { isHideNavigationBar = (visibility & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; } - final boolean isPortrait = mResources.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT; + // auto dismiss navigation bar mode(Galaxy S8, S9 and so on.) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + final DisplayMetrics realMetrics = new DisplayMetrics(); + mWindowManager.getDefaultDisplay().getRealMetrics(realMetrics); + isHideNavigationBar = isHideNavigationBar || windowRect.bottom - realMetrics.heightPixels == 0; + } + final boolean isPortrait = mResources.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT; // update FloatingView layout mTargetFloatingView.onUpdateSystemLayout(isHideStatusBar, isHideNavigationBar, isPortrait, windowRect.left); From bb358d042ea7ad449213bb6642ee8d83c7a62510 Mon Sep 17 00:00:00 2001 From: Yoshihide Sogawa <12043975+YoshihideSogawa@users.noreply.github.com> Date: Thu, 27 Sep 2018 13:20:25 +0900 Subject: [PATCH 5/9] Refactor various name --- .../android/floatingview/FloatingViewManager.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingViewManager.java b/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingViewManager.java index 494f844..c452fde 100644 --- a/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingViewManager.java +++ b/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingViewManager.java @@ -251,9 +251,9 @@ public void onScreenChanged(Rect windowRect, int visibility) { } // auto dismiss navigation bar mode(Galaxy S8, S9 and so on.) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - final DisplayMetrics realMetrics = new DisplayMetrics(); - mWindowManager.getDefaultDisplay().getRealMetrics(realMetrics); - isHideNavigationBar = isHideNavigationBar || windowRect.bottom - realMetrics.heightPixels == 0; + final DisplayMetrics realDisplayMetrics = new DisplayMetrics(); + mWindowManager.getDefaultDisplay().getRealMetrics(realDisplayMetrics); + isHideNavigationBar = isHideNavigationBar || windowRect.bottom - realDisplayMetrics.heightPixels == 0; } final boolean isPortrait = mResources.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT; From 5a22d9345dee7b6d2d5ed730ee0a4937c63b6067 Mon Sep 17 00:00:00 2001 From: Yoshihide Sogawa <12043975+YoshihideSogawa@users.noreply.github.com> Date: Thu, 27 Sep 2018 16:25:15 +0900 Subject: [PATCH 6/9] Add final --- .../co/recruit_lifestyle/android/floatingview/FloatingView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingView.java b/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingView.java index 43671eb..e0c92fb 100644 --- a/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingView.java +++ b/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingView.java @@ -284,7 +284,7 @@ class FloatingView extends FrameLayout implements ViewTreeObserver.OnPreDrawList /** * status bar's height(landscape) */ - private int mBaseStatusBarRotatedHeight; + private final int mBaseStatusBarRotatedHeight; /** * Current status bar's height From 78528f24646c59706cdd3c705002825fd7cd83ea Mon Sep 17 00:00:00 2001 From: Yoshihide Sogawa <12043975+YoshihideSogawa@users.noreply.github.com> Date: Fri, 28 Sep 2018 15:17:26 +0900 Subject: [PATCH 7/9] Fix find navigation bar - a bug when rotating the device to landscape mode on home screen --- .../floatingview/FloatingViewManager.java | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingViewManager.java b/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingViewManager.java index c452fde..2bd9636 100644 --- a/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingViewManager.java +++ b/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingViewManager.java @@ -241,20 +241,19 @@ public void onScreenChanged(Rect windowRect, int visibility) { } // detect navigation bar - boolean isHideNavigationBar; + final boolean isHideNavigationBar; if (visibility == FullscreenObserverView.NO_LAST_VISIBILITY) { // At the first it can not get the correct value, so do special processing - mWindowManager.getDefaultDisplay().getMetrics(mDisplayMetrics); - isHideNavigationBar = windowRect.width() - mDisplayMetrics.widthPixels > 0 || windowRect.height() - mDisplayMetrics.heightPixels > 0; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + mWindowManager.getDefaultDisplay().getRealMetrics(mDisplayMetrics); + isHideNavigationBar = windowRect.width() - mDisplayMetrics.widthPixels == 0 && windowRect.bottom - mDisplayMetrics.heightPixels == 0; + } else { + mWindowManager.getDefaultDisplay().getMetrics(mDisplayMetrics); + isHideNavigationBar = windowRect.width() - mDisplayMetrics.widthPixels > 0 || windowRect.height() - mDisplayMetrics.heightPixels > 0; + } } else { isHideNavigationBar = (visibility & View.SYSTEM_UI_FLAG_HIDE_NAVIGATION) == View.SYSTEM_UI_FLAG_HIDE_NAVIGATION; } - // auto dismiss navigation bar mode(Galaxy S8, S9 and so on.) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { - final DisplayMetrics realDisplayMetrics = new DisplayMetrics(); - mWindowManager.getDefaultDisplay().getRealMetrics(realDisplayMetrics); - isHideNavigationBar = isHideNavigationBar || windowRect.bottom - realDisplayMetrics.heightPixels == 0; - } final boolean isPortrait = mResources.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT; // update FloatingView layout @@ -445,13 +444,13 @@ public void setDisplayMode(@DisplayMode int displayMode) { mDisplayMode = displayMode; // 常に表示/フルスクリーン時に非表示にするモードの場合 if (mDisplayMode == DISPLAY_MODE_SHOW_ALWAYS || mDisplayMode == DISPLAY_MODE_HIDE_FULLSCREEN) { - for (FloatingView floatingView: mFloatingViewList) { + for (FloatingView floatingView : mFloatingViewList) { floatingView.setVisibility(View.VISIBLE); } } // 常に非表示にするモードの場合 else if (mDisplayMode == DISPLAY_MODE_HIDE_ALWAYS) { - for (FloatingView floatingView: mFloatingViewList) { + for (FloatingView floatingView : mFloatingViewList) { floatingView.setVisibility(View.GONE); } mTrashView.dismiss(); From 123c5106004b6a646a9032f3a3b7c44c13330475 Mon Sep 17 00:00:00 2001 From: Yoshihide Sogawa <12043975+YoshihideSogawa@users.noreply.github.com> Date: Fri, 28 Sep 2018 18:36:13 +0900 Subject: [PATCH 8/9] Fix navigation bar auto hide mode - test only portrait --- .../android/floatingview/FloatingView.java | 49 ++++++++++++++++--- .../floatingview/FloatingViewManager.java | 2 +- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingView.java b/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingView.java index e0c92fb..d435e33 100644 --- a/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingView.java +++ b/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingView.java @@ -568,17 +568,17 @@ public boolean onPreDraw() { * @param isHideStatusBar If true, the status bar is hidden * @param isHideNavigationBar If true, the navigation bar is hidden * @param isPortrait If true, the device orientation is portrait - * @param windowLeftOffset Left side offset of device display + * @param windowRect {@link Rect} of system window */ - void onUpdateSystemLayout(boolean isHideStatusBar, boolean isHideNavigationBar, boolean isPortrait, int windowLeftOffset) { + void onUpdateSystemLayout(boolean isHideStatusBar, boolean isHideNavigationBar, boolean isPortrait, Rect windowRect) { // status bar updateStatusBarHeight(isHideStatusBar, isPortrait); // touch X offset(support Cutout) - updateTouchXOffset(isHideNavigationBar, windowLeftOffset); + updateTouchXOffset(isHideNavigationBar, windowRect.left); // touch Y offset(support Cutout) mTouchYOffset = isPortrait ? mSafeInsetRect.top : 0; // navigation bar - updateNavigationBarOffset(isHideNavigationBar, isPortrait); + updateNavigationBarOffset(isHideNavigationBar, isPortrait, windowRect); refreshLimitRect(); } @@ -636,17 +636,52 @@ private void updateTouchXOffset(boolean isHideNavigationBar, int windowLeftOffse * * @param isHideNavigationBar If true, the navigation bar is hidden * @param isPortrait If true, the device orientation is portrait + * @param windowRect {@link Rect} of system window */ - private void updateNavigationBarOffset(boolean isHideNavigationBar, boolean isPortrait) { + private void updateNavigationBarOffset(boolean isHideNavigationBar, boolean isPortrait, Rect windowRect) { + int currentNavigationBarVerticalHeight = 0; + int navigationBarVerticalDiff = 0; + final boolean hasSoftNavigationBar = hasSoftNavigationBar(); + // auto hide navigation bar(Galaxy S8, S9 and so on.) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + final DisplayMetrics realDisplayMetrics = new DisplayMetrics(); + mWindowManager.getDefaultDisplay().getRealMetrics(realDisplayMetrics); + currentNavigationBarVerticalHeight = realDisplayMetrics.heightPixels - windowRect.bottom; + navigationBarVerticalDiff = mBaseNavigationBarHeight - currentNavigationBarVerticalHeight; + } + if (!isHideNavigationBar) { - mNavigationBarVerticalOffset = 0; + // auto hide navigation bar + // 他デバイスとの矛盾をもとに推測する + // 1.デバイスに組み込まれたナビゲーションバー(mBaseNavigationBarHeight == 0)はシステムの状態によって高さに差が発生しない + // 2.デバイスに組み込まれたナビゲーションバー(!hasSoftNavigationBar)は意図的にBaseを0にしているので、矛盾している + if (navigationBarVerticalDiff != 0 && mBaseNavigationBarHeight == 0 || + !hasSoftNavigationBar && mBaseNavigationBarHeight != 0) { + if (hasSoftNavigationBar) { + // 1.auto hide mode -> show mode + // 2.show mode -> auto hide mode -> home + mNavigationBarVerticalOffset = 0; + } else { + // show mode -> home + mNavigationBarVerticalOffset = -currentNavigationBarVerticalHeight; + } + } else { + // normal device + mNavigationBarVerticalOffset = 0; + } + mNavigationBarHorizontalOffset = 0; return; } // If the portrait, is displayed at the bottom of the screen if (isPortrait) { - mNavigationBarVerticalOffset = mBaseNavigationBarHeight; + // auto hide navigation bar + if (!hasSoftNavigationBar && mBaseNavigationBarHeight != 0) { + mNavigationBarVerticalOffset = 0; + } else { + mNavigationBarVerticalOffset = mBaseNavigationBarHeight; + } mNavigationBarHorizontalOffset = 0; return; } diff --git a/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingViewManager.java b/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingViewManager.java index 2bd9636..cf5698e 100644 --- a/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingViewManager.java +++ b/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingViewManager.java @@ -257,7 +257,7 @@ public void onScreenChanged(Rect windowRect, int visibility) { final boolean isPortrait = mResources.getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT; // update FloatingView layout - mTargetFloatingView.onUpdateSystemLayout(isHideStatusBar, isHideNavigationBar, isPortrait, windowRect.left); + mTargetFloatingView.onUpdateSystemLayout(isHideStatusBar, isHideNavigationBar, isPortrait, windowRect); // フルスクリーンでの非表示モードでない場合は何もしない if (mDisplayMode != DISPLAY_MODE_HIDE_FULLSCREEN) { From c6a466bdc9b6415af4109949ff5f0e96540abfe7 Mon Sep 17 00:00:00 2001 From: Yoshihide Sogawa <12043975+YoshihideSogawa@users.noreply.github.com> Date: Fri, 28 Sep 2018 20:28:01 +0900 Subject: [PATCH 9/9] Fix navigation bar auto hide mode - landscape mode --- .../android/floatingview/FloatingView.java | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingView.java b/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingView.java index d435e33..95b1353 100644 --- a/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingView.java +++ b/library/src/main/java/jp/co/recruit_lifestyle/android/floatingview/FloatingView.java @@ -639,15 +639,17 @@ private void updateTouchXOffset(boolean isHideNavigationBar, int windowLeftOffse * @param windowRect {@link Rect} of system window */ private void updateNavigationBarOffset(boolean isHideNavigationBar, boolean isPortrait, Rect windowRect) { - int currentNavigationBarVerticalHeight = 0; + int currentNavigationBarHeight = 0; + int currentNavigationBarWidth = 0; int navigationBarVerticalDiff = 0; final boolean hasSoftNavigationBar = hasSoftNavigationBar(); // auto hide navigation bar(Galaxy S8, S9 and so on.) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { final DisplayMetrics realDisplayMetrics = new DisplayMetrics(); mWindowManager.getDefaultDisplay().getRealMetrics(realDisplayMetrics); - currentNavigationBarVerticalHeight = realDisplayMetrics.heightPixels - windowRect.bottom; - navigationBarVerticalDiff = mBaseNavigationBarHeight - currentNavigationBarVerticalHeight; + currentNavigationBarHeight = realDisplayMetrics.heightPixels - windowRect.bottom; + currentNavigationBarWidth = realDisplayMetrics.widthPixels - mMetrics.widthPixels; + navigationBarVerticalDiff = mBaseNavigationBarHeight - currentNavigationBarHeight; } if (!isHideNavigationBar) { @@ -663,7 +665,7 @@ private void updateNavigationBarOffset(boolean isHideNavigationBar, boolean isPo mNavigationBarVerticalOffset = 0; } else { // show mode -> home - mNavigationBarVerticalOffset = -currentNavigationBarVerticalHeight; + mNavigationBarVerticalOffset = -currentNavigationBarHeight; } } else { // normal device @@ -693,7 +695,17 @@ private void updateNavigationBarOffset(boolean isHideNavigationBar, boolean isPo mNavigationBarHorizontalOffset = 0; } else { mNavigationBarVerticalOffset = 0; - mNavigationBarHorizontalOffset = mBaseNavigationBarRotatedHeight; + // auto hide navigation bar + // 他デバイスとの矛盾をもとに推測する + // 1.デバイスに組み込まれたナビゲーションバー(!hasSoftNavigationBar)は、意図的にBaseを0にしているので、矛盾している + if (!hasSoftNavigationBar && mBaseNavigationBarRotatedHeight != 0) { + mNavigationBarHorizontalOffset = 0; + } else if (hasSoftNavigationBar && mBaseNavigationBarRotatedHeight == 0) { + // 2.ソフトナビゲーションバーの場合、Baseが設定されるため矛盾している + mNavigationBarHorizontalOffset = currentNavigationBarWidth; + } else { + mNavigationBarHorizontalOffset = mBaseNavigationBarRotatedHeight; + } } }