1. 程式人生 > >android 4.4 原始碼新增動態控制導航欄

android 4.4 原始碼新增動態控制導航欄

1.上滑顯示導航欄,下滑隱藏導航欄。

修改以下類程式碼 修改: base/core/java/com/android/internal/statusbar/IStatusBar.aidl 修改: base/core/java/com/android/internal/statusbar/IStatusBarService.aidl 修改: base/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java 修改: base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java 修改: base/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java 修改: base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java 修改: base/policy/src/com/android/internal/policy/impl/SystemGesturesPointerEventListener.java 修改: base/services/java/com/android/server/StatusBarManagerService.java

base/core/java/com/android/internal/statusbar/IStatusBar.aidl

     void preloadRecentApps();
     void cancelPreloadRecentApps();
     void setWindowState(int window, int state);
    
+    //laixianfu add 
+    void showNavigationBar();
+    void hideNavigationBar();

 }

base/core/java/com/android/internal/statusbar/IStatusBarService.aidl

@@ -52,4 +52,10 @@ interface IStatusBarService
    void preloadRecentApps();
    void cancelPreloadRecentApps();
    void setWindowState(int window, int state);
+    //laixianfu add 
+    void showNavigationBar();
+    void hideNavigationBar();

}

base/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java


@@ -24,7 +24,7 @@ import android.service.notification.StatusBarNotification;
import com.android.internal.statusbar.IStatusBar;
import com.android.internal.statusbar.StatusBarIcon;
import com.android.internal.statusbar.StatusBarIconList;

+import android.util.Log;
/**
 * This class takes the functions from IStatusBar that come in on
 * binder pool threads and posts messages to get them onto the main
@@ -33,6 +33,7 @@ import com.android.internal.statusbar.StatusBarIconList;
 * are coalesced, note that they are all idempotent.
 */
public class CommandQueue extends IStatusBar.Stub {
+
    private static final int INDEX_MASK = 0xffff;
    private static final int MSG_SHIFT  = 16;
    private static final int MSG_MASK   = 0xffff << MSG_SHIFT;
@@ -63,7 +64,10 @@ public class CommandQueue extends IStatusBar.Stub {
    public static final int FLAG_EXCLUDE_NOTIFICATION_PANEL = 1 << 2;
    public static final int FLAG_EXCLUDE_INPUT_METHODS_PANEL = 1 << 3;
    public static final int FLAG_EXCLUDE_COMPAT_MODE_PANEL = 1 << 4;

+    //add by huangzhichao
+    private static final int MSG_SHOW_NAVIGATIONBAR   = 24 << MSG_SHIFT;
+    private static final int MSG_HIDE_NAVIGATIONBAR = 25 << MSG_SHIFT;
+    //end
    private StatusBarIconList mList;
    private Callbacks mCallbacks;
    private Handler mHandler = new H();
@@ -98,6 +102,9 @@ public class CommandQueue extends IStatusBar.Stub {
        public void hideSearchPanel();
        public void cancelPreloadRecentApps();
        public void setWindowState(int window, int state);
+        //add laixianfu
+        public void showNavigationBar();
+        public void hideNavigationBar();
    }

    public CommandQueue(Callbacks callbacks, StatusBarIconList list) {
@@ -232,6 +239,23 @@ public class CommandQueue extends IStatusBar.Stub {
        }
    }

+     //add by laixianfu 2018-09-23
+    public void showNavigationBar() {
+        synchronized (mList) {
+            mHandler.removeMessages(MSG_SHOW_NAVIGATIONBAR);
+            mHandler.sendEmptyMessage(MSG_SHOW_NAVIGATIONBAR);
+       android.util.Log.i("laixianfu", "CommandQueue.showNavigationBar...");
+        }
+    }
+
+   public void hideNavigationBar() {
+        synchronized (mList) {
+           mHandler.removeMessages(MSG_HIDE_NAVIGATIONBAR);
+            mHandler.sendEmptyMessage(MSG_HIDE_NAVIGATIONBAR);
+         android.util.Log.i("laixianfu", "CommandQueue.hideNavigationBar...");
+        }
+    }
+
    private final class H extends Handler {
        public void handleMessage(Message msg) {
            final int what = msg.what & MSG_MASK;
@@ -312,6 +336,16 @@ public class CommandQueue extends IStatusBar.Stub {
                case MSG_SET_WINDOW_STATE:
                    mCallbacks.setWindowState(msg.arg1, msg.arg2);
                    break;
+                  // add by laixianfu
+                case MSG_SHOW_NAVIGATIONBAR: 
+                    mCallbacks.showNavigationBar();
+                  android.util.Log.i("laixianfu", "mCallbacks.showNavigationBar();...");
+                    break;
+                case MSG_HIDE_NAVIGATIONBAR:
+                    mCallbacks.hideNavigationBar();
+                  android.util.Log.i("laixianfu", "mCallbacks.hideNavigationBar();...");
+                    break;
+               //  end 
            }
        }
    }


/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java


@@ -111,7 +111,7 @@ import java.util.ArrayList;
 
 import android.os.SystemProperties;    //zhangxiao add
 import android.os.BatteryManager;      //zhangxiao add
-
+import com.android.systemui.recent.RecentsActivity;
 public class PhoneStatusBar extends BaseStatusBar implements DemoMode {
 
     private  static TextView mBatteryLevel;    //zhangxiao add
@@ -3031,4 +3031,70 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode {
                        mSettingsContainer.onConfigurationChanged(newConfig);
                }
        }
+       //laixianfu add  網山找的
+    /*
+       @Override // CommandQueue 
+       public void showNavigationBar() {//add by jon
+           Log.v("laixianfu","phoneStatusBar  showNavigationBar");
+           if (null != mNavigationBarView) {
+            return;
+            } else {
+            Log.v("laixianfu","phoneStatusBar....show......else");
+               final Context contex=mContext;
+               int layoutId = R.layout.navigation_bar;
+              /* if(RecentsActivity.FLOAT_WINDOW_SUPPORT){
+                   layoutId = R.layout.navigation_bar_float_window; 
+               } /// @} *
+                   mNavigationBarView = (NavigationBarView) View.inflate(contex,layoutId, null); 
+                   mNavigationBarView.setDisabledFlags(mDisabled);
+                   mNavigationBarView.setBar(this); 
+                   mNavigationBarView.setOnTouchListener(new View.OnTouchListener() { 
+                       @Override 
+                       public boolean onTouch(View v, MotionEvent event) { 
+                           checkUserAutohide(v, event); 
+                           return false;
+                       }
+                   }); 
+                   addNavigationBar(); 
+           }
+       } 
+         */           
+    //add by laixianfu
+     @Override
+    public void showNavigationBar() {
+         Log.d("laixianfu", "show NavigationBar +");
+         if (mNavigationBarView != null) return;
+          try {
+            boolean showNav = mWindowManagerService.hasNavigationBar();
+            /// M: Support Smartbook Feature.
+            if (true) Log.v("laixianfu", "hasNavigationBar=" + showNav);
+            if (showNav) {
+                mNavigationBarView =
+                    (NavigationBarView) View.inflate(mContext, R.layout.navigation_bar, null);
+
+                mNavigationBarView.setDisabledFlags(mDisabled);
+                mNavigationBarView.setBar(this);
+                mNavigationBarView.setOnTouchListener(new View.OnTouchListener() {
+                    @Override
+                    public boolean onTouch(View v, MotionEvent event) {
+                        checkUserAutohide(v, event);
+                        return false;
+                    }});
+            }
+        } catch (RemoteException ex) {
+            // no window manager? good luck with that
+        }
+       addNavigationBar();
+    }
+
+   @Override
+    public void hideNavigationBar() {
+         Log.d("laixianfu", "hide +");
+         if (mNavigationBarView != null) {
+            mNavigationBarView.setVisibility(View.GONE);
+            mWindowManager.removeViewImmediate(mNavigationBarView);
+            mNavigationBarView = null;
+        }
+    }
+
 }

b/base/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java


@@ -147,5 +147,14 @@ public class TvStatusBar extends BaseStatusBar {
     @Override
     protected void refreshLayout(int layoutDirection) {
     }
+    
+    @Override // laixianfu
+    public void showNavigationBar() {
+    }
+ 
+    @Override // laixianfu
+    public void hideNavigationBar() {
+    }
+//   
 
 }

/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java

@@ -974,6 +975,16 @@ public class PhoneWindowManager implements WindowManagerPolicy {
                         if (mNavigationBar != null && mNavigationBarOnBottom) {
                             requestTransientBars(mNavigationBar);
                         }
+                        Log.i("laixianfu","onSwipeFrom...");
+                                               showNavigationBar();
+                    }
+                    @Override
+                    public void onSwipeFromBarTop() {
+                        if (mStatusBar != null) {
+                            requestTransientBars(mStatusBar);
+                        }
+                        Log.i("laixianfu", "onSwipeFromBarTop...");
+                        hideNavigationBar();
                     }
                     @Override
                     public void onSwipeFromRight() {
@@ -1017,6 +1028,41 @@ public class PhoneWindowManager implements WindowManagerPolicy {
         }
     }
 
+     //add by laixianfu to 2016-09-23
+    public void showNavigationBar(){
+      mHandler.post(new Runnable() {
+                        @Override
+                        public void run() {
+                            IStatusBarService service = getStatusBarService();
+                            if (service != null) {
+                                try {
+                                 Log.i("laixianfu", "service.showNavigationBar...");
+                                  service.showNavigationBar();
+                            } catch (RemoteException e) {
+                              // do nothing.
+                            }
+                            }
+                          }
+                    });
+    }
+
+    public void hideNavigationBar(){
+      mHandler.post(new Runnable() {
+                        @Override
+                        public void run() {
+                            IStatusBarService service = getStatusBarService();
+                            if (service != null) {
+                                try {
+                                  Log.i("laixianfu", "service.hideNavigationBar...");
+                                  service.hideNavigationBar();
+                            } catch (RemoteException e) {
+                              // do nothing.
+                            }
+                            }
+                          }
+                    });
+    }
+    //end  
     /**
      * Read values from config.xml that may be overridden depending on
      * the configuration of the device.*/
@@ -1098,7 +1144,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
         int longSizeDp = longSize * DisplayMetrics.DENSITY_DEFAULT / density;
 
         // Allow the navigation bar to move on small devices (phones).
-        mNavigationBarCanMove = shortSizeDp < 600;
+        mNavigationBarCanMove = false ;//shortSizeDp < 600;  laixianfu ++
 
         mHasNavigationBar = res.getBoolean(com.android.internal.R.bool.config_showNavigationBar);
         // Allow a system property to override this. Used by the emulator.

@@ -3917,6 +3970,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
         if (keyCode == KeyEvent.KEYCODE_POWER) {
             policyFlags |= WindowManagerPolicy.FLAG_WAKE;
         }
+        
         final boolean isWakeKey = (policyFlags & (WindowManagerPolicy.FLAG_WAKE
                 | WindowManagerPolicy.FLAG_WAKE_DROPPED)) != 0;
 


b/base/policy/src/com/android/internal/policy/impl/SystemGesturesPointerEventListener.java


@@ -36,7 +36,8 @@ 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_BAR_TOP = 4;//laixianfu add 
+    
     private final int mSwipeStartThreshold;
     private final int mSwipeDistanceThreshold;
     private final Callbacks mCallbacks;
@@ -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_BAR_TOP){ //laixianfu add here
+                        mCallbacks.onSwipeFromBarTop();
                     }
                 }
                 break;
@@ -175,6 +179,13 @@ public class SystemGesturesPointerEventListener implements PointerEventListener
                 && elapsed < SWIPE_TIMEOUT_MS) {
             return SWIPE_FROM_TOP;
         }
+        //add by laixianfu :if
+        if (fromY >= screenHeight - 240
+                && y >= fromY + mSwipeStartThreshold
+                && elapsed < SWIPE_TIMEOUT_MS) {
+           android.util.Log.i("laixianfu", "detectSwipe...");
+            return SWIPE_FROM_BAR_TOP;
+        } 
         if (fromY >= screenHeight - mSwipeStartThreshold
                 && y < fromY - mSwipeDistanceThreshold
                 && elapsed < SWIPE_TIMEOUT_MS) {
@@ -193,5 +204,6 @@ public class SystemGesturesPointerEventListener implements PointerEventListener
         void onSwipeFromBottom();
         void onSwipeFromRight();
         void onDebug();
+        void onSwipeFromBarTop();
     }
 }

b/base/services/java/com/android/server/StatusBarManagerService.java


@@ -657,5 +657,50 @@ public class StatusBarManagerService extends IStatusBarService.Stub
             */
         }
     };
+    
+    //laixianfu add 

+        @Override
+        
            
           

相關推薦

android 4.4 原始碼新增動態控制導航

1.上滑顯示導航欄,下滑隱藏導航欄。 修改以下類程式碼 修改: base/core/java/com/android/internal/statusbar/IStatusBar.aidl 修改: base/core/java/com/androi

微信小程式之仿android fragment之可滑動的底部導航例項 —— 微信小程式實戰系列(4

底部3-5個選項的底部導航欄,目前在移動端上是主流佈局之一 因此騰訊官方特地做了,可以通過設定,就可以做出了一個底部的導航欄 但是通過設定的這個底部的導航欄,功能上比較固定,它必須要設定與它對應的一個頁面,而且並不能滑動。 在業務上,有時候會比較限制,並不能完全滿足所需

Android6.0 原始碼修改之遮蔽導航虛擬按鍵(Home和RecentAPP)/動態顯示和隱藏NavigationBar

轉載請註明出處:https://blog.csdn.net/u012932409/article/details/83063075 場景分析, 為了完全實現沉浸式效果,在進入特定的app後可以將導航欄移除,當退出app後再次將導航欄恢復。(下面將採用傳送廣播的方式來移除

Android 百度地圖新增標記+定位+導航(從定位點開始導航到自己新增的點)

百度地圖的官方文件說的不是很清楚,我自己花幾天做了一個是新增標籤+定位+導航啊。僅供參考。 一.普通地圖,定位,新增標記,初始化導航SDK package com.example.salesman; import java.lang.reflect.Method; imp

Android學習總結——輸入法將BottomNavigationBar(底部導航)頂上去的問題

andro devel google tps 底部導航 style log cti googl 在應用清單中給當前<Activity>設置: android:windowSoftInputMode="adjustPan" 關於android:windo

一個動態導航(好看的,用C3)(不依賴js,點擊小圖切換大的背景圖)

width ima line auto fashion put spl body sha <!DOCTYPE HTML><htmllang="en-US"> <head> <meta charset="UTF-8

Android O Settings原始碼流程分析(搜尋篇(下))

Android O Settings  靜態介面篇 介面渲染篇 資料載入篇之一級選單 資料載入篇之二級選單 資料載入篇之獲取及修改預設設定屬性值 搜尋欄篇 Settings 搜尋欄 上篇——介面 中篇——實現原理 下篇—

Android O Settings原始碼流程分析(搜尋篇(中))

Android O Settings  靜態介面篇 介面渲染篇 資料載入篇之一級選單 資料載入篇之二級選單 資料載入篇之獲取及修改預設設定屬性值 搜尋欄篇 Settings 搜尋欄 上篇——介面 中篇——實現原理 下篇—

Android O Settings原始碼流程分析(搜尋篇(上))

Android O Settings  靜態介面篇 介面渲染篇 資料載入篇之一級選單 資料載入篇之二級選單 資料載入篇之獲取及修改預設設定屬性值 搜尋欄篇 Settings 搜尋欄 上篇——介面 中篇——實現原理 下篇—

[Android] 通過 theme style 設定狀態列 導航等的顏色

程式碼如下: <style name="test"> <!--狀態列顏色--> <item name="colorPrimaryDark">@color/md_red_900</item> <!--控制各個控制元件被

Android開發之應用狀態列、導航都透明

  直接上程式碼 //狀態列、導航欄都透明 private void hideStatusBarNavigationBar() { if (Build.VERSION.SDK_INT = Build.VERSION_CODES.LOLLIPOP)

Android之RadioGroup+ViewPager製作的底部導航

在日常開發中我們常常會用到類似微信或者QQ的底部導航。實現這樣的效果有多種,今天就為大家介紹一種實現簡單,可控性好的底部導航的實現方法。 首先建立activity_main.xml佈局檔案,裡面主要由ViewPager和RadioGroup構成。ViewPager用來存

Android開發之TabLayout真正實現底部導航(可實現點選文字顏色圖片切換)

前言:關於這個TabLayout實現底部導航,在我的上篇《Android開發之TabLayout實現底部導航欄》部落格中有提到,但是後面在仔細的接觸專案中,發現了裡面有很多沒有解決的事情,比如不能實現點選文字顏色和圖片的切換,不能做到禁止左右滑動,所以趁著今天有時間的情況下

微信小程式----動態設定導航標題

場景 當從一個分類列表頁面進入到一個詳情頁面的時候,由於這個詳情頁面是公用的,為了區分頁面,就會設定該頁面的導航用以區分。就需要開發者在頁面載入的時候進行動態設定導航標題! 實現AP

Android (爭取做到)最全的底部導航實現方法

本文(爭取做到)Android 最全的底部導航欄實現方法. 現在寫了4個主要方法. 還有一些個人感覺不完全切題的方法也會簡單介紹一下. 方法一. ViewPager + List<View> + PagerAdapter 先看a

android開發時華為手機底部導航擋住了應用佈局

原因:使用安卓的BottomNavigationView控制元件開發底部導航欄同時使用了沉浸式狀態列導致華為手機的底部導航欄會蓋住我應用的導航欄。 解決:先寫一個工具類 import android.content.Context; import android.co

微信小程式動態更改導航標題文字內容

1.需求:實際開發中很多時候我們需要通過上個頁面傳過來的值動態的更改標題欄文字,方法如下:onLoad: function (options) {wx.setNavigationBarTitle({ title: options.name })      // options

EasyUI+js實現動態載入導航

   引言    小編最近在做專案的時候遇到一個許可權控制的功能,就是根據許可權的大小來控制導航欄中的內容,這就遇到了 動態載入導航欄的功能了,但是根據整個介面的風格需要需要用到EasyUI,在

Android 通過 style 設定狀態列,導航等的顏色

我們在有些時候會有這個樣的需求,需要修改狀態列,導航欄。系統控制元件的顏色。我們可以先定義一個style,然後在這個style中設定我們需要顏色的屬性,最後在清單檔案中來給某個Activity設定主題即可。程式碼如下: <style name="

Android 沉浸式狀態列與隱藏導航

1 前言 一般我們在Android的APP開發中,APP的介面如下:   可以看到,有狀態列、ActionBar(ToolBar)、導航欄等,一般來說,APP實現沉浸式有三種需求:沉浸式狀態列,隱藏導航欄,APP全屏 沉浸式狀態列是指狀態列與ActionBar顏色相匹配,