Android rom开发:动态显示隐藏底部导航栏,默认显示3s后消失

时节如流,2019年快要结束了,立个flag,2020.1.1发布2019年个人总结,今天先来一篇技术干货。

项目需求要求动态显示/隐藏底部导航栏,默认显示3s后消失。设备默认是横屏显示。

思路:

PhoneWindowManager.java里面检测手势操作–>调用IStatusBarService.aidl里面的
接口方法–>StatusBarManagerService.java实现了IStatusBarService.aidl并且持有IStatusBar.aidl的实例对象–>CommandQueue.java实现了IStatusBar.aidl–>BaseStatusBar.java实现了CommandQueue.Callbacks–>PhoneStatusBar.java继承了BaseStatusBar.java

破解方法:

新增show hide方法,通过层层调用,最终操作到PhoneStatusBar.java里面来控制显示和隐藏导航栏,注意在SystemGesturesPointerEventListener.java里面新增onSwipeFromLeft()向右滑的接口用来手动隐藏导航栏。

主要修改文件:
modified:   frameworks/base/core/java/com/android/internal/statusbar/IStatusBar.aidl
modified:   frameworks/base/core/java/com/android/internal/statusbar/IStatusBarService.aidl
modified:   frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
modified:   frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
modified:   frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
modified:   frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
modified:   frameworks/base/policy/src/com/android/internal/policy/impl/SystemGesturesPointerEventListener.java
modified:   frameworks/base/services/core/java/com/android/server/statusbar/StatusBarManagerService.java

全部改动如下:

git diff frameworks
diff --git a/frameworks/base/core/java/com/android/internal/statusbar/IStatusBar.aidl b/frameworks/base/core/java/com/android/internal/statusbar/IStatusBar.aidl
index a3c0db4f34..18040da902 100644
--- a/frameworks/base/core/java/com/android/internal/statusbar/IStatusBar.aidl
+++ b/frameworks/base/core/java/com/android/internal/statusbar/IStatusBar.aidl
@@ -43,5 +43,7 @@ oneway interface IStatusBar
     void preloadRecentApps();
     void cancelPreloadRecentApps();
     void showScreenPinningRequest();
+    void showNavigationBar();
+    void hideNavigationBar();
 }
 
diff --git a/frameworks/base/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/frameworks/base/core/java/com/android/internal/statusbar/IStatusBarService.aidl
index 40c009f3a4..2a2dd5616b 100644
--- a/frameworks/base/core/java/com/android/internal/statusbar/IStatusBarService.aidl
+++ b/frameworks/base/core/java/com/android/internal/statusbar/IStatusBarService.aidl
@@ -61,4 +61,6 @@ interface IStatusBarService
     void toggleRecentApps();
     void preloadRecentApps();
     void cancelPreloadRecentApps();
+    void showNavigationBar();
+    void hideNavigationBar();
 }
diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
index 0b1b883810..61f1483f79 100644
--- a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -57,6 +57,8 @@ public class CommandQueue extends IStatusBar.Stub {
     private static final int MSG_NOTIFICATION_LIGHT_OFF     = 16 << MSG_SHIFT;
     private static final int MSG_NOTIFICATION_LIGHT_PULSE   = 17 << MSG_SHIFT;
     private static final int MSG_SHOW_SCREEN_PIN_REQUEST    = 18 << MSG_SHIFT;
+    private static final int MSG_SHOW_NAVIGATIONBAR         = 19 << MSG_SHIFT;
+    private static final int MSG_HIDE_NAVIGATIONBAR         = 20 << MSG_SHIFT;
 
     public static final int FLAG_EXCLUDE_NONE = 0;
     public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0;
@@ -84,6 +86,8 @@ public class CommandQueue extends IStatusBar.Stub {
         public void animateCollapsePanels(int flags);
         public void animateExpandSettingsPanel();
         public void setSystemUiVisibility(int vis, int mask);
+        public void showNavigationBar();
+        public void hideNavigationBar();
         public void topAppWindowChanged(boolean visible);
         public void setImeWindowStatus(IBinder token, int vis, int backDisposition,
                 boolean showImeSwitcher);
@@ -150,6 +154,20 @@ public class CommandQueue extends IStatusBar.Stub {
         }
     }
 
+    public void showNavigationBar() {
+        synchronized (mList) {
+            mHandler.removeMessages(MSG_SHOW_NAVIGATIONBAR);
+            mHandler.sendEmptyMessage(MSG_SHOW_NAVIGATIONBAR);
+        }
+    }
+
+    public void hideNavigationBar() {
+        synchronized (mList) {
+            mHandler.removeMessages(MSG_HIDE_NAVIGATIONBAR);
+            mHandler.sendEmptyMessage(MSG_HIDE_NAVIGATIONBAR);
+        }
+    }
+
     public void setSystemUiVisibility(int vis, int mask) {
         synchronized (mList) {
             mHandler.removeMessages(MSG_SET_SYSTEMUI_VISIBILITY);
@@ -328,6 +346,12 @@ public class CommandQueue extends IStatusBar.Stub {
                 case MSG_SHOW_SCREEN_PIN_REQUEST:
                     mCallbacks.showScreenPinningRequest();
                     break;
+                case MSG_SHOW_NAVIGATIONBAR:
+                    mCallbacks.showNavigationBar();
+                    break;
+                case MSG_HIDE_NAVIGATIONBAR:
+                    mCallbacks.hideNavigationBar();
+                    break;
             }
         }
     }
diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
index d716b90ee4..ad450c181f 100644
--- a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -619,6 +619,11 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
 
         addNavigationBar();
 
+        if (IS_ENABLE_AUTO_HIDE) {
+            mHideHandler.removeMessages(MSG_HIDE_NAVIGATIONBAR);
+            mHideHandler.sendEmptyMessageDelayed(MSG_HIDE_NAVIGATIONBAR, 3000);
+        }
+
         // Lastly, call to the icon policy to install/update all the icons.
         mIconPolicy = new PhoneStatusBarPolicy(mContext, mCastController);
         mSettingsObserver.onChange(false); // set up
@@ -1291,6 +1296,87 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
         }
     }
 
+    //动态隐藏/显示导航栏,默认显示3s后消失
+    @Override
+    public void hideNavigationBar() {
+        if (!IS_ENABLE_AUTO_HIDE) {
+            return;
+        }
+
+        if (mNavigationBarView != null) {
+            mWindowManager.removeView(mNavigationBarView);
+            mNavigationBarView = null;
+        }
+    }
+
+    @Override
+    public void showNavigationBar() {
+        if (!IS_ENABLE_AUTO_HIDE || mNavigationBarView != null) {
+            return;
+        }
+        forceAddNavigationBar();
+    }
+
+    private void forceAddNavigationBar() {
+        mNavigationBarView = (NavigationBarView) View.inflate(mContext, R.layout.navigation_bar, null);
+        mNavigationBarView.setDisabledFlags(mDisabled);
+        mNavigationBarView.setBar(this);
+        addNavigationBar(true);
+    }
+
+    private void addNavigationBar(boolean forceReset) {
+        if (mNavigationBarView == null) {
+            return;
+        }
+
+        prepareNavigationBarView(forceReset);
+        mWindowManager.addView(mNavigationBarView, getNavigationBarLayoutParams());
+    }
+
+    private void prepareNavigationBarView(boolean forceReset) {
+        mNavigationBarView.reorient();
+        mNavigationBarView.getRecentsButton().setOnClickListener(mRecentsClickListener);
+        mNavigationBarView.getRecentsButton().setOnTouchListener(mRecentsPreloadOnTouchListener);
+        mNavigationBarView.getRecentsButton().setLongClickable(true);
+        mNavigationBarView.getRecentsButton().setOnLongClickListener(mLongPressBackRecentsListener);
+        mNavigationBarView.getBackButton().setLongClickable(true);
+        mNavigationBarView.getBackButton().setOnLongClickListener(mLongPressBackRecentsListener);
+        mNavigationBarView.getHomeButton().setOnTouchListener(mHomeActionListener);
+
+        if (forceReset) {
+            mNavigationBarMode = 0;
+            int newVal = mSystemUiVisibility;
+            mSystemUiVisibility = View.SYSTEM_UI_FLAG_VISIBLE;
+            setSystemUiVisibility(newVal, /*SYSTEM_UI_VISIBILITY_MASK*/0xffffffff);
+            int hints = mNavigationIconHints;
+            mNavigationIconHints = 0;
+            setNavigationIconHints(hints);
+        }
+
+        updateSearchPanel();
+
+        mHideHandler.removeMessages(MSG_HIDE_NAVIGATIONBAR);
+        mHideHandler.sendEmptyMessageDelayed(MSG_HIDE_NAVIGATIONBAR, 3000);
+    }
+
+    private static final int MSG_HIDE_NAVIGATIONBAR = 0;
+    private static final boolean IS_ENABLE_AUTO_HIDE = true;
+    private HideHandler mHideHandler = new HideHandler();
+    private final class HideHandler extends Handler {
+
+        @Override
+        public void handleMessage(Message msg) {
+            switch (msg.what) {
+                case MSG_HIDE_NAVIGATIONBAR:
+                    hideNavigationBar();
+                    break;
+                default:
+                    break;
+            }
+        }
+    }
+    //动态隐藏/显示导航栏,默认显示3s后消失
+
     private void prepareNavigationBarView() {
         mNavigationBarView.reorient();
 
diff --git a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
index 08732e5be4..19f40c1a89 100644
--- a/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
+++ b/frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
@@ -182,4 +182,12 @@ public class TvStatusBar extends BaseStatusBar {
     @Override
     public void showScreenPinningRequest() {
     }
+
+    @Override
+    public void showNavigationBar() {
+    }
+
+    @Override
+    public void hideNavigationBar() {
+    }
 }
diff --git a/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
index cf2e543c15..e0f1267871 100644
--- a/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
+++ b/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@@ -1514,6 +1514,14 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                     public void onSwipeFromRight() {
                         if (mNavigationBar != null && !mNavigationBarOnBottom) {
                             requestTransientBars(mNavigationBar);
+                        } else {
+                            showNavigationBar(true);
+                        }
+                    }
+                    @Override
+                    public void onSwipeFromLeft() {
+                        if (mNavigationBar != null) {
+                            showNavigationBar(false);
                         }
                     }
                     @Override
@@ -1562,6 +1570,26 @@ public class PhoneWindowManager implements WindowManagerPolicy {
 
     }
 
+    private void showNavigationBar(final boolean isShowNavigationBar) {
+        mHandler.post(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    IStatusBarService statusbar = getStatusBarService();
+                    if (statusbar != null) {
+                        if (isShowNavigationBar) {
+                            statusbar.showNavigationBar();
+                        } else {
+                            statusbar.hideNavigationBar();
+                        }
+                    }
+                } catch (RemoteException e) {
+                    mStatusBarService = null;
+                }
+            }
+        });
+    }
+
     private void updateKeyAssignments() {
         final boolean hasMenu = (mDeviceHardwareKeys & KEY_MASK_MENU) != 0;
         final boolean hasHome = (mDeviceHardwareKeys & KEY_MASK_HOME) != 0;
diff --git a/frameworks/base/policy/src/com/android/internal/policy/impl/SystemGesturesPointerEventListener.java b/frameworks/base/policy/src/com/android/internal/policy/impl/SystemGesturesPointerEventListener.java
index 4ff9315707..82eff598dc 100644
--- a/frameworks/base/policy/src/com/android/internal/policy/impl/SystemGesturesPointerEventListener.java
+++ b/frameworks/base/policy/src/com/android/internal/policy/impl/SystemGesturesPointerEventListener.java
@@ -36,6 +36,7 @@ public class SystemGesturesPointerEventListener implements PointerEventListener
     private static final int SWIPE_FROM_TOP = 1;
     private static final int SWIPE_FROM_BOTTOM = 2;
     private static final int SWIPE_FROM_RIGHT = 3;
+    private static final int SWIPE_FROM_LEFT = 4;
 
     private final int mSwipeStartThreshold;
     private final int mSwipeDistanceThreshold;
@@ -99,6 +100,9 @@ public class SystemGesturesPointerEventListener implements PointerEventListener
                     } else if (swipe == SWIPE_FROM_RIGHT) {
                         if (DEBUG) Slog.d(TAG, "Firing onSwipeFromRight");
                         mCallbacks.onSwipeFromRight();
+                    } else if (swipe == SWIPE_FROM_LEFT) {
+                        if (DEBUG) Slog.d(TAG, "Firing onSwipeFromLeft");
+                        mCallbacks.onSwipeFromLeft();
                     }
                 }
                 break;
@@ -185,6 +189,10 @@ public class SystemGesturesPointerEventListener implements PointerEventListener
                 && elapsed < SWIPE_TIMEOUT_MS) {
             return SWIPE_FROM_RIGHT;
         }
+        if (fromX >= 1100 && x < screenWidth && x > fromX + mSwipeDistanceThreshold
+                && elapsed < SWIPE_TIMEOUT_MS) {
+            return SWIPE_FROM_LEFT;
+        }
         return SWIPE_NONE;
     }
 
@@ -192,6 +200,7 @@ public class SystemGesturesPointerEventListener implements PointerEventListener
         void onSwipeFromTop();
         void onSwipeFromBottom();
         void onSwipeFromRight();
+        void onSwipeFromLeft();
         void onDebug();
     }
 }
diff --git a/frameworks/base/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/frameworks/base/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
index cf2ed07425..f8d17c109b 100644
--- a/frameworks/base/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/frameworks/base/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -378,6 +378,40 @@ public class StatusBarManagerService extends IStatusBarService.Stub {
         }
     }
 
+    @Override
+    public void showNavigationBar() {
+        enforceStatusBar();
+        synchronized(mLock) {
+            mHandler.post(new Runnable() {
+                public void run() {
+                    if (mBar != null) {
+                        try {
+                            mBar.showNavigationBar();
+                        } catch (RemoteException ex) {
+                       }
+                   }
+                }
+            });
+        }
+    }
+
+    @Override
+    public void hideNavigationBar() {
+        enforceStatusBar();
+        synchronized(mLock) {
+            mHandler.post(new Runnable() {
+                public void run() {
+                    if (mBar != null) {
+                        try {
+                            mBar.hideNavigationBar();
+                        } catch (RemoteException ex) {
+                       }
+                   }
+                }
+            });
+        }
+    }
+
     private void updateUiVisibilityLocked(final int vis, final int mask) {
         if (mSystemUiVisibility != vis) {
             mSystemUiVisibility = vis;

参考链接:
https://blog.csdn.net/way_ping_li/article/details/45727335

发布了42 篇原创文章 · 获赞 24 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/u010725171/article/details/103644825