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
+        public void showNavigationBar() {
+           enforceStatusBar();
+ 
+           android.util.Log.d("laixianfu", "status service showNavigationBar...");
+
+           synchronized(mLock) {
+               mHandler.post(new Runnable() {
+                    public void run() {
+                         try {
+                            mBar.showNavigationBar();
+                         } catch (RemoteException ex) {
+                         }
+                        
+                    }
+                });
+         }
+       }
+
+
+       @Override
+        public void hideNavigationBar() {
+           enforceStatusBar();
+
+           android.util.Log.d("laixianfu", "status service hideNavigationBar...");
+
+           synchronized(mLock) {
+               mHandler.post(new Runnable() {
+                    public void run() {
+                         try {
+                           mBar.hideNavigationBar();
+                         } catch (RemoteException ex) {
+                         }
+                        
+                    }
+                });
+          }
+       }
+  //end 
+
+
 
 }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章