1. 程式人生 > >android 下拉狀態列(SystemUI)常見修改記錄

android 下拉狀態列(SystemUI)常見修改記錄

  • 摘要:下拉狀態列:1.下拉狀態列的亮度條:frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSPanel.javamBrightnessView對應佈局檔案:quick_settings_brightness_dialog.xml2.滑動亮度條後過渡到桌面的亮度條frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phon
  • 下拉狀態列:

    1.下拉狀態列的亮度條:

    frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java

    mBrightnessView

    對應佈局檔案:quick_settings_brightness_dialog.xml

    2.滑動亮度條後過渡到桌面的亮度條

     

    frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java

    protected void inflateStatusBarWindow(Context context) { 
            mStatusBarWindow = (StatusBarWindowView) View.inflate(context, 
                    R.layout.super_status_bar, null); 
        }

    mStatusBarWindow

    對應佈局檔案:super_status_bar.xml

    佈局檔案中對應項:<includelayout="@layout/brightness_mirror" />

    3.亮度條中的滑動條樣式修改

     

    frameworks/base/packages/SystemUI/src/com/android/systemui/settings/ToggleSlider.java

    佈局檔案:status_bar_toggle_slider.xml

    4.下拉狀態列的圖示塊

    有兩處

    /frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/***Tile.java

    對應的Vector向量圖檔案命名為ic_qs_xxx.xml

    AirplaneModeTile:飛航模式,預設有動畫的。用圖片替換要把動畫在程式碼中註釋掉。

    BatteryTile:電池。用BatteryMeterDrawable自定義view畫出來的。

    BluetoothTile:藍芽

    CastTile:投射

    CellularTile:移動資料網路,無sim卡

    ColorInversionTile:反色

    DataSaverTile:流量節省程式

    DataUsageDetailView:預設沒顯示,資料使用細節

    DndTile:勿擾donot disturb

    FlashlightTile:手電筒

    HotspotTile:熱點

    IntentTile:預設沒顯示,不知道長啥樣

    LocationTile:位置資訊

    RotationLockTile:自動旋轉,縱向

    ScreenShotTile:截圖

    UserDetailItemView:預設沒顯示,不知道長啥樣

    UserDetailView:預設沒顯示,不知道長啥樣

    UserTile:預設沒顯示,不知道長啥樣

    WifiTile:Wlan

    WorkModeTile:預設沒顯示,不知道長啥樣

    還有MTK的

    /frameworks/base/packages/SystemUI/src/com/mediatek/systemui/qs/tiles/***Tile.java

    HotKnotTile

    ApnSettingsTile

    DualSimSettingsTile

    MobileDataTile

    QsIconWrapper

    SimDataConnectionTile

    5.增刪下拉狀態列的圖示塊

    frameworks/base/packages/SystemUI/res/values/config.xml中修改

    <!--The default tiles to display in QuickSettings -->
    <!--M: add hotknot tile -->
    <stringname="quick_settings_tiles_default" translatable="false">
    wifi,cell,battery,dnd,flashlight,rotation,bt,airplane,location,hotknot,screenshot
    </string>

    6.WLAN圖示塊點選後訊號強度

     

    frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/AccessPointControllerImpl.java

        private static final int[] ICONS = { 
            R.drawable.ic_qs_wifi_full_0, 
            R.drawable.ic_qs_wifi_full_1, 
            R.drawable.ic_qs_wifi_full_2, 
            R.drawable.ic_qs_wifi_full_3, 
            R.drawable.ic_qs_wifi_full_4, 
        };

    7.修改手機訊號強度圖

    frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/TelephonyIcons.java

        static final int[][] QS_TELEPHONY_SIGNAL_STRENGTH = { 
            { R.drawable.ic_qs_signal_0, 
              R.drawable.ic_qs_signal_1, 
              R.drawable.ic_qs_signal_2, 
              R.drawable.ic_qs_signal_3, 
              R.drawable.ic_qs_signal_4 }, 
            { R.drawable.ic_qs_signal_full_0, 
              R.drawable.ic_qs_signal_full_1, 
              R.drawable.ic_qs_signal_full_2, 
              R.drawable.ic_qs_signal_full_3, 
              R.drawable.ic_qs_signal_full_4 } 
        };
     

    8.單條通知欄ui修改

     

    修改兩個位置:

    位置1:

    frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/ActivatableNotificationView.java

    protectedvoid onFinishInflate() {}中

    修改下面兩句

    mBackgroundNormal.setCustomBackground

    mBackgroundDimmed.setCustomBackground

    同時讓下面兩個方法為空

    privatevoid updateOutlineAlpha() {}

    publicvoid setFakeShadowIntensity(float shadowIntensity, floatoutlineAlpha, int shadowYEnd,

    intoutlineTranslation) {}

    位置2:

    frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/stack/NotificationStackScrollLayout.java

    這個是個ViewGroup,它在onDraw裡面還畫了次背景。需要幹掉這個背景。

    讓下面這個方法為空。

    privatevoid updateBackground() {}

    protectedvoid onDraw(Canvas canvas) {}中登出掉下面這句

    canvas.drawRect(0,mCurrentBounds.top, getWidth(), mCurrentBounds.bottom,mBackgroundPaint);

    修改後效果:

     

    9.多條通知欄的背景修改

     

    frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelView

    預設背景就是當前介面截圖加了個黑色透明度。

    這個要謹改,因為會影響到按下power鍵喚醒螢幕時候的鎖屏。如果把背景設成黑色,可能power鍵喚醒屏幕後,多條通知欄的背景是黑的。

    10.刪除修改顯示佈局邊界,GPU呈現模式分析,Nearby

     

    GPU呈現模式分析,顯示佈局邊界都是packages/apps/Settings中的

    在AndroidManifest.xml中可以找到

    	<service 
                    android:name=".qstile.DevelopmentTiles$ShowLayout" 
                    android:label="@string/debug_layout" 
                    android:icon="@drawable/tile_icon_show_layout" 
                    android:permission="android.permission.BIND_QUICK_SETTINGS_TILE" 
                    android:enabled="false"> 
                <intent-filter> 
                    <action android:name="android.service.quicksettings.action.QS_TILE" /> 
                </intent-filter> 
            </service> 
            <service 
                    android:name=".qstile.DevelopmentTiles$GPUProfiling" 
                    android:label="@string/track_frame_time" 
                    android:icon="@drawable/tile_icon_graphics" 
                    android:permission="android.permission.BIND_QUICK_SETTINGS_TILE" 
                    android:enabled="false"> 
                <intent-filter> 
                    <action android:name="android.service.quicksettings.action.QS_TILE" /> 
                </intent-filter> 
            </service>

    label對應的string在framework/base/packages/SettingsLib中

    icon對應的drawable在packages/apps/Settings中

    packages/apps/Settings/src/com/android/settings/qstile/DevelopmentTiles.java

    Nearby是谷歌的玩意,修改的話也能修改,就是加判定在TileQueryHelper.java中修改,當然上面的

    GPU呈現模式分析,顯示佈局邊界也可以這麼修改。只不過不建議用這種方式修改。

    刪除這三個東西:

    frameworks/base/packages/SystemUI/src/com/android/systemui/qs/customize/TileQueryHelper.java

        private class QueryTilesTask extends 
                AsyncTask<Collection<QSTile<?>>, Void, Collection<TileInfo>> {}
    		doInBackground{}中
                List<ResolveInfo> services = pm.queryIntentServicesAsUser( 
                        new Intent(TileService.ACTION_QS_TILE), 0, ActivityManager.getCurrentUser());
    這句修改為
    			//lqp 
                	//List<ResolveInfo> services = pm.queryIntentServicesAsUser( 
                   //     new Intent(TileService.ACTION_QS_TILE), 0, ActivityManager.getCurrentUser()); 
    		List<ResolveInfo> services = new ArrayList<ResolveInfo>(); 

    11.為原生android下拉狀態列新增自動調節亮度開關

     

    alps/device/mediatek/mt6735/bird.mk

    alps/frameworks/base/packages/SystemUI/bird/res/layout/ui_icon_qs_brightness_dialog.xml

    alps/frameworks/base/packages/SystemUI/bird/res/values-zh-rCN/strings.xml

    alps/frameworks/base/packages/SystemUI/bird/res/values/strings.xml

    alps/frameworks/base/packages/SystemUI/bird/src/com/bird/systemui/BirdFeatureOption.java

    alps/frameworks/base/packages/SystemUI/res/layout/quick_settings_brightness_dialog.xml

    alps/frameworks/base/packages/SystemUI/src/com/android/systemui/qs/QSPanel.java

    .../base/packages/SystemUI/src/com/android/systemui/statusbar/phone/PhoneStatusBar.java

    alps/packages/apps/Settings/src/com/android/settings/DisplaySettings.java

    三個地方需要同步,設定中的顯示DisplaySettings.下拉狀態列的圖示處QSPanel,點選滑條後的PhoneStatusBar。

    如何同步? 使用觀察者模式。

    在Switch進行操作後需要變更Settings.System.SCREEN_BRIGHTNESS_MODE值。在值變化後Switch控制元件狀態需要同步變化。

    QSPanel.java中程式碼:

    //liuqipeng add 20170619 BUG #26165 
    import android.widget.CompoundButton; 
    import android.widget.ToggleButton; 
    import android.widget.Switch; 
    import android.provider.Settings; 
    import android.widget.CompoundButton.OnCheckedChangeListener; 
    import android.database.ContentObserver; 
    import static android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE; 
    import static android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_AUTOMATIC; 
    import static android.provider.Settings.System.SCREEN_BRIGHTNESS_MODE_MANUAL; 
    //liuqipeng end 20170619
    public QSPanel(Context context, AttributeSet attrs) {
    		//liuqipeng add 20170619 BUG #26165 
    		if(BirdFeatureOption.BIRD_SHOW_AUTO_BRIGHT_SWITCH){ 
    			View mAutoBrightRl=findViewById(R.id.auto_bright_rl); 
    			mAutoBrightRl.setVisibility(View.VISIBLE); 
    			Switch mAutoBright=(Switch)findViewById(R.id.auto_bright_switch); 
    		    int brightnessMode = Settings.System.getInt(context.getContentResolver(), 
    		            SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_MANUAL); 
    			mAutoBright.setChecked(brightnessMode != SCREEN_BRIGHTNESS_MODE_MANUAL); 
    			mAutoBright.setOnCheckedChangeListener(new OnCheckedChangeListener() { 
    			 
    				@Override 
    				public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
    				    Settings.System.putInt(context.getContentResolver(), SCREEN_BRIGHTNESS_MODE, 
    				            isChecked ? SCREEN_BRIGHTNESS_MODE_AUTOMATIC : SCREEN_BRIGHTNESS_MODE_MANUAL); 
    				} 
    			}); 
    			ContentObserver BrightnessMode = new ContentObserver(new Handler()) { 
    				@Override 
    				public void onChange(boolean selfChange) { 
    					super.onChange(selfChange); 
    					int brightnessMode = Settings.System.getInt(context.getContentResolver(), 
    							SCREEN_BRIGHTNESS_MODE, SCREEN_BRIGHTNESS_MODE_MANUAL); 
    					mAutoBright.setChecked(brightnessMode != SCREEN_BRIGHTNESS_MODE_MANUAL); 
    				} 
    			}; 
    			context.getContentResolver().registerContentObserver(Settings.System.getUriFor(Settings.System.SCREEN_BRIGHTNESS_MODE),true, BrightnessMode); 
    		} 
    }
    		//liuqipeng end 20170619