下拉菜单新增qsTile 开关

发布时间 2023-06-12 17:53:54作者: 安妍

#### 下拉菜单新增qsTile 开关

> 方法:参考其它qsTile

> 需求:添加一个开关控制用户的app对讲模块上下电,场景:1. 系统下拉菜单开关点击时发送广播给用户app,以控制app的上下电,2.接收客户app上下电的操作,更新下拉下拉菜单的状态

新增文档:DmrTile.java (qsTile的公共部分都包含在内)

package com.android.systemui.qs.tiles;

import android.app.ActivityManager;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.BroadcastReceiver;
import android.provider.MediaStore;
import android.service.quicksettings.Tile;
import android.widget.Switch;
import android.util.Log;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
import com.android.systemui.R;
import com.android.systemui.plugins.qs.QSTile.BooleanState;
import com.android.systemui.qs.QSHost;
import com.android.systemui.qs.tileimpl.QSTileImpl;
import com.android.systemui.volume.SystemUIInterpolators;
import android.os.UserHandle;
import javax.inject.Inject;
import android.content.Context;
/** Quick settings tile: on-off dmr **/
public class DmrTile extends QSTileImpl<BooleanState> {
   private static final String ACTION_DMR_ON = "android.intent.action.ext.dmr.on";
   private static final String ACTION_DMR_OFF = "android.intent.action.ext.dmr.off";
   private void sendBroadcast(Context context ,String action){
       Intent intent = new Intent(action);
       context.sendBroadcast(intent);
      /* intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
       intent.addFlags(Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND);
       context.sendBroadcastAsUser(intent, UserHandle.CURRENT);*/
  }
   private final Icon mIcon = ResourceIcon.get(R.drawable.ic_qs_dmr);
   @Inject
   public DmrTile(QSHost host) {
       super(host);
       Log.d("oy","DmrTiel newed .........");
       IntentFilter intentFilter = new IntentFilter();
       intentFilter.addAction("com.anke.radio.dmr.poweron");
       intentFilter.addAction("com.anke.radio.dmr.poweroff");
       mContext.registerReceiver(dmrStatusReceiver, intentFilter);
  }
    @Override
   protected void handleDestroy() {
       super.handleDestroy();
       Log.d("oy","handleDestroy");
       mContext.unregisterReceiver(dmrStatusReceiver);
  }
     @Override
   public BooleanState newTileState() {
       Log.d("oy","newTileState");
       BooleanState state = new BooleanState();
       state.handlesLongClick = false;
       return state;
  }

   @Override
   protected void handleUserSwitch(int newUserId) {
  }

   @Override
   public Intent getLongClickIntent() {
       return null;
  }
    @Override
   protected void handleClick() {
       if (ActivityManager.isUserAMonkey()) {
           return;
      }
       Log.d("oy","switch click");
       boolean newState = !mState.value;
       Log.d("oy", "newState====" + newState);
       refreshState(newState);
       if(newState) {
           sendBroadcast(mContext, ACTION_DMR_ON);
      } else {
           sendBroadcast(mContext, ACTION_DMR_OFF);
      }
  }

   @Override
   public CharSequence getTileLabel() {
       Log.d("oy","getTileLabel");
       return mContext.getString(R.string.quick_settings_dmr_label);
  }
    @Override
   protected void handleLongClick() {
       Log.d("oy","handleLongClick");
       handleClick();
  }

   private final  BroadcastReceiver dmrStatusReceiver = new BroadcastReceiver() {
       private static final String ACTION_DMR_POWER_ON = "com.anke.radio.dmr.poweron";
       private static final String ACTION_DMR_POWER_OFF = "com.anke.radio.dmr.poweroff";
       @Override
       public void onReceive(Context context, Intent intent) {
           Log.d("oy", "intent.action===" + intent.getAction());
           Log.d("oy", "mState.value" + mState.value);
           if (intent.getAction().equals(ACTION_DMR_POWER_ON)){
               refreshState(true);
          }else if (intent.getAction().equals(ACTION_DMR_POWER_OFF)){
               refreshState(false);
          }
      }
  };
    @Override
   protected void handleUpdateState(BooleanState state, Object arg) {
       Log.d("oy", "handleUpdateState----arg=="+arg);
       if (state.slash == null) {
           state.slash = new SlashState();
      }
       state.label = mHost.getContext().getString(R.string.quick_settings_dmr_label);
       state.secondaryLabel = "";
       state.stateDescription = "";
       if (arg instanceof Boolean) {
           boolean value = (Boolean) arg;
           /*if (value == state.value) {
               Log.d("oy","return.........");
               return;
           }*/
           state.value = value;
      }
        state.icon = mIcon;
       state.slash.isSlashed = !state.value;
       state.contentDescription = mContext.getString(R.string.quick_settings_dmr_label);
       state.expandedAccessibilityClassName = Switch.class.getName();
       Log.d("oy", "state.value===" + state.value);
       state.state = state.value ? Tile.STATE_ACTIVE : Tile.STATE_INACTIVE;
  }
    @java.lang.Override
   public int getMetricsCategory() {
       return 0;
  }
   
   @Override
   protected String composeChangeAnnouncement() {
       Log.d("oy","composeChangeAnnouncement");
       if (mState.value) {
           return mContext.getString(R.string.accessibility_quick_settings_dmr_changed_on);
      } else {
           return mContext.getString(R.string.accessibility_quick_settings_dmr_changed_off);
      }
  }

}

修改文档: