Android目录文件
V500/android/packages/apps/Setting/AndroidManifest.xml ==> 系统的各种权限
作为一名软件开发工程师,曾经对于如何确认当前activity的详细信息非常想知道,后来学会了一个命令:
adb shell dumpsys activity | grep -i foc
可以方便的查看当前activity的详细信息。
V501设置修改
1.Setting默认配置相关属性修改
1)手机中涉及到“设备名称”统一修改:
设置-关于手机-设备名称
蓝牙、WIFI热点、WIFI同步等
Right:
-
进入
/V500/android/vendor/mediatek/proprietary/packages/apps/SettingsProvider$
中 的SettingsProvider\res\values\defaults.xml
-
修改 xml 内容
<!-- Default for Settings.Global.DEVICE_NAME $1=MODEL--> <string name="def_device_name_simple">%1$s</string>
-
内容改为
TINNO
2).setting-display-Font size
将默认的default改为samll
Right:
- 进入配置数据库中:
/V500/android/vendor/mediatek/proprietary/packages/apps/SettingsProvider\src\com\android\providers\settings/DatabaseHelper.java
- 在
loadSystemSettings()方法中
添加:loadSetting(stmt, Settings.System.FONT_SCALE, 0.85f);
3).setting-display-Screen timeout
配置默认值为:5 minutes
Right:
xml修改
-
进入
/V500/android/vendor/mediatek/proprietary/packages/apps/SettingsProvider$
中 的SettingsProvider\res\values\defaults.xml
-
<integer name=" ">60000</integer>//自动关闭屏幕时间60秒,可以通过设置为非常大的值来达到不息屏的目的
-
将
60000
改为300000
4).Location:
配置定位默认打开(如果打开则配置默认关闭)
Right:
-
进入
/V500/android/vendor/mediatek/proprietary/packages/apps/SettingsProvider$
中 的SettingsProvider\res\values\defaults.xml
-
<bool name="assisted_gps_enabled">false</bool> //GPS定位 关
-
将
false
改为true
-
将
<integer name="def_location_mode">3</integer>
, -
将
3
更改为0
5).Auto rotate screen
配置自动旋转默认打开
Right:
- 进入
/V500/android/vendor/mediatek/proprietary/packages/apps/SettingsProvider$
中 的SettingsProvider\res\values\defaults.xml
<bool name="def_accelerometer_rotation">false</bool> //自动旋转 关
- 将
false
改为true
6).language
默认 语言修改为除英语以外的其他语言
Right:
-
进入配置数据库中:
/V500/android/vendor/mediatek/proprietary/packages/apps/SettingsProvider$
-
在 SettingsProvider/res/values/defaults.xml 中定义默认值字符串,如下所示。其中第一个语言会作 为默认语言被选中,它会覆盖掉 PRODUCT_LOCALES 中的配置的默认语言。第一个语言不使用en-US
<string name="system_locales" translatable="false">zh-Hans-CN,fr-FR,en-US,es-ES</string>
-
将上面配置的默认值字符串加载到设置数据库中,配置项在 System表中,所以需要在文件路径
\v501\android\vendor\mediatek\proprietary\packages\apps\SettingsProvider\src\com\android\providers\settings/DatabaseHelper.java
的 loadSystemSettings 方 法中添加如下代码:loadStringSetting(stmt, Settings.System.SYSTEM_LOCALES, R.string.system_locales);
2.在Settings下创建菜单并实现简单功能
实现功能:
在Settings下面新增自定义一级菜单,放在一级菜单末尾;
自定义一级菜单能跳转到自定义的二级菜单;
二级菜单中至少包含3个不同的Preference;
Preference应该对点击或者长按有自定的反馈(比如能有Dialog或者Toast等)
资料:https://juejin.cn/post/6956851213476298788
-
在
V500/android/vendor/mediatek/proprietary/packages/apps/MtkSettings
中的配置文件AndroidManifest.xml
中找到主启动类,并找到主布局文件 -
Settings 布局文件主界面 路径
V500/android/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/layout
中的settings_homepage_container.xml
- 主界面布局中主要包含三部分:两个FrameLayout,一个顶部快捷搜索栏。其中Id为main_content的FrameLayout就是用来显示主设置内容的,即Settings的一级菜单项界面。
-
设置页面的
xml
文件V500/android/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml
中的的top_level_settings.xml
==> 一级菜单布局文件-
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:settings="http://schemas.android.com/apk/res-auto" android:key="top_level_settings"> <Preference android:key="top_level_network" android:title="@string/network_dashboard_title" android:summary="@string/summary_placeholder" android:icon="@drawable/ic_homepage_network" android:order="-120" android:fragment="com.android.settings.network.NetworkDashboardFragment" settings:controller="com.android.settings.network.TopLevelNetworkEntryPreferenceController"/> <Preference android:key="top_level_connected_devices" android:title="@string/connected_devices_dashboard_title" android:summary="@string/summary_placeholder" android:icon="@drawable/ic_homepage_connected_device" android:order="-110" android:fragment="com.android.settings.connecteddevice.ConnectedDeviceDashboardFragment" settings:controller="com.android.settings.connecteddevice.TopLevelConnectedDevicesPreferenceController"/> ... </PreferenceScreen>
-
其中:
key
:该配置项的主键title
:配置项的标题summary
:概要标题下面的文字icon
:前面的图标order
:用来做排序,值越小则排行越靠前fragment
:点击该item要跳转的界面,对应的xml是二级菜单controller
:该item的控制器,控制他的内容展示,是否可用,也可以控制它的点击事件
-
-
二级菜单:参考资料:https://blog.csdn.net/weixin_42339486/article/details/104312453
Right:
一级菜单:
-
在
V500/android/vendor/mediatek/proprietary/packages/apps/MtkSettings/res/xml
中的top_level_settings.xml
中,添加以下代码:<Preference android:icon="@drawable/ic_help" android:order="30" android:title="自定义一级菜单" android:summary="TINNO"/>
二级菜单:
-
在一级菜单中添加一个 Fragment -->
CustomsizeFragment
,代码如下:<Preference android:fragment="com.android.settings.customize.CustomizeFragment" android:key="top_level_customize" android:icon="@drawable/ic_help" android:order="30" android:title="自定义一级菜单" android:summary="TINNO"/>
-
编写
CustomsizeFragment
代码-
在
MtkSettings/src/com/android/settings
包下新建一个customsize
包,并创建CustomsizeFragment.java
package com.android.settings.customize; import android.content.Context; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.R; public class CustomizeFragment extends DashboardFragment{ private static final String TAG = "CustomizeFragment"; @Override public int getMetricsCategory() { return 0; } @Override protected String getLogTag() { return TAG; } @Override protected int getPreferenceScreenResId() { return R.xml.customize_settings; } }
-
创建 二级菜单 xml文件
customize_settings
,在MtkSettings/res/xml/
包下,新建customsize_settings.xml
<!-- ~ Copyright (C) 2021 The Android Open Source Project ~ ~ Licensed under the Apache License, Version 2.0 (the "License"); ~ you may not use this file except in compliance with the License. ~ You may obtain a copy of the License at ~ ~ http://www.apache.org/licenses/LICENSE-2.0 ~ ~ Unless required by applicable law or agreed to in writing, software ~ distributed under the License is distributed on an "AS IS" BASIS, ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ~ See the License for the specific language governing permissions and ~ limitations under the License. --> <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" xmlns:settings="http://schemas.android.com/apk/res-auto" android:key="customize_menu" android:title="自定义菜单"> <Preference android:key="customize_name_summary" android:title="自定义菜单的名字" android:icon="@drawable/ic_emergency_gesture_24dp" android:order="100"/> <Preference android:key="customize_group_summary" android:title="自定义菜单的组织" android:icon="@drawable/ic_emergency_gesture_24dp" android:order="150"/> <Preference android:key="customize_version_summary" android:title="版本号" android:icon="@drawable/ic_emergency_gesture_24dp" android:order="200"/> </PreferenceScreen>
-
为二级菜单设置点击事件, 在二级菜单的 fragment 方法中进行监听事件
CustomsizeFragment.java
package com.android.settings.customize; import android.content.Context; import android.os.Bundle; import android.util.Log; import android.widget.Toast; import androidx.preference.Preference; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.R; public class CustomizeFragment extends DashboardFragment implements Preference.OnPreferenceClickListener { private static final String TAG = "CustomizeFragment"; private Context mContext; private Preference name; private Preference group; private Preference version; @Override public void onCreatePreferences(Bundle savedInstanceState, String rootKey) { super.onCreatePreferences(savedInstanceState, rootKey); addPreferencesFromResource(R.xml.customize_settings); name = findPreference("customize_name_summary"); group = findPreference("customize_group_summary"); version = findPreference("customize_version_summary"); name.setOnPreferenceClickListener(this); group.setOnPreferenceClickListener(this); version.setOnPreferenceClickListener(this); } @Override protected int getPreferenceScreenResId() { return 0; } @Override public void onAttach(Context context) { super.onAttach(context); mContext = context; } @Override public int getMetricsCategory() { return 0; } @Override protected String getLogTag() { return TAG; } @Override public boolean onPreferenceClick(Preference preference) { Log.e(TAG, "onPreferenceClick: " + preference.getKey() ); switch (preference.getKey()){ case "customize_name_summary": Toast.makeText(mContext, "TINNO", Toast.LENGTH_SHORT).show(); break; case "customize_group_summary": Toast.makeText(mContext, "南昌", Toast.LENGTH_SHORT).show(); break; case "customize_version_summary": Toast.makeText(mContext, "版本为 1.0", Toast.LENGTH_SHORT).show(); break; } return false; } }
-
3.修改systemui中的quick setting(通知栏下拉后展示的 icon 列表)
两个要求:
一.在quick setting界面增加一个tile(icon)
二.修改quick setting 快捷设置的排序
资料:
在
config.xml
中添加选项:
在
android/vendor/mediatek/proprietary/packages/apps/SystemUI/res/values/config.xml
文件中,两个标签中:一个是默认的QS要显示的选项,一个是点击了编辑之后,所有的选项
<!-- The default tiles to display in QuickSettings --> <string name="quick_settings_tiles_default" translatable="false"> wifi,cell,battery,dnd,flashlight,rotation,bt,airplane,test </string> <!-- Tiles native to System UI. Order should match "quick_settings_tiles_default" --> <string name="quick_settings_tiles_stock" translatable="false"> wifi,cell,battery,dnd,flashlight,rotation,bt,airplane,test,location,hotspot,inversion,saver,work,cast,night </string>
创建自定义的 Tile,Tile的加载流程
Tile中方法
handleClick() 短按
getLongClickIntent() 长按
handleUpdateState() 更新状态
handleSecondaryClick() 点击开关label显示详情页
getToggleState() 若返回null详情页不显示switch开关。
getSettingsIntent() 跟长按的intent一样进入设置对应的界面。若返回null详情页不显示详细信息。
(1) 动作的监听响应:
- 在handleClick() 方法里处理点击事件;打开/关闭的动画也在这里调用;
- 部分开关需要重写handleSecondaryClick() 方法,例如Wi-Fi和蓝牙开关,在handleSecondaryClick() 方法里打开详情页面;
- 还有开关需要重写handleLongClick() ,例如反色和热点开关,在这里打开询问是否要隐藏的对话框;
- 在setListening() 方法里添加回调监听,接受action和注册广播等。
(2) 状态的管理:
状态管理通过一个由Host提供的looper来进行。
每个快捷开关在handleUpdateState()中更新状态。回调影响状态要通过快捷开关的工作looper调用refreshState() 来触发另一个状态更新。
状态类有三种,State类以及继承自State类的BooleanState类和SignalState类。需要判断开关与否的状态的快捷开关继承QSTile<QSTile.BooleanState>, 包括飞行模式、反色、手电筒、热点、定位、自动旋转、蓝牙和屏幕投射开关等;还需要判断连接等状态的快捷开关继承QSTile<QSTile.SignalState>,例如Wi-Fi和移动数据网络开关;其他直接继承QSTile<QSTile.State>。
(3) 另外,Wi-Fi和蓝牙开关需要重写supportsDualTargets() 方法和getDetailAdapter() 方法。因为这两个开关是绘制在一排两个开关的布局上而且需要显示详情页面。
- QSTile:快速设置Tile的基类,快速设置都继承自这个类。
- Tile通过重载handleUpdateState方法来更新状态。如果监听到状态变化,或者点击事件需要更新状态,使用refreshState来更新State。
- QSTileHost: Host的实现,管理Tile 状态的变化。它包含各种Tile的Control类,用来设置和监听Tile。
- State: Tile的状态,包含图标,名称等信息。
- H:继承自Handler, 通过looper跑在QSTileHost的线程里。用来处理Tile的各种事件。
- Tunable: 接口,配置变化的回调。QSTileHost实现这个接口。
- TunerSercice:用来监听各种配置变化。
资料: https://blog.csdn.net/kongbaidepao/article/details/84031724
Right:
-
新增一个 tile
-
进入
V501_TEST/android/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/qs/tileimpl
中 的QSFactoryImpl.java
类,在createTileInternal()
方法中 添加一个 caseprivate QSTileImpl createTileInternal(String tileSpec){ ……; switch(tileSpec){ ……; /* 新增一个Tile */ case "test": return mFlashlightTileProvider.get(); } }
-
在
V501_TEST/android/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/qs/
中的QSTileHost.java
类中,在loadTileSpecs()
方法中将该 tile 添加到列表中:protected static List<String> loadTileSpecs(Context context, String tileList) { final Resources res = context.getResources(); if (TextUtils.isEmpty(tileList)) { tileList = res.getString(R.string.quick_settings_tiles); if (DEBUG) Log.d(TAG, "Loaded tile specs from config: " + tileList); } else { if (DEBUG) Log.d(TAG, "Loaded tile specs from setting: " + tileList); } final ArrayList<String> tiles = new ArrayList<String>(); boolean addedDefault = false; Set<String> addedSpecs = new ArraySet<>(); for (String tile : tileList.split(",")) { tile = tile.trim(); if (tile.isEmpty()) continue; if (tile.equals("default")) { if (!addedDefault) { List<String> defaultSpecs = getDefaultSpecs(context); for (String spec : defaultSpecs) { if (!addedSpecs.contains(spec)) { tiles.add(spec); addedSpecs.add(spec); } } addedDefault = true; } } else { if (!addedSpecs.contains(tile)) { tiles.add(tile); addedSpecs.add(tile); } } } /* reset gerrit:4885000 start */ // TODO(b/174753536): Move it into the config file. // Only do the below hacking when at least one of the below tiles exist // --InternetTile // --WiFiTile // --CellularTIle if (tiles.contains("internet") || tiles.contains("wifi") || tiles.contains("cell")) { if (SystemUIApplication.SETTINGS_PROVIDER_MODEL) { if (!tiles.contains("internet")) { if (tiles.contains("wifi")) { // Replace the WiFi with Internet, and remove the Cell tiles.set(tiles.indexOf("wifi"), "internet"); tiles.remove("cell"); } else if (tiles.contains("cell")) { // Replace the Cell with Internet tiles.set(tiles.indexOf("cell"), "internet"); } } else { tiles.remove("wifi"); tiles.remove("cell"); } } else { if (tiles.contains("internet")) { tiles.set(tiles.indexOf("internet"), "wifi"); tiles.add("cell"); } } } // 新增一个 Tile tiles.add("test"); /* reset gerrit:4885000 end */ return tiles; }
-
-
修改 Tile的顺序
-
连接手机 进入
cmd
,删除系统默认的xml ,命令为:adb shell settings delete secure sysui_qs_tiles
查看系统默认的xml,命令为:
adb shell settings get secure sysui_qs_tiles
-
进入
overlay
目录下的config.xml
文件 ,路径如下:/V501_TEST/android/vendor/tinno/product/v500/cat/overlay/vendor/mediatek/proprietary/packages/apps/SystemUI/res/values$
目录下的config.xml
文件,修改quick_settings_tiles_default
的顺序内容<string name="quick_settings_tiles_default" translatable="false"> flashlight,rotation,wifi,bt,dnd,headset,battery,custom(com.google.android.gms/.nearby.sharing.SharingTileService),cell, airplane,cast,brightness,screenrecord </string>
-
-
自定义 Tile
-
自定义一个Tile,类名为
WXCustomTile.java
类,用来定义自定义快捷图标路径为 :
/V501_TEST/android/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/qs/tiles/
下package com.android.systemui.qs.tiles; import android.content.Context; import android.os.Looper; import androidx.annotation.Nullable; import android.content.Intent; import com.android.internal.logging.MetricsLogger; import com.android.systemui.R; import com.android.systemui.dagger.qualifiers.Background; import com.android.systemui.plugins.ActivityStarter; import com.android.systemui.plugins.FalsingManager; import com.android.systemui.plugins.qs.QSTile.BooleanState; import com.android.systemui.qs.QSHost; import com.android.systemui.qs.logging.QSLogger; import com.android.systemui.qs.tileimpl.QSTileImpl; import android.util.Log; import android.os.Handler; import javax.inject.Inject; import com.android.systemui.plugins.statusbar.StatusBarStateController; import android.view.View; import com.android.systemui.dagger.qualifiers.Main; public class WXCustomTile extends QSTileImpl<BooleanState>{ private static final String TAG = "WXCustomTile"; @Inject public WXCustomTile( QSHost host, @Background Looper backgroundLooper, @Main Handler mainHandler, FalsingManager falsingManager, MetricsLogger metricsLogger, StatusBarStateController statusBarStateController, ActivityStarter activityStarter, QSLogger qsLogger ) { super(host, backgroundLooper, mainHandler, falsingManager, metricsLogger, statusBarStateController, activityStarter, qsLogger); } @Override public BooleanState newTileState(){ return new BooleanState(); } @Override protected void handleClick(@Nullable View view){ Log.d("cxr", "MyTile handleClick set new state : "); //setEnable(true); } // private void setEnable(boolean b){ // if(b){ // PowerManager pw = mContext.getSystemService(Context.POWER_SERVICE); // pw.goToSleep(SystemClock.uptimeMillis()); // } // } @Override public void handleUpdateState(BooleanState state, Object arg){ state.icon = ResourceIcon.get(R.drawable.ic_qs_custom); state.label = mContext.getString(R.string.custom_tile); } @Override public int getMetricsCategory(){ return 0; } @Override public Intent getLongClickIntent(){ return null; } @Override public CharSequence getTileLabel(){ return null; } }
-
在
drawble
包中加入一个图标,命名为ic_qs_custom
-
在
values/strings.xml
中 添加一条语句,命名为custom_tile
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"> <!-- Customsize a Tile is Lable --> <string name="custom_tile">下一步</string> </resources>
-
在
overlay
中进行添加一个选项 , 为custom
路径为
:/V501_TEST/android/vendor/tinno/product/v500/cat/overlay/vendor/mediatek/proprietary/packages/apps/SystemUI/res/values/config.xml
<!-- The default tiles to display in QuickSettings --> <string name="quick_settings_tiles_default" translatable="false"> wifi,bt,dnd,flashlight,rotation,headset,battery,custom(com.google.android.gms/.nearby.sharing.SharingTileService), cell,airplane,cast,brightness,screenrecord,custom </string> <!-- Tiles native to System UI. Order should match "quick_settings_tiles_default" --> <string name="quick_settings_tiles_stock" translatable="false"> lashlight,rotation,wifi,cell,battery,dnd,bt,airplane,location,hotspot,inversion,saver,dark,work,cast,night,brightness, fheadset,screenrecord,custom </string>
-
在
QSFactoryImpl
类中调用xml中的选项,路径如下:
/V501_TEST/android/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/qs/tileimpl/
-
在 构造函数中 添加自定义的Tile
@Inject public QSFactoryImpl( ... ... /* 新增自定义Tile */ private final Provider<WXCustomTile> mWXCustomTileProvider;) { ... ... /* 新增自定义Tile */ mWXCustomTileProvider = wxCustomTileProvider; }
-
并在
createTileInternal()
方法中,调用该方法private QSTileImpl createTileInternal(String tileSpec) { ... ... // Stock tiles. switch (tileSpec) { .... .... /* 新增一个Tile */ case "custom": return mWXCustomTileProvider.get(); } ... }
-
完整代码如下:
/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use mHost file * except in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the specific language governing * permissions and limitations under the License. */ package com.android.systemui.qs.tileimpl; import android.content.Context; import android.os.Build; import android.os.SystemProperties; import android.util.Log; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.plugins.qs.QSFactory; import com.android.systemui.plugins.qs.QSIconView; import com.android.systemui.plugins.qs.QSTile; import com.android.systemui.plugins.qs.QSTileView; import com.android.systemui.qs.QSHost; import com.android.systemui.qs.external.CustomTile; import com.android.systemui.qs.tiles.AdaptiveBrightnessTile; import com.android.systemui.qs.tiles.AirplaneModeTile; import com.android.systemui.qs.tiles.AlarmTile; import com.android.systemui.qs.tiles.BatterySaverTile; import com.android.systemui.qs.tiles.BluetoothTile; import com.android.systemui.qs.tiles.CameraToggleTile; import com.android.systemui.qs.tiles.CastTile; import com.android.systemui.qs.tiles.CellularTile; import com.android.systemui.qs.tiles.ColorInversionTile; import com.android.systemui.qs.tiles.DataSaverTile; import com.android.systemui.qs.tiles.DeviceControlsTile; import com.android.systemui.qs.tiles.DndTile; import com.android.systemui.qs.tiles.FlashlightTile; import com.android.systemui.qs.tiles.HeadsetTile; import com.android.systemui.qs.tiles.HotspotTile; import com.android.systemui.qs.tiles.InternetTile; import com.android.systemui.qs.tiles.LocationTile; import com.android.systemui.qs.tiles.MicrophoneToggleTile; import com.android.systemui.qs.tiles.NfcTile; import com.android.systemui.qs.tiles.NightDisplayTile; import com.android.systemui.qs.tiles.QuickAccessWalletTile; import com.android.systemui.qs.tiles.ReduceBrightColorsTile; import com.android.systemui.qs.tiles.RotationLockTile; import com.android.systemui.qs.tiles.ScreenRecordTile; import com.android.systemui.qs.tiles.UiModeNightTile; import com.android.systemui.qs.tiles.UserTile; import com.android.systemui.qs.tiles.WXCustomTile; import com.android.systemui.qs.tiles.WifiTile; import com.android.systemui.qs.tiles.WorkModeTile; import com.android.systemui.util.leak.GarbageMonitor; import com.cat.feature.CatGeneralFeature; /// M: add plugin in quicksetting @{ import com.mediatek.systemui.ext.IQuickSettingsPlugin; /// add plugin in quicksetting @} /// M: Add extra tiles in quicksetting @{ import com.mediatek.systemui.ext.OpSystemUICustomizationFactoryBase; import com.mediatek.systemui.statusbar.util.SIMHelper; ///@} import javax.inject.Inject; import javax.inject.Provider; import dagger.Lazy; @SysUISingleton public class QSFactoryImpl implements QSFactory { private static final String TAG = "QSFactory"; private final Provider<WifiTile> mWifiTileProvider; private final Provider<InternetTile> mInternetTileProvider; private final Provider<BluetoothTile> mBluetoothTileProvider; private final Provider<CellularTile> mCellularTileProvider; private final Provider<DndTile> mDndTileProvider; private final Provider<ColorInversionTile> mColorInversionTileProvider; private final Provider<AirplaneModeTile> mAirplaneModeTileProvider; private final Provider<WorkModeTile> mWorkModeTileProvider; private final Provider<RotationLockTile> mRotationLockTileProvider; private final Provider<FlashlightTile> mFlashlightTileProvider; private final Provider<LocationTile> mLocationTileProvider; private final Provider<CastTile> mCastTileProvider; private final Provider<HotspotTile> mHotspotTileProvider; private final Provider<UserTile> mUserTileProvider; private final Provider<BatterySaverTile> mBatterySaverTileProvider; private final Provider<DataSaverTile> mDataSaverTileProvider; private final Provider<NightDisplayTile> mNightDisplayTileProvider; private final Provider<NfcTile> mNfcTileProvider; private final Provider<GarbageMonitor.MemoryTile> mMemoryTileProvider; private final Provider<UiModeNightTile> mUiModeNightTileProvider; private final Provider<ScreenRecordTile> mScreenRecordTileProvider; private final Provider<ReduceBrightColorsTile> mReduceBrightColorsTileProvider; private final Provider<CameraToggleTile> mCameraToggleTileProvider; private final Provider<MicrophoneToggleTile> mMicrophoneToggleTileProvider; private final Provider<DeviceControlsTile> mDeviceControlsTileProvider; private final Provider<AlarmTile> mAlarmTileProvider; private final Provider<QuickAccessWalletTile> mQuickAccessWalletTileProvider; private final Provider<AdaptiveBrightnessTile> mAdaptiveBrightnessTileProvider; private final Provider<HeadsetTile> mHeadsetTileProvider;// add by xiao.liang for VFABAE-1017 at 2022.5.13 private final Lazy<QSHost> mQsHostLazy; private final Provider<CustomTile.Builder> mCustomTileBuilderProvider; /* 新增自定义Tile */ private final Provider<WXCustomTile> mWXCustomTileProvider; @Inject public QSFactoryImpl( Lazy<QSHost> qsHostLazy, Provider<CustomTile.Builder> customTileBuilderProvider, Provider<WifiTile> wifiTileProvider, Provider<InternetTile> internetTileProvider, Provider<BluetoothTile> bluetoothTileProvider, Provider<CellularTile> cellularTileProvider, Provider<DndTile> dndTileProvider, Provider<ColorInversionTile> colorInversionTileProvider, Provider<AirplaneModeTile> airplaneModeTileProvider, Provider<WorkModeTile> workModeTileProvider, Provider<RotationLockTile> rotationLockTileProvider, Provider<FlashlightTile> flashlightTileProvider, Provider<LocationTile> locationTileProvider, Provider<CastTile> castTileProvider, Provider<HotspotTile> hotspotTileProvider, Provider<UserTile> userTileProvider, Provider<BatterySaverTile> batterySaverTileProvider, Provider<DataSaverTile> dataSaverTileProvider, Provider<NightDisplayTile> nightDisplayTileProvider, Provider<NfcTile> nfcTileProvider, Provider<GarbageMonitor.MemoryTile> memoryTileProvider, Provider<UiModeNightTile> uiModeNightTileProvider, Provider<ScreenRecordTile> screenRecordTileProvider, Provider<ReduceBrightColorsTile> reduceBrightColorsTileProvider, Provider<CameraToggleTile> cameraToggleTileProvider, Provider<MicrophoneToggleTile> microphoneToggleTileProvider, Provider<DeviceControlsTile> deviceControlsTileProvider, Provider<AlarmTile> alarmTileProvider, Provider<QuickAccessWalletTile> quickAccessWalletTileProvider, Provider<AdaptiveBrightnessTile> adaptiveBrightnessTileProvider, /* 新增自定义Tile */ Provider<WXCustomTile> wxCustomTileProvider, Provider<HeadsetTile> headsetTileProvider/*add by xiao.liang for VFABAE-1017 at 2022.5.13*/) { mQsHostLazy = qsHostLazy; mCustomTileBuilderProvider = customTileBuilderProvider; mWifiTileProvider = wifiTileProvider; mInternetTileProvider = internetTileProvider; mBluetoothTileProvider = bluetoothTileProvider; mCellularTileProvider = cellularTileProvider; mDndTileProvider = dndTileProvider; mColorInversionTileProvider = colorInversionTileProvider; mAirplaneModeTileProvider = airplaneModeTileProvider; mWorkModeTileProvider = workModeTileProvider; mRotationLockTileProvider = rotationLockTileProvider; mFlashlightTileProvider = flashlightTileProvider; mLocationTileProvider = locationTileProvider; mCastTileProvider = castTileProvider; mHotspotTileProvider = hotspotTileProvider; mUserTileProvider = userTileProvider; mBatterySaverTileProvider = batterySaverTileProvider; mDataSaverTileProvider = dataSaverTileProvider; mNightDisplayTileProvider = nightDisplayTileProvider; mNfcTileProvider = nfcTileProvider; mMemoryTileProvider = memoryTileProvider; mUiModeNightTileProvider = uiModeNightTileProvider; mScreenRecordTileProvider = screenRecordTileProvider; mReduceBrightColorsTileProvider = reduceBrightColorsTileProvider; mCameraToggleTileProvider = cameraToggleTileProvider; mMicrophoneToggleTileProvider = microphoneToggleTileProvider; mDeviceControlsTileProvider = deviceControlsTileProvider; mAlarmTileProvider = alarmTileProvider; mQuickAccessWalletTileProvider = quickAccessWalletTileProvider; mAdaptiveBrightnessTileProvider = adaptiveBrightnessTileProvider; /* 新增自定义Tile */ mWXCustomTileProvider = wxCustomTileProvider; mHeadsetTileProvider = headsetTileProvider;// add by xiao.liang for VFABAE-1017 at 2022.5.13 } public QSTile createTile(String tileSpec) { QSTileImpl tile = createTileInternal(tileSpec); if (tile != null) { tile.initialize(); tile.postStale(); // Tile was just created, must be stale. } return tile; } private QSTileImpl createTileInternal(String tileSpec) { /// M: Add extra tiles in quicksetting @{ Context context = mQsHostLazy.get().getContext(); IQuickSettingsPlugin quickSettingsPlugin = OpSystemUICustomizationFactoryBase .getOpFactory(context).makeQuickSettings(context); /// @} // M: [ALPS06389351] For monkeyTest of camera, don't show cameratoggle // by commend if (SystemProperties.getBoolean("persist.disable_cameratoggle", false) && "cameratoggle".equals(tileSpec)) { return null; } // Stock tiles. switch (tileSpec) { case "wifi": return mWifiTileProvider.get(); case "internet": return mInternetTileProvider.get(); case "bt": return mBluetoothTileProvider.get(); case "cell": return mCellularTileProvider.get(); case "dnd": return mDndTileProvider.get(); case "inversion": return mColorInversionTileProvider.get(); case "airplane": return mAirplaneModeTileProvider.get(); case "work": return mWorkModeTileProvider.get(); case "rotation": return mRotationLockTileProvider.get(); case "flashlight": return mFlashlightTileProvider.get(); case "location": return mLocationTileProvider.get(); case "cast": return mCastTileProvider.get(); case "hotspot": return mHotspotTileProvider.get(); case "user": return mUserTileProvider.get(); case "battery": return mBatterySaverTileProvider.get(); case "saver": return mDataSaverTileProvider.get(); case "night": return mNightDisplayTileProvider.get(); case "nfc": return mNfcTileProvider.get(); case "dark": return mUiModeNightTileProvider.get(); case "screenrecord": return mScreenRecordTileProvider.get(); case "reduce_brightness": return mReduceBrightColorsTileProvider.get(); case "cameratoggle": return mCameraToggleTileProvider.get(); case "mictoggle": return mMicrophoneToggleTileProvider.get(); case "controls": return mDeviceControlsTileProvider.get(); case "alarm": return mAlarmTileProvider.get(); case "wallet": return mQuickAccessWalletTileProvider.get(); // feng.zhang add by VFABAE-658 start date20220506 case "brightness": return mAdaptiveBrightnessTileProvider.get(); // feng.zhang add by VFABAE-658 end /* 新增一个Tile */ case "custom": return mWXCustomTileProvider.get(); /* 新增一个Tile */ case "test": return mFlashlightTileProvider.get(); } // add by xiao.liang for VFABAE-1017 at 2022.5.13 begin if (CatGeneralFeature.CAT_GENERAL_FEATURE_WATER_DETECT && "headset".equals(tileSpec)) { return mHeadsetTileProvider.get(); } // add by xiao.liang for VFABAE-1017 at 2022.5.13 end // Custom tiles if (tileSpec.startsWith(CustomTile.PREFIX)) { return CustomTile.create( mCustomTileBuilderProvider.get(), tileSpec, mQsHostLazy.get().getUserContext()); } // Debug tiles. if (Build.IS_DEBUGGABLE) { if (tileSpec.equals(GarbageMonitor.MemoryTile.TILE_SPEC)) { return mMemoryTileProvider.get(); } } // Broken tiles. Log.w(TAG, "No stock tile spec: " + tileSpec); return null; } @Override public QSTileView createTileView(Context context, QSTile tile, boolean collapsedView) { QSIconView icon = tile.createTileView(context); return new QSTileViewImpl(context, icon, collapsedView); } }
-
-
在apk刷入之前,需要先将系统原本的xml文件删除,在进行刷入,否则会出现效果无法显示
adb shell settings delete secure sysui_qs_tiles
-