1.找到虚拟按键
vendor/mediatek/proprietary/packages/apps/SystemUI/res/values/config.xml中定义了初始的虚拟按键位置:
(若不需要控制可以在overlay中直接进行修改)
<string name="config_navBarLayout" translatable="false">left[.5W],back[1WC];home;recent[1WC],right[.5W]</string>
2.找到加载虚拟按键的方法
vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java中的
getDefaultLayout方法中return mContext.getString(R.string.config_navBarLayout);
3.需要进行控制思路很简单只需要在getDefaultLayout方法中加个判断语句进行控制即可,麻烦的是在设置中加入控制选项并更新SystemUI
3.1 在设置中的显示设置加控制虚拟按键交换的选项并添加控制功能
3.1.1 在vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values/arrays.xml中添加
+ <string-array name="nav_back_key_entries">
+ <item>Back key to the left </item>
+ <item>Back key to the right</item>
+ </string-array>
+
+ <string-array name="nav_back_key_values" translatable="false">
+ <item>1</item>
+ <item>2</item>
+ </string-array>
3.1.2 在vendor/mediatek/proprietary/packages/apps/MtkSettings/res/values/strings.xml中添加
+ <string name="nav_bar_key_right_title">Set back key</string>
3.1.3 在vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml/display_settings.xml中添加
+ <ListPreference
+ android:key="nav_bar_key_right"
+ android:title="@string/nav_bar_key_right_title"
+ android:entries="@array/nav_back_key_entries"
+ android:entryValues="@array/nav_back_key_values" />
3.1.4 在vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/DisplaySettings.java中添加
@@ -38,6 +38,7 @@ import com.android.settings.display.ThemePreferenceController;
import com.android.settings.display.TimeoutPreferenceController;
import com.android.settings.display.VrDisplayPreferenceController;
import com.android.settings.display.WallpaperPreferenceController;
+import com.android.settings.display.NavigationController;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable;
import com.android.settingslib.core.AbstractPreferenceController;
@@ -97,6 +98,7 @@ public class DisplaySettings extends DashboardFragment {
Context context, Lifecycle lifecycle) {
final List<AbstractPreferenceController> controllers = new ArrayList<>();
controllers.add(new AutoBrightnessPreferenceController(context, KEY_AUTO_BRIGHTNESS));
+ controllers.add(new NavigationController(context));
controllers.add(new AutoRotatePreferenceController(context, lifecycle));
controllers.add(new CameraGesturePreferenceController(context));
controllers.add(new FontSizePreferenceController(context));
3.1.5 新建类 vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/display/NavigationController.java
@@ -0,0 +1,72 @@
+package com.android.settings.display;
+import android.content.Context;
+import android.provider.Settings;
+import android.support.v7.preference.Preference;
+import com.android.settings.R;
+import android.util.Log;
+import com.android.settings.core.PreferenceControllerMixin;
+import com.android.settingslib.core.AbstractPreferenceController;
+import android.support.v7.preference.PreferenceScreen;
+import android.support.v7.preference.ListPreference;
+import android.os.SystemProperties;
+
+public class NavigationController extends AbstractPreferenceController implements
+ PreferenceControllerMixin, Preference.OnPreferenceChangeListener {
+ private final String NavBarKey ="nav_bar_key_right";
+ private ListPreference mNavBackKeyRight;
+
+ public NavigationController (Context context){
+ super(context);
+ }
+ @Override
+ public boolean isAvailable() {
+ return SystemProperties.get("ro.miki_backkey_change").equals("1");
+ }
+
+ @Override
+ public String getPreferenceKey() {
+ return NavBarKey;
+ }
+
+ @Override
+ public void displayPreference(PreferenceScreen screen) {
+ if (!isAvailable()) {
+ removePreference(screen, NavBarKey);
+ return;
+ }
+ mNavBackKeyRight = (ListPreference) screen.findPreference(
+ NavBarKey);
+ if (mNavBackKeyRight != null) {
+ int defaultValue = Settings.System.getInt(mContext.getContentResolver(), "navigation_bar_back_right", 1);
+ mNavBackKeyRight.setValue(String.valueOf(defaultValue));
+ mNavBackKeyRight.setSummary(mContext.getResources().getStringArray(R.array.nav_back_key_entries)[defaultValue - 1]);
+ mNavBackKeyRight.setOnPreferenceChangeListener(this);
+ }
+ }
+ @Override
+ public boolean onPreferenceChange(Preference preference, Object newValue) {
+ try {
+ final int value = Integer.parseInt((String) newValue);
+ String summary = "";
+ switch (value) {
+ case 1:
+ Log.e("jiaz","case 1");
+ summary = mContext.getResources().getStringArray(R.array.nav_back_key_entries)[0];
+ break;
+ case 2:
+ Log.e("jiaz","case 2");
+ summary = mContext.getResources().getStringArray(R.array.nav_back_key_entries)[1];
+ break;
+ default:
+ summary = mContext.getResources().getStringArray(R.array.nav_back_key_entries)[0];
+ break;
+ }
+ mNavBackKeyRight.setSummary(summary);
+ Settings.System.putInt(mContext.getContentResolver(), "navigation_bar_back_right", value);
+ } catch (NumberFormatException e) {
+ Log.e("jiaz", "could not persist night mode setting", e);
+ return false;
+ }
+ return true;
+ }
+}
3.1.6 在vendor/mediatek/proprietary/packages/apps/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java中国添加
@@ -2325,6 +2325,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, "navigation_bar_back_right",
+ R.integer.def_nav_bar_back_right);
3.1.7 在vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarFragment.java中添加
@@ -104,7 +104,7 @@ public class NavigationBarFragment extends Fragment implements Callbacks {
protected AssistManager mAssistManager;
private int mNavigationBarWindowState = WINDOW_STATE_SHOWING;
+ private BkRightContentObserver mBkRightObserver;
private int mNavigationIconHints = 0;
private int mNavigationBarMode;
private AccessibilityManager mAccessibilityManager;
@@ -147,7 +147,9 @@ public class NavigationBarFragment extends Fragment implements Callbacks {
mContentResolver.registerContentObserver(Settings.Secure.getUriFor(
Settings.Secure.ACCESSIBILITY_DISPLAY_MAGNIFICATION_NAVBAR_ENABLED), false,
mMagnificationObserver, UserHandle.USER_ALL);
+ //add by jiaz
+ mBkRightObserver = new BkRightContentObserver(getContext().getMainThreadHandler());
+ mContentResolver.registerContentObserver(Settings.System.getUriFor("navigation_bar_back_right"),true,mBkRightObserver);
if (savedInstanceState != null) {
mDisabledFlags1 = savedInstanceState.getInt(EXTRA_DISABLE_STATE, 0);
}
@@ -640,7 +642,22 @@ public class NavigationBarFragment extends Fragment implements Callbacks {
NavigationBarFragment.this.updateAccessibilityServicesState(mAccessibilityManager);
}
}
+ private class BkRightContentObserver extends ContentObserver {
+ public BkRightContentObserver(Handler handler) {
+ super(handler);
+ }
+ @Override
+ public void onChange(boolean selfChange) {
+ Handler h = getView().getHandler();
+ Message msg = Message.obtain(h, () -> {
+ //jiaz
+ mNavigationBarView.onBKChanged();
+ repositionNavigationBar();
+ });
+ msg.setAsynchronous(true);
+ h.sendMessageAtFrontOfQueue(msg);
+ }
+ }
3.1.7 在vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java添加
@@ -47,6 +47,7 @@ import java.util.List;
import java.util.Objects;
import android.os.SystemProperties;//add by jiaz for change backkey
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
+import android.provider.Settings;
public class NavigationBarInflaterView extends FrameLayout
implements Tunable, PluginListener<NavBarButtonProvider> {
@@ -134,7 +135,8 @@ public class NavigationBarInflaterView extends FrameLayout
}
protected String getDefaultLayout() {
+ int bkRight = Settings.System.getInt(mContext.getContentResolver(), "navigation_bar_back_right", 1);
+ if(bkRight == 2){
+ return mContext.getString(R.string.config_navBarLayout_right);
}else{
return mContext.getString(R.string.config_navBarLayout);
@@ -436,4 +438,8 @@ public class NavigationBarInflaterView extends FrameLayout
clearViews();
inflateLayout(mCurrentLayout);
}
+ public void changeBK(){
+ clearViews();
+ inflateLayout(getDefaultLayout());
+ }
}
3.1.8 在vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java添加
@@ -883,7 +883,9 @@ public class NavigationBarView extends FrameLayout implements PluginListener<Nav
public interface OnVerticalChangedListener {
void onVerticalChanged(boolean isVertical);
}
+ public void onBKChanged(){
+ ((NavigationBarInflaterView) findViewById(R.id.navigation_inflater)).changeBK();
+ }
private final Consumer<Boolean> mDockedListener = exists -> mHandler.post(() -> {
mDockedStackExists = exists;
updateRecentsIcon();
在vendor/mediatek/proprietary/packages/apps/SystemUI/res/values/config.xml中添加
@@ -327,7 +327,7 @@
<!-- Nav bar button default ordering/layout -->
<string name="config_navBarLayout" translatable="false">left[.5W],back[1WC];home;recent[1WC],right[.5W]</string>
+ <string name="config_navBarLayout_right" translatable="false">left[.5W],recent[1WC];home;back[1WC],right[.5W]</string></code>
---------------------
作者:路人西贝 来源:CSDN 原文:https://blog.csdn.net/Jia_zero/article/details/79871055?utm_source=copy