书接上文,此篇文章主要展示在 packages/apps/Settings 中添加控制状态栏和导航栏显示和隐藏的代码改动。代码比较简单,无需过多解读。
- 增加语言项,根据支持的语言添加对应的语言
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -13714,4 +13714,8 @@
<string name="dialog_getting_screen_info">getting screen info...</string>
<string name="dialog_update_resolution">Updating resolution...</string>
<string name="dialog_wait_screen_connect">please wait while updating info to the device...</string>
+ <string name="ctrl_statusbar">StatusBar</string>
+ <string name="ctrl_navigationbar">NavigationBar</string>
</resources>
--- a/res/values-zh-rCN/strings.xml
+++ b/res/values-zh-rCN/strings.xml
@@ -5608,4 +5608,9 @@
+ <string name="ctrl_statusbar">状态栏</string>
+ <string name="ctrl_navigationbar">导航栏</string>
</resources>
- 增加功能配置选项
+++ b/res/xml/display_settings.xml
@@ -103,6 +103,14 @@
<PreferenceCategory
android:title="@string/category_name_display_controls">
+ <SwitchPreference
+ android:key="ctrl_statusbar"
+ android:title="@string/ctrl_statusbar"/>
+
+ <SwitchPreference
+ android:key="ctrl_navigationbar"
+ android:title="@string/ctrl_navigationbar"/>
+
- DisplaySettings.java 增加功能引用
--- a/src/com/android/settings/DisplaySettings.java
+++ b/src/com/android/settings/DisplaySettings.java
@@ -30,6 +30,8 @@ import com.android.settings.display.ShowOperatorNamePreferenceController;
import com.android.settings.display.TapToWakePreferenceController;
import com.android.settings.display.ThemePreferenceController;
import com.android.settings.display.VrDisplayPreferenceController;
+import com.android.settings.display.StatusBarPreferenceController;
+import com.android.settings.display.NavigationBarPreferenceController;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settingslib.core.AbstractPreferenceController;
import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -85,6 +87,8 @@ public class DisplaySettings extends DashboardFragment {
controllers.add(new ThemePreferenceController(context));
controllers.add(new BrightnessLevelPreferenceController(context, lifecycle));
controllers.add(new HdmiSettingsPreferenceController(context, KET_HDMI_SETTINGS));
+ controllers.add(new StatusBarPreferenceController(context));
+ controllers.add(new NavigationBarPreferenceController(context));
return controllers;
}
- 实现 display/StatusBarPreferenceController.java
package com.android.settings.display;
import android.content.Context;
import android.provider.Settings;
import androidx.preference.SwitchPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.core.AbstractPreferenceController;
import android.content.Intent;
import android.util.Log;
import android.os.SystemProperties;
public class StatusBarPreferenceController extends AbstractPreferenceController implements
PreferenceControllerMixin, Preference.OnPreferenceChangeListener {
private static final String TAG = "StatusBarCtrl";
private static final boolean DEBUG = true;
private static final String KEY_STATUS_BAR = "ctrl_statusbar";
public static final String ACTION_HIDE_STATUS_BAR = "com.systemui.statusbar.hide";
public static final String ACTION_SHOW_STATUS_BAR = "com.systemui.statusbar.show";
public StatusBarPreferenceController(Context context) {
super(context);
}
@Override
public String getPreferenceKey() {
return KEY_STATUS_BAR;
}
@Override
public boolean isAvailable() {
return true;
}
@Override
public void displayPreference(PreferenceScreen screen) {
if (!isAvailable()) {
setVisible(screen, KEY_STATUS_BAR, false /* visible */);
return;
}
final SwitchPreference mStatusBarPreference = screen.findPreference(KEY_STATUS_BAR);
if (mStatusBarPreference != null) {
String value = SystemProperties.get("persist.sys.statusbar.enable", "false");
mStatusBarPreference.setChecked(value.equals("true"));
mStatusBarPreference.setOnPreferenceChangeListener(this);
}
}
@Override
public void updateState(Preference preference) {
String value = SystemProperties.get("persist.sys.statusbar.enable", "false");
((SwitchPreference) preference).setChecked(value.equals("true"));
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean value = (Boolean) newValue;
if (DEBUG) {
Log.d(TAG, "key value " + value);
}
Intent intent = new Intent();
if (value) {
intent.setAction(ACTION_SHOW_STATUS_BAR);
} else {
intent.setAction(ACTION_HIDE_STATUS_BAR);
}
mContext.sendBroadcast(intent); // 发送广播
return true;
}
}
- 实现 display/NavigationBarPreferenceController.java
package com.android.settings.display;
import android.content.Context;
import android.provider.Settings;
import androidx.preference.SwitchPreference;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settingslib.core.AbstractPreferenceController;
import android.content.Intent;
import android.util.Log;
import android.os.SystemProperties;
public class NavigationBarPreferenceController extends AbstractPreferenceController
implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener {
private static final String TAG = "NavigationBarCtrl";
private static final boolean DEBUG = true;
private static final String KEY_NAVIGATION_BAR = "ctrl_navigationbar";
public static final String ACTION_HIDE_NAVIGATION_BAR = "com.systemui.navigationbar.hide";
public static final String ACTION_SHOW_NAVIGATION_BAR = "com.systemui.navigationbar.show";
public NavigationBarPreferenceController(Context context) {
super(context);
}
@Override
public String getPreferenceKey() {
return KEY_NAVIGATION_BAR;
}
@Override
public boolean isAvailable() {
return true;
}
@Override
public void displayPreference(PreferenceScreen screen) {
if (!isAvailable()) {
setVisible(screen, KEY_NAVIGATION_BAR, false /* visible */);
return;
}
final SwitchPreference mNavigationBarPreference = screen.findPreference(KEY_NAVIGATION_BAR);
if (mNavigationBarPreference != null) {
String value = SystemProperties.get("persist.sys.navigationbar.enable", "false");
mNavigationBarPreference.setChecked(value.equals("true"));
mNavigationBarPreference.setOnPreferenceChangeListener(this);
}
}
@Override
public void updateState(Preference preference) {
String value = SystemProperties.get("persist.sys.navigationbar.enable", "false");
((SwitchPreference) preference).setChecked(value.equals("true"));
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
boolean value = (Boolean) newValue;
if (DEBUG) {
Log.d(TAG, "key value " + value);
}
Intent intent = new Intent();
if (value) {
intent.setAction(ACTION_SHOW_NAVIGATION_BAR);
} else {
intent.setAction(ACTION_HIDE_NAVIGATION_BAR);
}
mContext.sendBroadcast(intent);
return true;
}
}