rk3288 android9.0 设置界面添加状态栏按钮
前言我们公司是做工控机行业的,默认在android系统下是不允许有状态栏和导航栏的,之前在rk3288 android7.1.2系统下做过类似的处理,移植到rk3288 android9.0下面,两个版本在状态栏的代码差异还是比较大的,下面简单记录一下在android9.0上面添加状态栏按钮。下面图片是完成后的状态当前状态栏的开启和关闭都使用广播实现一、添加广播1、添加系统广播首先要添加数据接口f
·
前言
我们公司是做工控机行业的,默认在android系统下是不允许有状态栏和导航栏的,之前在rk3288 android7.1.2系统下做过类似的处理,移植到rk3288 android9.0下面,两个版本在状态栏的代码差异还是比较大的,下面简单记录一下在android9.0上面添加状态栏按钮。
下面图片是完成后的状态
当前状态栏的开启和关闭都使用广播实现
一、添加广播
1、添加系统广播首先要添加数据接口
frameworks/base/api/current.txt
field public static final java.lang.String ACTION_ATTACH_DATA = "android.intent.action.ATTACH_DATA";
+ field public static final java.lang.String ACTION_BAR_SHOW = "android.intent.action.BAR_SHOW";
+ field public static final java.lang.String ACTION_BAR_HIDE = "android.intent.action.BAR_HIDE";
field public static final java.lang.String ACTION_BATTERY_CHANGED = "android.intent.action.BATTERY_CHANGED";
2、定义广播内容
frameworks/base/core/java/android/content/Intent.java
public static final String ACTION_BAR_SHOW = "android.intent.action.BAR_SHOW";
public static final String ACTION_BAR_HIDE = "android.intent.action.BAR_HIDE";
3、动态注册广播
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
filter.addAction(Intent.ACTION_BAR_SHOW);
filter.addAction(Intent.ACTION_BAR_HIDE);
4、广播接收处理
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (DEBUG) Log.v(TAG, "onReceive: " + intent);
String action = intent.getAction();
if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) {
KeyboardShortcuts.dismiss();
if (mRemoteInputManager.getController() != null) {
mRemoteInputManager.getController().closeRemoteInputs();
}
if (mLockscreenUserManager.isCurrentProfile(getSendingUserId())) {
int flags = CommandQueue.FLAG_EXCLUDE_NONE;
String reason = intent.getStringExtra("reason");
if (reason != null && reason.equals(SYSTEM_DIALOG_REASON_RECENT_APPS)) {
flags |= CommandQueue.FLAG_EXCLUDE_RECENTS_PANEL;
}
animateCollapsePanels(flags);
}
}
else if (Intent.ACTION_BAR_SHOW.equals(action)) {
addBarInside();
Settings.System.putInt(mContext.getContentResolver(), Settings.System.HIDE_NAVIGATION, 0);
Log.d(TAG, "android.intent.action.ACTION_BAR_SHOW");
}
else if (Intent.ACTION_BAR_HIDE.equals(action)) {
removeBar();
Settings.System.putInt(mContext.getContentResolver(), Settings.System.HIDE_NAVIGATION, 1);
Log.d(TAG, "android.intent.action.ACTION_BAR_HIDE");
}
else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
finishBarAnimations();
resetUserExpandedStates();
}
else if (DevicePolicyManager.ACTION_SHOW_DEVICE_MONITORING_DIALOG.equals(action)) {
mQSPanel.showDeviceMonitoringDialog();
}
}
};
5、添加/移除状态栏和导航栏
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
private boolean mBarIsAdd = true;
private void changeBarStatus()
{
boolean show_systembar = Settings.System.getInt(mContext.getContentResolver(),Settings.System.HIDE_NAVIGATION,0)==1;
if(show_systembar)
{
addBarInside();
}
else
{
removeBar();
}
}
private void addBarInside(){
boolean show_systembar = Settings.System.getInt(mContext.getContentResolver(),Settings.System.HIDE_NAVIGATION,0)==1;
if (!mBarIsAdd && show_systembar){
Log.d(TAG,"add Bar");
createNavigationBar();
mStatusBarWindow.setVisibility(View.VISIBLE);
Settings.System.putInt(mContext.getContentResolver(),Settings.System.HIDE_NAVIGATION, 1);
mBarIsAdd = true;
}
}
private void removeBar(){
if (mBarIsAdd){
Log.d(TAG,"remove Bar");
if (mNavigationBarView != null)
mWindowManager.removeView(mNavigationBarView);
if (mStatusBarWindow != null)
mStatusBarWindow.setVisibility(View.GONE);
mBarIsAdd = false;
}
Settings.System.putInt(mContext.getContentResolver(),Settings.System.HIDE_NAVIGATION, 0);
}
6、系统初始状态栏设置
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@@ -909,7 +909,9 @@ public class StatusBar extends SystemUI implements DemoMode,
boolean showNav = mWindowManagerService.hasNavigationBar();
if (DEBUG) Log.v(TAG, "hasNavigationBar=" + showNav);
if (showNav) {
- createNavigationBar();
+ if (1 == Settings.System.getInt(mContext.getContentResolver(), Settings.System.HIDE_NAVIGATION, 1)) {
+ createNavigationBar();
+ }
}
二、保存设置到数据库
1、添加数据到数据库
frameworks/base/core/java/android/provider/Settings.java
@@ -3525,6 +3525,16 @@ public final class Settings {
*/
public static final Uri DEFAULT_NOTIFICATION_URI = getUriFor(NOTIFICATION_SOUND);
+ /**
+ * add by wuxb
+ * Whether hide navigation
+ * 0 = no
+ * 1 = yes
+ */
+ public static final String HIDE_NAVIGATION = "hide_navigation";
+ public static final Uri HIDE_NAVIGATION_URI = getUriFor(HIDE_NAVIGATION);
+ private static final Validator HIDE_NAVIGATION_VALIDATOR = URI_VALIDATOR;
+
/** {@hide} */
public static final String NOTIFICATION_SOUND_CACHE = "notification_sound_cache";
/** {@hide} */
@@ -4162,6 +4172,7 @@ public final class Settings {
RINGTONE,
LOCK_TO_APP_ENABLED,
NOTIFICATION_SOUND,
+ HIDE_NAVIGATION,
ACCELEROMETER_ROTATION,
SHOW_BATTERY_PERCENT,
NOTIFICATION_VIBRATION_INTENSITY,
@@ -4217,6 +4228,7 @@ public final class Settings {
PUBLIC_SETTINGS.add(VOLUME_BLUETOOTH_SCO);
PUBLIC_SETTINGS.add(RINGTONE);
PUBLIC_SETTINGS.add(NOTIFICATION_SOUND);
+ PUBLIC_SETTINGS.add(HIDE_NAVIGATION);
PUBLIC_SETTINGS.add(ALARM_ALERT);
PUBLIC_SETTINGS.add(TEXT_AUTO_REPLACE);
PUBLIC_SETTINGS.add(TEXT_AUTO_CAPS);
@@ -4314,6 +4326,7 @@ public final class Settings {
VALIDATORS.put(HAPTIC_FEEDBACK_INTENSITY, VIBRATION_INTENSITY_VALIDATOR);
VALIDATORS.put(RINGTONE, RINGTONE_VALIDATOR);
VALIDATORS.put(NOTIFICATION_SOUND, NOTIFICATION_SOUND_VALIDATOR);
+ VALIDATORS.put(HIDE_NAVIGATION, HIDE_NAVIGATION_VALIDATOR);
VALIDATORS.put(ALARM_ALERT, ALARM_ALERT_VALIDATOR);
VALIDATORS.put(TEXT_AUTO_REPLACE, TEXT_AUTO_REPLACE_VALIDATOR);
VALIDATORS.put(TEXT_AUTO_CAPS, TEXT_AUTO_CAPS_VALIDATOR);
2、添加数据接口
frameworks/base/api/current.txt
@@ -36778,6 +36780,7 @@ package android.provider {
field public static final deprecated java.lang.String DEBUG_APP = "debug_app";
field public static final android.net.Uri DEFAULT_ALARM_ALERT_URI;
field public static final android.net.Uri DEFAULT_NOTIFICATION_URI;
+ field public static final android.net.Uri HIDE_NAVIGATION_URI;
field public static final android.net.Uri DEFAULT_RINGTONE_URI;
field public static final deprecated java.lang.String DEVICE_PROVISIONED = "device_provisioned";
field public static final deprecated java.lang.String DIM_SCREEN = "dim_screen";
@@ -36799,6 +36802,7 @@ package android.provider {
field public static final deprecated java.lang.String NETWORK_PREFERENCE = "network_preference";
field public static final deprecated java.lang.String NEXT_ALARM_FORMATTED = "next_alarm_formatted";
field public static final java.lang.String NOTIFICATION_SOUND = "notification_sound";
+ field public static final java.lang.String HIDE_NAVIGATION = "hide_navigation";
field public static final deprecated java.lang.String PARENTAL_CONTROL_ENABLED = "parental_control_enabled";
field public static final deprecated java.lang.String PARENTAL_CONTROL_LAST_UPDATE = "parental_control_last_update";
field public static final deprecated java.lang.String PARENTAL_CONTROL_REDIRECT_URL = "parental_control_redirect_url";
3、设置默认值
frameworks/base/packages/SettingsProvider/res/values/defaults.xml
@@ -36,6 +36,7 @@
<fraction name="def_window_transition_scale">100%</fraction>
<bool name="def_haptic_feedback">true</bool>
+ <integer name="def_hide_navigation">0</integer>
<bool name="def_bluetooth_on">true</bool>
<bool name="def_wifi_display_on">false</bool>
<bool name="def_install_non_market_apps">false</bool>
4、将默认值加入数据库
frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
@@ -2287,6 +2287,8 @@ class DatabaseHelper extends SQLiteOpenHelper {
R.bool.def_dim_screen);
loadIntegerSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,
R.integer.def_screen_off_timeout);
+ loadIntegerSetting(stmt, Settings.System.HIDE_NAVIGATION,
+ R.integer.def_hide_navigation);
// Set default cdma DTMF type
loadSetting(stmt, Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, 0);
三、添加状态栏按钮
1、添加中英文标题
packages/apps/Settings/res/values-zh-rCN/strings.xml
<string name="confirm_dialog_message">Will cancel it</string>
+ <!-- status bar -->
+ <string name="navigation_settings_title">状态栏</string>
packages/apps/Settings/res/values/strings.xml
+ <!-- status bar -->
+ <string name="navigation_settings_title">Status Bar</string>
2、开关选择按钮添加
packages/apps/Settings/res/xml/display_settings.xml
+ <SwitchPreference
+ android:key="status_bar"
+ android:title="@string/navigation_settings_title"
+ android:persistent="false"
+ settings:controller="com.android.settings.display.StatusBarPreferenceController" />
3、添加选择按钮功能
packages/apps/Settings/src/com/android/settings/display/StatusBarPreferenceController.java
package com.android.settings.display;
import static android.provider.Settings.System.HIDE_NAVIGATION;
import android.content.Context;
import android.provider.Settings;
import android.content.Intent;
import android.support.v7.preference.Preference;
import android.text.TextUtils;
import com.android.settings.R;
import android.provider.Settings.System;
import com.android.internal.logging.nano.MetricsProto;
import com.android.internal.view.RotationPolicy;
import com.android.settings.core.PreferenceControllerMixin;
import com.android.settings.core.TogglePreferenceController;
import com.android.settings.overlay.FeatureFactory;
import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnPause;
import com.android.settingslib.core.lifecycle.events.OnResume;
public class StatusBarPreferenceController extends TogglePreferenceController implements
PreferenceControllerMixin, Preference.OnPreferenceChangeListener, LifecycleObserver,
OnResume, OnPause {
private Preference mPreference;
public StatusBarPreferenceController(Context context, String key) {
super(context, key);
}
@Override
public void updateState(Preference preference) {
mPreference = preference;
super.updateState(preference);
}
@Override
public void onResume() {
}
@Override
public void onPause() {
}
@Override
public int getAvailabilityStatus() {
return 0;
}
@Override
public boolean isSliceable() {
return TextUtils.equals(getPreferenceKey(), "status_bar");
}
@Override
public boolean isChecked() {
return Settings.System.getInt(mContext.getContentResolver(), HIDE_NAVIGATION, 1) == 1;
}
@Override
public boolean setChecked(boolean isChecked) {
if (isChecked) {
mContext.sendBroadcast(new Intent(Intent.ACTION_BAR_SHOW));
} else {
mContext.sendBroadcast(new Intent(Intent.ACTION_BAR_HIDE));
}
Settings.System.putInt(mContext.getContentResolver(), HIDE_NAVIGATION, isChecked ? 1 : 0);
return true;
}
}
更多推荐
已为社区贡献16条内容
所有评论(0)