前言
RK3588-android12代码,添加5s自动隐藏导航栏,上划显示导航栏,然后第三方app也能发广播控制功能,当广播隐藏后上划不再显示导航栏。
修改1: packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
修改2: packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
修改3: services/core/java/com/android/server/wm/DisplayPolicy.java
一、5s自动隐藏导航栏
修改1: packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
首先NavigationBarController.java这个类是控制导航的创建的,在这里添加自己的5s自动隐藏导航栏逻辑,在创建导航栏的方法:
public void createNavigationBars(final boolean includeDefaultDisplay,
RegisterStatusBarResult result)
里面添加 5s延时,然后进行导航的移除。
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java
@@ -292,7 +292,14 @@ public class NavigationBarController implements Callbacks,
removeNavigationBar(displayId);
createNavigationBar(mDisplayManager.getDisplay(displayId), savedState, null );
}
-
+
+ public void hideNavigationBar() {
+ Display[] displays = mDisplayManager.getDisplays();
+ for (Display display : displays) {
+ removeNavigationBar(display.getDisplayId());
+ }
+ }
+
, result);
}
}
+
+
+ new Handler().postDelayed(new Runnable() {
+ public void run() {
+ hideNavigationBar();
+ }
+ },5000);
+
}
二、上划显示导航栏及第三方的发送广播控制
1.实现接受广播控制导航
修改2: packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
添加自定义的广播:
@@ -264,6 +264,7 @@ import javax.inject.Named;
import javax.inject.Provider;
import dagger.Lazy;
+import android.os.SystemProperties;
public class StatusBar extends SystemUI implements DemoMode,
ActivityStarter, KeyguardStateController.Callback,
@@ -284,6 +285,10 @@ public class StatusBar extends SystemUI implements DemoMode,
public static final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey";
public static final String SYSTEM_DIALOG_REASON_RECENT_APPS = "recentapps";
static public final String SYSTEM_DIALOG_REASON_SCREENSHOT = "screenshot";
+
+
+ public static final String ACTION_API_HIDE_NAVIGATION = "action.ACTION_API_HIDE_NAVIGATION";
+ public static final String ACTION_API_SHOW_NAVIGATION = "action.ACTION_API_SHOW_NAVIGATION";
private static final String BANNER_ACTION_CANCEL =
"com.android.systemui.statusbar.banner_action_cancel";
@@ -1439,6 +1444,8 @@ public class StatusBar extends SystemUI implements DemoMode,
filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG);
+ filter.addAction(ACTION_API_HIDE_NAVIGATION);
+ filter.addAction(ACTION_API_SHOW_NAVIGATION);
mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter, null, UserHandle.ALL);
}
调用(修改1:NavigationBarController.java )NavigationBarController这个类自定义的隐藏和创建导航栏方法
+
+ private void hideNavigation() {
+ NavigationBarView mNavigationBarView = mNavigationBarController.getDefaultNavigationBarView();
+ if (mNavigationBarView != null)
+ mNavigationBarController.hideNavigationBar();
+ SystemProperties.set("hide.navigation","true");
+ }
+
+ private void apiShowNavigation() {
+
+ NavigationBarView mNavigationBarView = mNavigationBarController.getDefaultNavigationBarView();
+ if (mNavigationBarView == null)
+ mNavigationBarController.createNavigationBars(true,null);
+ SystemProperties.set("hide.navigation","false");
+ }
+
+
protected void createNavigationBar(@Nullable RegisterStatusBarResult result) {
- mNavigationBarController.createNavigationBars(true , result);
+
+ mNavigationBarController.createNavigationBars(false , result);
}
接受广播后调用上面实现的隐藏和显示方法
@@ -3092,6 +3115,13 @@ public class StatusBar extends SystemUI implements DemoMode,
else if (DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG.equals(action)) {
mQSPanelController.showDeviceMonitoringDialog();
}
+
+ else if(ACTION_API_HIDE_NAVIGATION.equals(action)) {
+ hideNavigation();
+ }
+ else if(ACTION_API_SHOW_NAVIGATION.equals(action)) {
+ apiShowNavigation();
+ }
Trace.endSection();
}
};
此时已经可以发送广播进行控制隐藏和显示: am广播控制:
am broadcast -a "action.ACTION_API_SHOW_NAVIGATION"
am broadcast -a "action.ACTION_API_HIDE_NAVIGATION"
2.上划显示导航栏
修改3: services/core/java/com/android/server/wm/DisplayPolicy.java
上面已经实现通过广播隐藏和显示导航功能,我们要的是在有上划的动作后,发送自定义的显示导航栏广播,从而实现上划显示导航栏的功能。
--- a/services/core/java/com/android/server/wm/DisplayPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayPolicy.java
@@ -179,6 +179,7 @@ import com.android.server.wm.InputMonitor.EventReceiverInputConsumer;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.function.Consumer;
+import android.os.SystemProperties;
总结
细心的人已经发现上面还有一个地方没有提到的,就是我们在修改2中StatusBar.java设计的隐藏和显示导航栏的逻辑中添加了系统的属性设置
hideNavigation():
—> SystemProperties.set("hide.navigation","true");
apiShowNavigation():
—>SystemProperties.set("hide.navigation","false");
和修改3:DisplayPolicy.java的系统的属性设置判断
if ("false".equals(SystemProperties.get("hide.navigation"))){
....
....
...
}
不添加这部分的逻辑是会有一个bug,就是当第三方的app或者自行发送广播控制导航栏隐藏时,只要上划就会显示导航栏,从而达不到真正意义的隐藏,提供的第三方广播接口也就没有实际的用途。所以通过系统属性设置和判断实现第三方广播接口实际用途,即:
第三方隐藏广播:ACTION_API_HIDE_NAVIGATION = "action.ACTION_API_HIDE_NAVIGATION";
—>hideNavigation()
—> SystemProperties.set("hide.navigation","true");
此时系统变量"hide.navigation" 为"true" 上划时判断"hide.navigation" 是否为"false",是"false"才发送显示导航栏广播。所以上划不会显示导航栏。
第三方隐藏广播:ACTION_API_SHOW_NAVIGATION = "action.ACTION_API_SHOW_NAVIGATION";
—>apiShowNavigation()
—> SystemProperties.set("hide.navigation","false");
此时系统变量"hide.navigation" 为"false" 上划时判断"hide.navigation" 是否为"false",是"false"才发送显示导航栏广播。所以上划会显示导航栏。
|