/* * SPRD */ package com.android.systemui.qs.tiles; import android.os.RemoteException; import java.util.List; import android.os.UserHandle; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.provider.Settings.Global; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import android.telephony.TelephonyManagerSprd; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.Toast; import android.app.ActivityManagerNative; import com.android.systemui.R; import com.android.systemui.qs.GlobalSetting; import com.android.systemui.qs.QSTile; import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.statusbar.policy.NetworkController.MobileDataController; import com.android.systemui.statusbar.policy.NetworkController.MobileDataController.DataUsageInfo; import com.android.systemui.statusbar.policy.NetworkController.NetworkSignalChangedCallback; /** Quick settings tile: DataConnection **/ public class DataConnectionTile extends QSTile<QSTile.BooleanState> { private static final Intent CELLULAR_SETTINGS = new Intent().setComponent(new ComponentName( "com.android.settings", "com.android.settings.Settings$DataUsageSummaryActivity")); private static final Intent DATA_SETTINGS = new Intent().setComponent(new ComponentName( "com.android.settings", "com.android.settings.Settings$SimSettingsActivity")); private final NetworkController mController; private final MobileDataController mDataController; private final CellularDetailAdapter mDetailAdapter; private final GlobalSetting mDataSetting; private final GlobalSetting mRadioSetting; private TelephonyManagerSprd mTelephonyManager; private SubscriptionManager mSubscriptionManager; public DataConnectionTile(Host host) { super(host); mController = host.getNetworkController(); mDataController = mController.getMobileDataController(); mDetailAdapter = new CellularDetailAdapter(); mTelephonyManager = (TelephonyManagerSprd) TelephonyManager.from(mContext); mSubscriptionManager = SubscriptionManager.from(mContext); mDataSetting = new GlobalSetting(mContext, mHandler, Global.MOBILE_DATA) { @Override protected void handleValueChanged(int value) { Log.d(TAG, "mDataSetting handleValueChanged"); mState.value = mTelephonyManager.getDataEnabled(); handleRefreshState(value); mDetailAdapter.setMobileDataEnabled(mState.value); } }; mRadioSetting = new GlobalSetting(mContext, mHandler, Global.RADIO_OPERATION) { @Override protected void handleValueChanged(int value) { Log.d(TAG, "mRadioSetting handleValueChanged"); handleRefreshState(value); } }; } @Override protected BooleanState newTileState() { return new BooleanState(); } @Override public DetailAdapter getDetailAdapter() { return mDetailAdapter; } @Override public void setListening(boolean listening) { mRadioSetting.setListening(listening); mDataSetting.setListening(listening); } @Override protected void handleClick() { Log.d(TAG, "handleClick"); if (mDataController.isMobileDataSupported()) { if (mTelephonyManager.isAirplaneModeOn()) { mHost.collapsePanels(); Toast.makeText(mContext, R.string.toggle_data_error_airplane, Toast.LENGTH_SHORT) .show(); return; } if (isDefaultDataSimAvailable()) { boolean enabled = !mTelephonyManager.getDataEnabled(); toggleDataConnectionToDesired(enabled); } } } @Override protected void handleLongClick() { // optional mHost.startSettingsActivity(DATA_SETTINGS); mHost.collapsePanels(); // } private void startSettingsActivity(Intent intent) { startSettingsActivity(intent, true); } private void startSettingsActivity(Intent intent, boolean onlyProvisioned) { // if (onlyProvisioned && !getService().isDeviceProvisioned()) return; //try { // Dismiss the lock screen when Settings starts. // ActivityManagerNative.getDefault().dismissKeyguardOnNextActivity(); // } catch (RemoteException e) { // } intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); mContext.startActivityAsUser(intent, new UserHandle(UserHandle.USER_CURRENT)); mHost.collapsePanels(); } private void toggleDataConnectionToDesired(boolean enabled) { mState.value = enabled; mDataController.setMobileDataEnabled(enabled); // disable data for other subscriptions if (enabled) { int currentSubId = SubscriptionManager.getDefaultDataSubId(); disableDataForOtherSubscriptions(currentSubId); } } private void disableDataForOtherSubscriptions(int currentSubId) { List<SubscriptionInfo> subInfoList = mSubscriptionManager.getActiveSubscriptionInfoList(); if (subInfoList != null) { for (SubscriptionInfo subInfo : subInfoList) { if (subInfo.getSubscriptionId() != currentSubId) { mTelephonyManager.setDataEnabled(subInfo.getSubscriptionId(), false); } } } } private boolean isDefaultDataSimAvailable() { int defaultDataSubId = SubscriptionManager.getDefaultDataSubId(); int defaultDataPhoneId = SubscriptionManager.getSlotId(defaultDataSubId); boolean isDefaultDataSimReady = SubscriptionManager .getSimStateForSubscriber(defaultDataSubId) == TelephonyManager.SIM_STATE_READY; boolean isDefaultDataStandby = SubscriptionManager.isValidPhoneId(defaultDataPhoneId) && mTelephonyManager.isSimStandby(defaultDataPhoneId); Log.d(TAG, "defaultDataSubId = " + defaultDataSubId + " isDefaultDataSimReady = " + isDefaultDataSimReady + " isDefaultDataStandby = " + isDefaultDataStandby); return !mTelephonyManager.isRadioBusy() && isDefaultDataSimReady && isDefaultDataStandby; } @Override public boolean supportsDualTargets() { return true; } @Override protected void handleSecondaryClick() { Log.d(TAG, "handleSecondaryClick"); if (mDataController.isMobileDataSupported() && isDefaultDataSimAvailable()) { showDetail(true); } else { mHost.startSettingsActivity(CELLULAR_SETTINGS); } } @Override protected void handleUpdateState(BooleanState state, Object arg) { final boolean dataConnected = mTelephonyManager.getDataEnabled(); state.value = dataConnected; state.visible = true; state.label = mContext.getString(R.string.quick_settings_data_connection_label); Log.d(TAG, "dataConnected = " + dataConnected); if (dataConnected && isDefaultDataSimAvailable() && !mTelephonyManager.isAirplaneModeOn()) { state.icon = ResourceIcon.get(R.drawable.ic_qs_mobile_data_on_sprd); state.contentDescription = mContext.getString( R.string.accessibility_quick_settings_data_on); } else { state.icon = ResourceIcon.get(R.drawable.ic_qs_mobile_data_off_sprd); state.contentDescription = mContext.getString( R.string.accessibility_quick_settings_data_off); } } @Override protected String composeChangeAnnouncement() { if (mState.value) { return mContext.getString(R.string.accessibility_quick_settings_data_changed_on); } else { return mContext.getString(R.string.accessibility_quick_settings_data_changed_off); } } private final class CellularDetailAdapter implements DetailAdapter { @Override public int getTitle() { return R.string.quick_settings_cellular_detail_title; } @Override public Boolean getToggleState() { // SPRD: fixbug438382 When the flight mode is opened, the data connection cannot be opened. return mTelephonyManager.isAirplaneModeOn() ? Boolean.FALSE : mDataController.isMobileDataSupported() ? mDataController.isMobileDataEnabled() : null; } @Override public Intent getSettingsIntent() { return CELLULAR_SETTINGS; } @Override public void setToggleState(boolean state) { toggleDataConnectionToDesired(state); } @Override public View createDetailView(Context context, View convertView, ViewGroup parent) { final DataUsageDetailView v = (DataUsageDetailView) (convertView != null ? convertView : LayoutInflater.from(mContext).inflate(R.layout.data_usage, parent, false)); final DataUsageInfo info = mDataController.getDataUsageInfo(); if (info == null) return v; v.bind(info); return v; } public void setMobileDataEnabled(boolean enabled) { fireToggleStateChanged(enabled); } } }