1.在systemUi中添加资源文件
2.PhoneStatusBarPolicy 中注册图标状态改变广播
下面以蓝牙为例讲述一下添加流程
public PhoneStatusBarPolicy(Context context, CastController cast, HotspotController hotspot) {
mContext = context;
mCast = cast;
mHotspot = hotspot;
mService = (StatusBarManager)context.getSystemService(Context.STATUS_BAR_SERVICE);
// listen for broadcasts
IntentFilter filter = new IntentFilter();
//filter.addAction(AlarmManager.ACTION_NEXT_ALARM_CLOCK_CHANGED);
filter.addAction(Intent.ACTION_SYNC_STATE_CHANGED);
filter.addAction(AudioManager.RINGER_MODE_CHANGED_ACTION);
filter.addAction(AudioManager.INTERNAL_RINGER_MODE_CHANGED_ACTION);
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
filter.addAction(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED);//注册广播监听
filter.addAction(TelephonyIntents.ACTION_SIM_STATE_CHANGED);
filter.addAction(TelecomManager.ACTION_CURRENT_TTY_MODE_CHANGED);
filter.addAction(Intent.ACTION_USER_SWITCHED);
/// M: [SystemUI] Support "Headset icon". @{
filter.addAction(Intent.ACTION_HEADSET_PLUG);
/// @}
mContext.registerReceiver(mIntentReceiver, filter, null, mHandler);
/// M: [Multi-User] register Alarm intent by user
registerAlarmClockChanged(UserHandle.USER_OWNER, false);
// TTY status
mService.setIcon(SLOT_TTY, R.drawable.stat_sys_tty_mode, 0, null);
mService.setIconVisibility(SLOT_TTY, false);
/// M: [ALPS01870707] Get the TTY status when power on @{
int settingsTtyMode = Settings.Secure.getInt(context.getContentResolver(),
Settings.Secure.TTY_MODE_ENABLED,
TelecomManager.TTY_MODE_OFF);
updateTTY(settingsTtyMode);
/// M: [ALPS01870707] Get the TTY status when power on @}
// Cdma Roaming Indicator, ERI
mService.setIcon(SLOT_CDMA_ERI, R.drawable.stat_sys_roaming_cdma_0, 0, null);
mService.setIconVisibility(SLOT_CDMA_ERI, false);
// bluetooth status
updateBluetooth();//改变图标状态
// Alarm clock
mService.setIcon(SLOT_ALARM_CLOCK, R.drawable.stat_sys_alarm, 0, null);
mService.setIconVisibility(SLOT_ALARM_CLOCK, false);
// Sync state
mService.setIcon(SLOT_SYNC_ACTIVE, R.drawable.stat_sys_sync, 0, null);
mService.setIconVisibility(SLOT_SYNC_ACTIVE, false);
// "sync_failing" is obsolete: b/1297963
// zen
mService.setIcon(SLOT_ZEN, R.drawable.stat_sys_zen_important, 0, null);
mService.setIconVisibility(SLOT_ZEN, false);
// volume
mService.setIcon(SLOT_VOLUME, R.drawable.stat_sys_ringer_vibrate, 0, null);
mService.setIconVisibility(SLOT_VOLUME, false);
updateVolumeZen();
// cast
// M: Remove CastTile when WFD is not support in quicksetting
if (mCast != null) {
mService.setIcon(SLOT_CAST, R.drawable.stat_sys_cast, 0, null);
mService.setIconVisibility(SLOT_CAST, false);
mCast.addCallback(mCastCallback);
}
// hotspot
mService.setIcon(SLOT_HOTSPOT, R.drawable.stat_sys_hotspot, 0, null);
mService.setIconVisibility(SLOT_HOTSPOT, mHotspot.isHotspotEnabled());
mHotspot.addCallback(mHotspotCallback);
/// M: [SystemUI] Support "Headset icon". @{
mService.setIcon(SLOT_HEADSET, R.drawable.stat_sys_headset_with_mic, 0, null);
mService.setIconVisibility(SLOT_HEADSET, false);
/// @}
}
private final void updateBluetooth() {
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
int iconId = R.drawable.stat_sys_data_bluetooth;
String contentDescription =
mContext.getString(R.string.accessibility_bluetooth_disconnected);
if (adapter != null) {
mBluetoothEnabled = (adapter.getState() == BluetoothAdapter.STATE_ON);
if (adapter.getConnectionState() == BluetoothAdapter.STATE_CONNECTED) {
iconId = R.drawable.stat_sys_data_bluetooth_connected;
contentDescription = mContext.getString(R.string.accessibility_bluetooth_connected);
}
Xlog.v(TAG, "updateBluetooth : state = " + adapter.getState() +
" / Connected = " + adapter.getConnectionState());
} else {
mBluetoothEnabled = false;
}
Xlog.d(TAG, "updateBluetooth : BluetoothEnabled = " + mBluetoothEnabled);
mService.setIcon(SLOT_BLUETOOTH, iconId, 0, contentDescription);//注册图标
mService.setIconVisibility(SLOT_BLUETOOTH, mBluetoothEnabled);//改变图标状态
}
监听蓝牙状态广播
else if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED) ||
action.equals(BluetoothAdapter.ACTION_CONNECTION_STATE_CHANGED)) {
updateBluetooth();
}