? ?Android14相對于之前的Android版本(11,12,13)StatusBar.java文件進(jìn)行了拆分,所以在Android14中StatusBar的許多函數(shù)方法等都更換了位置,不過萬變不離其宗,我們添加控制按鈕的方法和思路也是類似的,本文以添加下拉菜單控制按鈕為例,進(jìn)行定制化修改。
需求:一些應(yīng)用程序中讀取通知但在其他應(yīng)用程序中我們需要始終鎖定下拉菜單,希望添加Drop Menu 控制器用于控制Menu是否正常下拉。
實(shí)現(xiàn)思路:
1.Settings模塊:在Settings模塊中顯示菜單添加開關(guān),用于開啟和關(guān)閉下拉菜單,并發(fā)送相應(yīng)的廣播,并寫入相應(yīng)的系統(tǒng)屬性。
2.SystemUI模塊:添加廣播接收器,用于接收控制下拉菜單顯示和隱藏的廣播,并執(zhí)行相應(yīng)的操作。同時(shí)添加系統(tǒng)屬性讀取,用于獲取下拉菜單的初始狀態(tài)。
Settings模塊:
1.添加顯示字符串,如有多語言需求請自行在該語言包添加
alps/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values/strings.xml
2.在設(shè)置模塊的顯示菜單?display_settings.xml中添加目標(biāo)按鈕的鍵值和標(biāo)題以及控制類
alps/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/display_settings.xml
android:key="ctrl_explan" android:title="@string/ctrl_explan" settings:controller="com.android.settings.display.ExPlanPreferenceController.java"/> 3.在Settings模塊的DisplaySettings.java文件中,用于注冊我們的控制開關(guān): alps/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/DisplaySettings.java --- a/alps/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/DisplaySettings.java +++ b/alps/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/DisplaySettings.java @@ -29,6 +29,7 @@ import com.android.settings.display.TapToWakePreferenceController; import com.android.settings.display.ThemePreferenceController; import com.android.settings.display.VrDisplayPreferenceController; import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settings.display.ExPlanPreferenceController; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.core.lifecycle.Lifecycle; import com.android.settingslib.search.SearchIndexable; @@ -91,6 +92,9 @@ public class DisplaySettings extends DashboardFragment { /// M: add for HDMI settings @{ controllers.add(new HdmiPreferenceController(context)); /// @} + //wjj add + controllers.add(new ExPlanPreferenceController(context)); + //wjj end return controllers; } 4.添加下拉菜單控制類并添加宏控控制控制按鈕是否存在 alps/vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/display/ExPlanPreferenceController.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 ExPlanPreferenceController extends AbstractPreferenceController implements Preference.OnPreferenceChangeListener { private static final String TAG = "ExPlanCtrl"; private static final boolean DEBUG = true; private static final String KEY_EXPLAN = "ctrl_explan"; private static final String SYS_PROP_EXPLAN_ENABLE = "persist.sys.explan.enable"; private static final String ACTION_HIDE_EXPLAN = "sys.explan.hide"; private static final String ACTION_SHOW_EXPLAN = "sys.explan.show"; private static final boolean HX_TS818_BUG_70579 = SystemProperties.getBoolean("ro.hx_ts818_bug_70579", false); public ExPlanPreferenceController(Context context) { super(context); } @Override public String getPreferenceKey() { return KEY_EXPLAN; } @Override public boolean isAvailable() { if(HX_TS818_BUG_70579){ return true; }else{ return false; } } @Override public void displayPreference(PreferenceScreen screen) { if (!isAvailable()) { setVisible(screen, KEY_EXPLAN, false); return; } final SwitchPreference mExPlanPreference = screen.findPreference(KEY_EXPLAN); if (mExPlanPreference != null) { String value = SystemProperties.get(SYS_PROP_EXPLAN_ENABLE, "false"); mExPlanPreference.setChecked(value.equals("true")); mExPlanPreference.setOnPreferenceChangeListener(this); } } @Override public void updateState(Preference preference) { String value = SystemProperties.get(SYS_PROP_EXPLAN_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_EXPLAN); } else { intent.setAction(ACTION_HIDE_EXPLAN); } mContext.sendBroadcast(intent); return true; } } SystemUI模塊 1.在SystemUI模塊的AndroidManifest.xml文件中聲明廣播,同時(shí)更改其權(quán)限讓其正常設(shè)置其邏輯。 alps/vendor/mediatek/proprietary/packages/apps/SystemUI/AndroidManifest.xml --- a/alps/vendor/mediatek/proprietary/packages/apps/SystemUI/AndroidManifest.xml +++ b/alps/vendor/mediatek/proprietary/packages/apps/SystemUI/AndroidManifest.xml @@ -19,7 +19,7 @@ xmlns:androidprv="http://schemas.android.com/apk/prv/res/android" package="com.android.systemui" - android:sharedUserId="android.uid.systemui" + android:sharedUserId="android.uid.system" xmlns:tools="http://schemas.android.com/tools" coreApp="true"> @@ -367,6 +367,10 @@ + + + + android:name=".SystemUIApplication" 2.在SystemUI模塊的CentralSurfacesImpl.java(原StatusBar.java)文件中,我們需要添加以下代碼,用于聲明和初始化一些變量和方法以及邏輯判斷: alps/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java --- a/alps/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +++ b/alps/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java @@ -298,6 +298,14 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { private static final String BANNER_ACTION_SETUP = "com.android.systemui.statusbar.banner_action_setup"; + //wjj add + private static final String ACTION_HIDE_EXPLAN = "sys.explan.hide"; + private static final String ACTION_SHOW_EXPLAN = "sys.explan.show"; + private static final String SYS_PROPERTY_EXPLAN = "persist.sys.explan.enable"; + + protected StatusBarManager mStatusBarManager; + //wjj end + private static final int MSG_OPEN_SETTINGS_PANEL = 1002; private static final int MSG_LAUNCH_TRANSITION_TIMEOUT = 1003; // 1020-1040 reserved for BaseStatusBar @@ -923,6 +931,9 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mUserTracker = userTracker; mFingerprintManager = fingerprintManager; mActivityStarter = activityStarter; + //wjj add + mStatusBarManager = (StatusBarManager) mContext.getSystemService(Context.STATUS_BAR_SERVICE); + //wjj end mLockscreenShadeTransitionController = lockscreenShadeTransitionController; mStartingSurfaceOptional = startingSurfaceOptional; @@ -980,6 +991,15 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { bubbles.setExpandListener(listener); } + //wjj add + public void explan_show() { + mStatusBarManager.disable(StatusBarManager.DISABLE_NONE); + } + public void explan_hide() { + mStatusBarManager.disable(StatusBarManager.DISABLE_EXPAND); + } + //wjj end + @Override public void start() { mScreenLifecycle.addObserver(mScreenObserver); @@ -1322,7 +1342,11 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { mStatusBarTouchableRegionManager.setup(this, mNotificationShadeWindowView); createNavigationBar(result); - + //wjj add + if (SystemProperties.getBoolean(SYS_PROPERTY_EXPLAN, false)) { + explan_show(); + } + //wjj end if (ENABLE_LOCKSCREEN_WALLPAPER && mWallpaperSupported) { mLockscreenWallpaper = mLockscreenWallpaperLazy.get(); } @@ -1598,6 +1622,10 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { protected void registerBroadcastReceiver() { IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); + //wjj add + filter.addAction(ACTION_HIDE_EXPLAN); + filter.addAction(ACTION_SHOW_EXPLAN); + //wjj end filter.addAction(Intent.ACTION_SCREEN_OFF); mBroadcastDispatcher.registerReceiver(mBroadcastReceiver, filter, null, UserHandle.ALL); } @@ -2200,6 +2228,7 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { } } + @Override public void dump(PrintWriter pwOriginal, String[] args) { IndentingPrintWriter pw = DumpUtilsKt.asIndenting(pwOriginal); @@ -2384,7 +2413,15 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { } finishBarAnimations(); resetUserExpandedStates(); - } + //wjj add + } else if (ACTION_HIDE_EXPLAN.equals(action)) { + explan_hide(); + SystemProperties.set(SYS_PROPERTY_EXPLAN, "false"); + } else if (ACTION_SHOW_EXPLAN.equals(action)) { + explan_show(); + SystemProperties.set(SYS_PROPERTY_EXPLAN, "true"); + } + //wjj end Trace.endSection(); } }; end 總結(jié): 后續(xù)編譯檢測達(dá)成目標(biāo)效果,開關(guān)開啟時(shí)正常下拉下拉欄,開關(guān)關(guān)閉時(shí)無法正常使用下拉功能。 如需進(jìn)一步控制SystemUI狀態(tài)欄以及導(dǎo)航欄,可以參考以下鏈接。 Android系統(tǒng) 添加動態(tài)控制SystemUI狀態(tài)欄、導(dǎo)航欄和下拉菜單_android 下拉菜單-CSDN博客 推薦文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。