Android需求1 -- 修改Settings的默认显示和添加一二级菜单和在quick setting中添加一个tile

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 快捷设置的排序


资料:

  1. 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>
      
  2. 创建自定义的 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:

  1. 新增一个 tile

    • 进入 V501_TEST/android/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/qs/tileimpl中 的 QSFactoryImpl.java类,在 createTileInternal()方法中 添加一个 case

      private 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;
          }
      
  2. 修改 Tile的顺序

    1. 连接手机 进入 cmd,删除系统默认的xml ,命令为:

      adb shell settings delete secure sysui_qs_tiles
      

      查看系统默认的xml,命令为:

      adb shell settings get secure sysui_qs_tiles
      
    2. 进入 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>
      
  3. 自定义 Tile

    1. 自定义一个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;
          }
      }
      
    2. drawble包中加入一个图标,命名为 ic_qs_custom

    3. 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>
      
    4. 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>
      
    5. 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);
            }
        }
        
        
    6. 在apk刷入之前,需要先将系统原本的xml文件删除,在进行刷入,否则会出现效果无法显示

      adb shell settings delete secure sysui_qs_tiles
      
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值