此篇博客以及最近关于机顶盒的相关博文,早该在两年多前或是更早以前就该写出来的,如今物是人非了,问及以前的同事,机顶盒系统貌似是android8.1的了,此文基于6.0系统上修改的,望知悉。
1、主要修改如下
modified: core/java/com/android/internal/statusbar/IStatusBar.aidl
# modified: core/java/com/android/internal/statusbar/IStatusBarService.aidl
# modified: core/res/res/values/config.xml
# modified: packages/SystemUI/res/layout-sw600dp/navigation_bar.xml
# modified: packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
# modified: packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
# modified: packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
# modified: packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
# deleted: packages/SystemUI/tests/Android.mk
# modified: services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java
# modified: services/core/java/com/android/server/policy/PhoneWindowManager.java
# modified: services/core/java/com/android/server/statusbar/StatusBarManagerService.java
git diff 对比查看改动
2、修改IStatusBar.aidl
git diff core/java/com/android/internal/statusbar/IStatusBar.aidl
diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl
index ba67cf4..ba7e54b 100644
--- a/core/java/com/android/internal/statusbar/IStatusBar.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl
@@ -76,5 +76,7 @@ oneway interface IStatusBar
* @param source the identifier for the gesture, see {@link StatusBarManager}
*/
void onCameraLaunchGestureDetected(int source);
+ /**add for show NavigationBar20161212*/
+ void showNavigationBar();
3、修改IStatusBarService.aidl
git diff core/java/com/android/internal/statusbar/IStatusBarService.aidl
diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarServ
index 7db2cc9..c0663c3 100644
--- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl
+++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl
@@ -90,4 +90,6 @@ interface IStatusBarService
void appTransitionStarting(long statusBarAnimationsStartTime, long statusBarAnimationsDuration);
void startAssist(in Bundle args);
+ /**add for show NavigationBar 20161212*/
+ void showNavigationBar();
}
4、修改config.xml
git diff core/res/res/values/config.xml
diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml
index f76dfb2..a54213e 100644
--- a/core/res/res/values/config.xml
+++ b/core/res/res/values/config.xml
@@ -1509,7 +1509,7 @@
<!-- Whether a software navigation bar should be shown. NOTE: in the future this may be
autodetected from the Configuration. -->
- <bool name="config_showNavigationBar">false</bool>
+ <bool name="config_showNavigationBar">true</bool>
<!-- Whether action menu items should be displayed in ALLCAPS or not.
Defaults to true. If this is not appropriate for specific locales
5、修改navigation_bar.xml
git diff packages/SystemUI/res/layout-sw600dp/navigation_bar.xml
diff --git a/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml b/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml
old mode 100644
new mode 100755
index 9912343..0ab3109
--- a/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml
+++ b/packages/SystemUI/res/layout-sw600dp/navigation_bar.xml
@@ -53,6 +53,14 @@
android:layout_height="match_parent"
android:layout_weight="1"
/>
+ <!-- 20161212 add screenshort-->
+ <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/screenshort"
+ android:layout_width="128dp" android:paddingLeft="25dp" android:paddingRight="25dp"
+ android:layout_height="match_parent"
+ android:src="@drawable/ic_sysbar_screenshot"
+ android:layout_weight="0"
+ />
+ <!--code end -->
<com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/back"
android:layout_width="128dp" android:paddingStart="25dp" android:paddingEnd="25dp"
android:layout_height="match_parent"
@@ -80,6 +88,36 @@
android:layout_weight="0"
android:contentDescription="@string/accessibility_recent"
/>
+ <!--20161212 add -->
+ <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/sub"
+ android:layout_width="128dp" android:paddingLeft="25dp" android:paddingRight="25dp"
+ android:layout_height="match_parent"
+ android:src="@drawable/sub_normal"
+ android:layout_weight="0"
+ systemui:keyCode="25"
+ />
+ <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/add"
+ android:layout_width="128dp" android:paddingLeft="25dp" android:paddingRight="25dp"
+ android:layout_height="match_parent"
+ android:src="@drawable/add_normal"
+ android:layout_weight="0"
+ systemui:keyCode="24"
+ <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/bt_power"
+ android:layout_width="128dp" android:paddingLeft="25dp" android:paddingRight="25dp"
+ android:layout_height="match_parent"
+ android:src="@drawable/ic_power"
+ android:layout_weight="0"
+ systemui:keyCode="26"
+ />
+ <com.android.systemui.statusbar.policy.KeyButtonView android:id="@+id/hide_bar_btn"
+ android:layout_width="wrap_content" android:paddingLeft="25dp" android:paddingRight="25dp"
+ android:layout_height="match_parent"
+ android:scaleType="centerInside"
+ android:src="@drawable/ic_sysbar_hide"
+ android:layout_weight="0"
+ />
+ <!--code end-->
<Space
android:layout_width="match_parent"
android:layout_height="match_parent"
(END)
/>
6、修改CommandQueue.java类
git diff packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statu
old mode 100644
new mode 100755
index 897f5e5..d25dc6d
--- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java
@@ -25,6 +25,7 @@ import android.util.Pair;
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
@@ -65,6 +66,7 @@ public class CommandQueue extends IStatusBar.Stub {
private static final int MSG_ASSIST_DISCLOSURE = 22 << MSG_SHIFT;
private static final int MSG_START_ASSIST = 23 << MSG_SHIFT;
private static final int MSG_CAMERA_LAUNCH_GESTURE = 24 << MSG_SHIFT;
+ private static final int MSG_SHOW_NAVIGATIONBAR = 25 << MSG_SHIFT;//20161212 add for show NavigationBar
public static final int FLAG_EXCLUDE_NONE = 0;
public static final int FLAG_EXCLUDE_SEARCH_PANEL = 1 << 0;
@@ -111,6 +113,7 @@ public class CommandQueue extends IStatusBar.Stub {
public void showAssistDisclosure();
public void startAssist(Bundle args);
public void onCameraLaunchGestureDetected(int source);
+ public void showNavigationBar();//20161212 add for show NavigationBar
}
public CommandQueue(Callbacks callbacks, StatusBarIconList list) {
@@ -126,6 +129,15 @@ public class CommandQueue extends IStatusBar.Stub {
}
}
+ /**20161212 add for show NavigationBar*/
+ public void showNavigationBar(){
+ synchronized(mList){
+ mHandler.removeMessages(MSG_SHOW_NAVIGATIONBAR);
+ mHandler.sendEmptyMessage(MSG_SHOW_NAVIGATIONBAR);
+ Log.d("CommandQueue-------","show NavigationBar-------------");
+ }
+ }
+ /**code end*/
public void removeIcon(int index) {
synchronized (mList) {
int what = MSG_ICON | index;
@@ -348,6 +360,9 @@ public class CommandQueue extends IStatusBar.Stub {
case MSG_SET_SYSTEMUI_VISIBILITY:
mCallbacks.setSystemUiVisibility(msg.arg1, msg.arg2);
break;
+ case MSG_SHOW_NAVIGATIONBAR://20161212 add
+ mCallbacks.showNavigationBar();
+ break;//code end
case MSG_TOP_APP_WINDOW_CHANGED:
mCallbacks.topAppWindowChanged(msg.arg1 != 0);
break;
(END)
7、修改NavigationBarView.java类
git diff packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/sys
index 8046eb5..19c83f4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java
@@ -50,6 +50,7 @@ import android.widget.LinearLayout;
import com.android.systemui.R;
import com.android.systemui.statusbar.policy.DeadZone;
import com.android.systemui.statusbar.policy.KeyButtonView;
+import com.android.systemui.statusbar.policy.KeyButtonRipple;
import java.io.FileDescriptor;
import java.io.PrintWriter;
@@ -255,6 +256,17 @@ public class NavigationBarView extends LinearLayout {
return mCurrentView.findViewById(R.id.ime_switcher);
}
+ /**20161212add for hidenavigationbar*/
+ public View getHideBarButton() {
+ View view = mCurrentView.findViewById(R.id.hide_bar_btn);
+ view.setBackground(new KeyButtonRipple(getContext(), view));
+ return view;
+ }
+
+ public View getScreenShotButton(){
+ return mCurrentView.findViewById(R.id.screenshort);
+ }
+ /**code end*/
private void getIcons(Resources res) {
mBackIcon = res.getDrawable(R.drawable.ic_sysbar_back);
mBackLandIcon = mBackIcon;
(END)
8、修改PhoneStatusBar.java类
git diff packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java b/packages/SystemUI/src/com/android/system
old mode 100644
new mode 100755
index 73361bd..e4e703b
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java
@@ -183,6 +183,10 @@ import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSLUCE
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_WARNING;
+//add import 20161212
+import android.content.ComponentName;
+import android.content.ServiceConnection;
+import android.os.Messenger;
public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
DragDownHelper.DragDownCallback, ActivityStarter, OnUnlockMethodChangedListener,
HeadsUpManager.OnHeadsUpChangedListener {
@@ -1068,7 +1072,107 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
toggleRecentApps();
}
};
+ /**20161212 add for show NavigationBar***/
+ @Override
+ public void showNavigationBar() {
+ if (mNavigationBarView != null) {
+ return;
+ }
+ mNavigationBarView = (NavigationBarView) View.inflate(mContext, R.layout.navigation_bar, null);
+ mNavigationBarView.setBar(this);
+ mNavigationBarView.setOnTouchListener(new
+ View.OnTouchListener() {
+ @Override
+ public boolean onTouch(View v, MotionEvent event) {
+ checkUserAutohide(v, event);
+ return false;
+ }});
+ addNavigationBar();
+ //Log.d("PhoneStatus!!!","addNaviGationBar!!!!!!!!");
+ }
+ private View.OnClickListener mScreenShotClickListener = new View.OnClickListener() {
+ public void onClick(View v) {
+ takeScreenshot();
+ //Log.d("PhoneStatusBar!!", "click screenshort--------");
+ }
+ };
+ final Object mScreenshotLock = new Object();
+ ServiceConnection mScreenshotConnection = null;
+ final Runnable mScreenshotTimeout = new Runnable() {
+ @Override public void run() {
+ synchronized (mScreenshotLock) {
+ if (mScreenshotConnection != null) {
+ mContext.unbindService(mScreenshotConnection);
+ mScreenshotConnection = null;
+ }
+ }
+ }
+ };
+ private void takeScreenshot() {
+ synchronized (mScreenshotLock) {
+ if (mScreenshotConnection != null) {
+ return;
+ }
+ ComponentName cn = new ComponentName("com.android.systemui",
+ "com.android.systemui.screenshot.TakeScreenshotService");
+ Intent intent = new Intent();
+ intent.setComponent(cn);
+ ServiceConnection conn = new ServiceConnection() {
+ @Override
+ public void onServiceConnected(ComponentName name, IBinder service) {
+ synchronized (mScreenshotLock) {
+ if (mScreenshotConnection != this) {
+ return;
+ }
+ Messenger messenger = new Messenger(service);
+ Message msg = Message.obtain(null, 1);
+ final ServiceConnection myConn = this;
+ Handler h = new Handler(mHandler.getLooper()) {
+ @Override
+ public void handleMessage(Message msg) {
+ synchronized (mScreenshotLock) {
+ if (mScreenshotConnection == myConn) {
+ mContext.unbindService(mScreenshotConnection);
+ mScreenshotConnection = null;
+ mHandler.removeCallbacks(mScreenshotTimeout);
+ }
+ }
+ }
+ };
+ msg.replyTo = new Messenger(h);
+ msg.arg1 = msg.arg2 = 0;
+ msg.arg1 = 1;
+ try {
+ messenger.send(msg);
+ } catch (RemoteException e) {
+ }
+ }
+ }
+ @Override
+ public void onServiceDisconnected(ComponentName name) {}
+ };
+ if (mContext.bindService(intent, conn, Context.BIND_AUTO_CREATE)) {
+ mScreenshotConnection = conn;
+ mHandler.postDelayed(mScreenshotTimeout, 10000);
+ }
+ }
+ }
+ private View.OnClickListener mHideNavClickListener = new View.OnClickListener() {
+ public void onClick(View v) {
+ removeNavigationBar();
+ //Log.d("PhoneStatusBar================","click");
+ }
+ };
+ private void removeNavigationBar(){
+ if (DEBUG) Log.d(TAG, "removeNavigationBar: about to remove " + mNavigationBarView);
+ if ( mNavigationBarView != null) {
+ mWindowManager.removeView(mNavigationBarView);
+ }
+ mNavigationBarView = null;
+ //Log.d("PhoneStatusBar================","removeNavigationBar+++++");
+ }
+ /**code end*/
private long mLastLockToAppLongPress;
private View.OnLongClickListener mLongPressBackRecentsListener =
new View.OnLongClickListener() {
@@ -1128,7 +1232,9 @@ public class PhoneStatusBar extends BaseStatusBar implements DemoMode,
mNavigationBarView.getBackButton().setLongClickable(true);
mNavigationBarView.getBackButton().setOnLongClickListener(mLongPressBackRecentsListener);
mNavigationBarView.getHomeButton().setOnTouchListener(mHomeActionListener);
+ mNavigationBarView.getHideBarButton().setOnClickListener(mHideNavClickListener);//20161212 add for navigationbar
mNavigationBarView.getHomeButton().setOnLongClickListener(mLongPressHomeListener);
+ mNavigationBarView.getScreenShotButton().setOnClickListener(mScreenShotClickListener);//20161212 add for screenshort
mAssistManager.onConfigurationChanged();
}
(END)
9、修改TvStatusBar.java类
git diff packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java b/packages/SystemUI/src/com/android/systemui/sta
index bbe5dd9..cdd878e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/tv/TvStatusBar.java
@@ -166,6 +166,10 @@ public class TvStatusBar extends BaseStatusBar {
public void appTransitionCancelled() {
}
+ @Override//20161212 add for show NavigationBar
+ public void showNavigationBar(){
+ }//code end
+
@Override
public void appTransitionStarting(long startTime, long duration) {
}
(END)
10、修改ImmersiveModeConfirmation.java类
git diff services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java
diff --git a/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java b/services/core/java/com/android/server/polic
index 160d44c..17b0973 100644
--- a/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java
+++ b/services/core/java/com/android/server/policy/ImmersiveModeConfirmation.java
@@ -344,7 +344,7 @@ public class ImmersiveModeConfirmation {
public void handleMessage(Message msg) {
switch(msg.what) {
case SHOW:
- handleShow();
+ //handleShow();
break;
case HIDE:
handleHide();
(END)
11、修改PhoneWindowManager.java类
git diff services/core/java/com/android/server/policy/PhoneWindowManager.java
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/Phone
index 9c17151..cc59ff0 100755
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -1534,14 +1534,12 @@ public class PhoneWindowManager implements WindowManagerPolicy {
public void onSwipeFromBottom() {
if (mNavigationBar != null && mNavigationBarOnBottom) {
requestTransientBars(mNavigationBar);
+ }else{
+ if (SystemProperties.getBoolean("ro.is.ShowNavigationBar", false)){
+ showNavigationBar();/**20161212add for navigationbar*/
+ }
+ }
+ }
@Override
public void onSwipeFromRight() {
if (mNavigationBar != null && !mNavigationBarOnBottom) {
@@ -1568,6 +1566,7 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mOrientationListener.onTouchEnd();
}
});
+
mImmersiveModeConfirmation = new ImmersiveModeConfirmation(mContext);
mWindowManagerFuncs.registerPointerEventListener(mSystemGestures);
@@ -1607,6 +1606,24 @@ public class PhoneWindowManager implements WindowManagerPolicy {
mStatusBarController.getAppTransitionListener());
}
+ /**20161212 add for show NavigationBar*/
+ private void showNavigationBar(){
+ mHandler.post(new Runnable(){
+ @Override
+ public void run(){
+ try{
+ IStatusBarService statusbar=getStatusBarService();
+ if(null!=statusbar){
+ statusbar.showNavigationBar();
+ //Log.d("PhoneWindowManager!!!!!!","showNavigationBar-----------------------");
+ }
+ }catch(Exception e){
+ mStatusBarService =null;
+ }
+ }
+ });
+ }
+ /**code end*/
/**
* Read values from config.xml that may be overridden depending on
* the configuration of the device.
(END)
12、修改StatusBarManagerService.java类
git diff services/core/java/com/android/server/statusbar/StatusBarManagerService.java
diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/stat
old mode 100644
new mode 100755
index e9ace29..3c3543f
--- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
+++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java
@@ -41,7 +41,7 @@ import java.io.FileDescriptor;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
-
+import android.util.Log;
/**
* A note on locking: We rely on the fact that calls onto mBar are oneway or
@@ -188,6 +188,26 @@ public class StatusBarManagerService extends IStatusBarService.Stub {
}
};
+ /*20161212 add for show NavigationBar**/
+ @Override
+ public void showNavigationBar(){
+ enforceStatusBar();
+ synchronized(mLock){
+ mHandler.post(new Runnable(){
+ public void run(){
+ if(null!=mBar){
+ try{
+ mBar.showNavigationBar();
+ //Log.d("StatusBarManagerService","-------showBar----------");
+ }catch (RemoteException ex){
+
+ }
+ }
+ }
+ });
+ }
+ }
+ /**code end*/
// ================================================================================
// From IStatusBarService
// ================================================================================
(END)
以上即为机顶盒底部导航栏显示与隐藏的主要改动地方,“+”即为添加的代码,添加到源码中验证即可。6.0,framework中的源码是否和8.1framework源码相同,请自行斟酌变动咯。
最后,提供资源下载链接 点我下载