下拉状态栏中增加一个控制wifi热点的开关,单击打开或者关闭,长按进入设置中的wifi热点设置界面
注:wifi热点同wifi不能同时打开;飞行模式时,wifi及wifi热点都需关闭
一、增加id
frameworks/base/packages/SystemUI/ext/src/com/mediatek/systemui/ext/QuickSettingsTileViewId.java
public enum QuickSettingsTileViewId {
...
ID_ApWifi,
}
二、控制显示位置
frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickSettings.java
private void addSystemTiles(ViewGroup parent, LayoutInflater inflater) {
...
mengAddApWifiTile(parent, inflater);
}
具体实现
private void mengAddApWifiTile(ViewGroup parent, LayoutInflater inflater) {
/// M: Wifi Tile
final QuickSettingsBasicTile wifiApTile =
new QuickSettingsBasicTile(mContext, null, R.layout.mtk_quick_settings_tile_basic);
wifiApTile.setTileViewId(QuickSettingsTileViewId.ID_ApWifi);
wifiApTile.setOnLongClickListener(new OnLongClickListener() {
public boolean onLongClick(View v) {
Intent intent = new Intent();
intent.setComponent(new ComponentName(
"com.android.settings",
"com.android.settings.Settings$TetherSettingsActivity"));
startSettingsActivity(intent);
return true;
}
});
parent.addView(wifiApTile);
if (!FeatureOption.MTK_WLAN_SUPPORT) {
wifiApTile.setVisibility(View.GONE);
}
mQuickSettingsConnectionModel.mengAddApWifiTile(wifiApTile);
}
三、frameworks/base/packages/SystemUI/src/com/mediatek/systemui/statusbar/toolbar/QuickSettingsConnectionModel.java
1、添加代码:
private View mApWifiTileView;
private FrameLayout mApWifiLayout;
private ImageView mApWifiIcon;
private ImageView mApWifiSwitchIngGifView;
private ApWifiStateTracker mApWifiStateTracker;
public void mengAddApWifiTile(View tileView) {
mApWifiTileView = tileView;
mApWifiLayout = (FrameLayout) tileView.findViewById(R.id.layout);
mApWifiIcon = (ImageView) tileView.findViewById(R.id.image);
}
private final class ApWifiStateTracker extends StateTracker {
private boolean mIsAirlineMode = false;
public void setAirlineMode(boolean enable) {
if (DBG) {
Xlog.d(TAG, "Mobile setAirlineMode called, enabled is: " + enable);
}
mIsAirlineMode = enable;
}
public boolean isClickable() {
Xlog.d(TAG, "wifi mIsAirlineMode is " + mIsAirlineMode + ", mIsUserSwitching is " + mIsUserSwitching);
return !mIsAirlineMode && super.isClickable();
}
@Override
public int getActualState(Context context) {
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
if (wifiManager != null) {
return wifiStateToFiveState(wifiManager.getWifiApState());
}
return STATE_DISABLED;
}
@Override
protected void requestStateChange(Context context, final boolean desiredState) {
final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
if (wifiManager == null) {
Xlog.d(TAG, "No wifiManager.");
setCurrentState(context, STATE_DISABLED);
return;
}
/// M: Actually request the wifi change and persistent settings write off the UI thread, as it can take a
/// user-noticeable amount of time, especially if there's disk contention.
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... args) {
wifiManager.setWifiApEnabled(null, desiredState);
return null;
}
}.execute();
}
@Override
public void onActualStateChange(Context context, Intent intent) {
if (!WifiManager.WIFI_AP_STATE_CHANGED_ACTION.equals(intent.getAction())) {
return;
}
int wifiState = intent.getIntExtra(WifiManager.EXTRA_WIFI_AP_STATE, -1);
setCurrentState(context, wifiStateToFiveState(wifiState));
}
@Override
public int getDisabledResource() {
return R.drawable.ic_qs_hotspot_off; //need change id ys
}
@Override
public int getEnabledResource() {
return R.drawable.ic_qs_hotspot_enable; //need change id ys
}
@Override
public int getInterMedateResource() {
return R.drawable.ic_qs_stat_sys_hotspot_switch_anim; //need change id ys
}
@Override
public ImageView getImageButtonView() {
return mApWifiIcon;
}
public View getTileView() {
return mApWifiTileView;
}
@Override
public ImageView getSwitchingGifView() {
if (mApWifiSwitchIngGifView == null) {
mApWifiSwitchIngGifView =
(ImageView) mApWifiLayout.findViewById(R.id.imageSwitch);
mApWifiSwitchIngGifView.setVisibility(View.GONE);
}
return mApWifiSwitchIngGifView;
}
/**
* M: Converts WifiManager's state values into our Wifi/Bluetooth-common state values.
*/
private int wifiStateToFiveState(int wifiState) {
switch (wifiState) {
case WifiManager.WIFI_AP_STATE_DISABLED:
return STATE_DISABLED;
case WifiManager.WIFI_AP_STATE_ENABLED:
return STATE_ENABLED;
case WifiManager.WIFI_AP_STATE_DISABLING:
return STATE_TURNING_OFF;
case WifiManager.WIFI_AP_STATE_ENABLING:
return STATE_TURNING_ON;
default:
return STATE_DISABLED;
}
}
@Override
public ImageView getIndicatorView() {
return null;
}
}
2、在buildIconViews方法中
if (FeatureOption.MTK_WLAN_SUPPORT) {
mWifiStateTracker = new WifiStateTracker();
//add for ap wifi begin
mApWifiStateTracker = new ApWifiStateTracker();
//add for ap wifi end
}
点击事件
if (FeatureOption.MTK_WLAN_SUPPORT) {
mWifiTileView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
WifiManager mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
if (mWifiManager != null) {
int wifiApState = mWifiManager.getWifiApState();
if ((wifiApState == WifiManager.WIFI_AP_STATE_ENABLING)
|| (wifiApState == WifiManager.WIFI_AP_STATE_ENABLED)) {
mWifiManager.setWifiApEnabled(null, false);
}
}
mWifiStateTracker.toggleState(mContext);
}
});
//add for ap wifi begin
mApWifiTileView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
WifiManager mWifiManager = (WifiManager) mContext.getSystemService(Context.WIFI_SERVICE);
if (mWifiManager != null) {
int wifiState = mWifiManager.getWifiState();
if ((wifiState == WifiManager.WIFI_STATE_ENABLING) ||
(wifiState == WifiManager.WIFI_STATE_ENABLED)) {
mWifiManager.setWifiEnabled(false);
//Settings.Global.putInt(cr, Settings.Global.WIFI_SAVED_STATE, 1);
}
}
mApWifiStateTracker.toggleState(mContext);
}
});
//add for ap wifi end
3、监听控制:
private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
...
if (action.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
mWifiStateTracker.onActualStateChange(context, intent);
mWifiStateTracker.setImageViewResources(context);
} else if (action.equals(WifiManager.WIFI_AP_STATE_CHANGED_ACTION)) {
mApWifiStateTracker.onActualStateChange(context, intent);
mApWifiStateTracker.setImageViewResources(context);
}
}
4、飞行模式时,wifi及wifi热点都需关闭
if (PluginFactory.getStatusBarPlugin(mContext).supportDisableWifiAtAirplaneMode()) {
mWifiStateTracker.setAirlineMode(enabled);
mWifiTileView.setEnabled(mWifiStateTracker.isClickable());
//add for ap wifi begin
mApWifiStateTracker.setAirlineMode(enabled);
mApWifiTileView.setEnabled(mApWifiStateTracker.isClickable());
//add r ap wifi end
}
5、在setUpdates中控制
if (FeatureOption.MTK_WLAN_SUPPORT) {
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
//add for ap wifi begin
filter.addAction(WifiManager.WIFI_AP_STATE_CHANGED_ACTION);
//add for ap wifi end
}
6、找到toggleState方法
if (PluginFactory.getStatusBarPlugin(mContext).supportDisableWifiAtAirplaneMode()) {
mWifiStateTracker.setAirlineMode(!airlineMode);
mWifiTileView.setEnabled(mWifiStateTracker.isClickable());
//add mgb for ap wifi begin
mApWifiStateTracker.setAirlineMode(!airlineMode);
mApWifiTileView.setEnabled(mApWifiStateTracker.isClickable());
//add mgb for ap wifi end
}
7、initConfigurationState方法中
//add for ap wifi begin
if (PluginFactory.getStatusBarPlugin(mContext).supportDisableWifiAtAirplaneMode()) {
mApWifiStateTracker.setAirlineMode(isAirlineModeOn);
mApWifiTileView.setEnabled(mApWifiStateTracker.isClickable());
}
mApWifiStateTracker.setImageViewResources(mContext);
//add for ap wifi end
8、updateResources方法中
if (FeatureOption.MTK_WLAN_SUPPORT) {
TextView wifiText = (TextView) mWifiTileView.findViewById(R.id.text);
wifiText.setText(R.string.quick_settings_wifi_label);
//add mgb for ap wifi begin
TextView apWifiText = (TextView) mApWifiTileView.findViewById(R.id.text);
apWifiText.setText(R.string.quick_settings_hotspot_label); // need change id ys
//add mgb for ap wifi end
}
三、切换开关时的动画xml文件
<animation-list
xmlns:android="http://schemas.android.com/apk/res/android"
android:oneshot="false">
<item android:drawable="@drawable/ic_qs_stat_sys_hotspot_switch_anim1" android:duration="150" />
<item android:drawable="@drawable/ic_qs_stat_sys_hotspot_switch_anim2" android:duration="150" />
<item android:drawable="@drawable/ic_qs_stat_sys_hotspot_switch_anim3" android:duration="150" />
<item android:drawable="@drawable/ic_qs_stat_sys_hotspot_switch_anim4" android:duration="150" />
</animation-list>
图片和字符资源需自己添加