Android frameworks 开发总结之八

Quick Settings增加一項

XXX device要求在quick settings中增加一項touch panel.

  • 在/frameworks/base/packages/SystemUI/res/values/config.xml文件中的quick_settings_tiles_default string 中增加touch panel。並在String resource文件中增加顯示的title


    
        wifi,bt,dnd,touchpanel,flashlight,rotation,battery,cell,airplane,cast
    
  • 在frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles 下增加TouchPanelTile.java文件.

package com.android.systemui.qs.tiles;

import android.content.Intent;
import android.provider.Settings;
import android.util.Log;
import android.os.SystemProperties;

import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.R;
import com.android.systemui.qs.QSHost;
import com.android.systemui.plugins.qs.QSTile;
import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.plugins.qs.QSTile.BooleanState;

import javax.inject.Inject;

/**
 /** Quick settings tile: Touch Panel **/
public class TouchPanelTile extends QSTileImpl {
    private static final String PERSIST_KEY_PROP_TOUCH_MODE = "persist.sys.touch_mode";
    private static final int TOUCH_MODE_PROPERTY_FINGER = 0;
    private static final int TOUCH_MODE_PROPERTY_STYLUS = 1;
    private static final int TOUCH_MODE_PROPERTY_GLOVE = 2;
    private static final String TOUCH_MODE_FINGER = "finger";
    private static final String TOUCH_MODE_STYLUS = "stylus";
    private static final String TOUCH_MODE_GLOVE = "glove";
    private int mTouchPanelMode = 0;
    private QSHost qsHost;
    private boolean isHandleClick = false;
    @Inject
    public TouchPanelTile(QSHost host) {
        super(host);
        qsHost = host;
    }

    @Override
    public BooleanState newTileState() {
        return new BooleanState();
    }

    @Override
    protected void handleClick() {
        mTouchPanelMode ++;   //在quick setting中點擊時調用
        if(mTouchPanelMode > TOUCH_MODE_PROPERTY_GLOVE){
            mTouchPanelMode = TOUCH_MODE_PROPERTY_FINGER;
        }
        updateTouchMode(mTouchPanelMode);
        isHandleClick = true;
        refreshState();
        Log.i("WKS1","TouchPanelTile -> handleClick: mTouchPanelMode = " + mTouchPanelMode);
    }

    @Override
    protected void handleUpdateState(BooleanState state, Object arg) { //下拉quick setting時調用
        if (isHandleClick) {
            …..
        } else {
            try {
                String mode = SystemProperties.get(PERSIST_KEY_PROP_TOUCH_MODE);
                ……
                    //state.labe 設置顯示title
                    state.label = mContext.getString(R.string.quick_settings_touch_panel_stylus);
                }
                Log.i("WKS1", "TouchPanelTile -> handleUpdateState: mode = " + mode);
            } catch (NumberFormatException e) {
                Log.e(TAG, "could not get touch mode", e);
            }
        }
        isHandleClick = false;
        state.icon = ResourceIcon.get(R.drawable.ic_qs_bluetooth_on);
        Log.i("WKS1","TouchPanelTile -> handleUpdateState: state.value = " + state.value);
        Log.i("WKS1","TouchPanelTile -> handleUpdateState: mTouchPanelMode = " + mTouchPanelMode);
    }

    @Override
    public int getMetricsCategory() {
        return MetricsEvent.QS_TOUCHPANEL;
    }

    @Override
    public Intent getLongClickIntent() { //長按顯示界面
        return new Intent(Settings.ACTION_DISPLAY_SETTINGS);
    }

  ...
    @Override
    public CharSequence getTileLabel() {
        if (mTouchPanelMode == TOUCH_MODE_PROPERTY_FINGER) {
            return mContext.getString(R.string.quick_settings_touch_panel_finger);
        } else if (mTouchPanelMode == TOUCH_MODE_PROPERTY_GLOVE) {
            return mContext.getString(R.string.quick_settings_touch_panel_glove);
        } else {
            return mContext.getString(R.string.quick_settings_touch_panel_stylus);
        }
    }

    private void updateTouchMode(int mode){
       //SystemUI 中使用SystemProperties.set提示設置失敗,使用settings數據監聽方式 Settings.System.putInt(qsHost.getContext().getContentResolver(),Settings.System.TOUCH_PANEL_MODE,mode);
    }
}
  • frameworks/base/proto/src/metrics_constants/metrics_constants.proto 文件中增加 MetricsEvent.QS_TOUCHPANEL

// OPEN: QS Touch Panel tile shown
    // ACTION: QS Touch Panel tile tapped
    //  SUBTYPE: 0 is off, 1 is finger, 2 is glove, 3 is stylus
    // CATEGORY: QUICK_SETTINGS
    QS_TOUCHPANEL = 1751;
  • 在frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java 文件中實現

@@ -46,6 +46,7 @@ import com.android.systemui.qs.tiles.UserTile;
 import com.android.systemui.qs.tiles.WifiTile;
 import com.android.systemui.qs.tiles.WorkModeTile;
 import com.android.systemui.util.leak.GarbageMonitor;
+import com.android.systemui.qs.tiles.TouchPanelTile;
 
 import javax.inject.Inject;
 import javax.inject.Provider;
@@ -75,6 +76,7 @@ public class QSFactoryImpl implements QSFactory {
     private final Provider mNfcTileProvider;
     private final Provider mMemoryTileProvider;
     private final Provider mUiModeNightTileProvider;
+    private final Provider mTouchPanelProvider;
 
     private QSTileHost mHost;
 
@@ -97,7 +99,8 @@ public class QSFactoryImpl implements QSFactory {
             Provider nightDisplayTileProvider,
             Provider nfcTileProvider,
             Provider memoryTileProvider,
-            Provider uiModeNightTileProvider) {
+            Provider uiModeNightTileProvider,
+            Provider TouchPanelTileProvider) {
         mWifiTileProvider = wifiTileProvider;
         mBluetoothTileProvider = bluetoothTileProvider;
         mCellularTileProvider = cellularTileProvider;
@@ -117,6 +120,7 @@ public class QSFactoryImpl implements QSFactory {
         mNfcTileProvider = nfcTileProvider;
         mMemoryTileProvider = memoryTileProvider;
         mUiModeNightTileProvider = uiModeNightTileProvider;
+        mTouchPanelProvider = TouchPanelTileProvider;
     }
 
     public void setHost(QSTileHost host) {
@@ -170,6 +174,8 @@ public class QSFactoryImpl implements QSFactory {
                 return mNfcTileProvider.get();
             case "dark":
                 return mUiModeNightTileProvider.get();
+            case "touchpanel":
+                return mTouchPanelProvider.get();
         }

你可能感兴趣的:(android,前端,linux)