220 lines
7.8 KiB
Java
220 lines
7.8 KiB
Java
/*
|
|
* Copyright (C) 2013 The CyanogenMod 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.
|
|
*/
|
|
|
|
package com.cyanogenmod.setupwizard.setup;
|
|
|
|
import android.app.Activity;
|
|
import android.app.Fragment;
|
|
import android.app.FragmentManager;
|
|
import android.content.Context;
|
|
import android.os.Bundle;
|
|
import android.telephony.PhoneStateListener;
|
|
import android.telephony.ServiceState;
|
|
import android.telephony.SignalStrength;
|
|
import android.telephony.SubscriptionManager;
|
|
import android.telephony.TelephonyManager;
|
|
import android.text.TextUtils;
|
|
import android.view.View;
|
|
import android.widget.ImageView;
|
|
import android.widget.Switch;
|
|
import android.widget.TextView;
|
|
|
|
import com.cyanogenmod.setupwizard.R;
|
|
import com.cyanogenmod.setupwizard.ui.SetupPageFragment;
|
|
import com.cyanogenmod.setupwizard.util.SetupWizardUtils;
|
|
|
|
public class MobileDataPage extends SetupPage {
|
|
|
|
public static final String TAG = "MobileDataPage";
|
|
|
|
public MobileDataPage(Context context, SetupDataCallbacks callbacks) {
|
|
super(context, callbacks);
|
|
}
|
|
|
|
@Override
|
|
public Fragment getFragment(FragmentManager fragmentManager, int action) {
|
|
Fragment fragment = fragmentManager.findFragmentByTag(getKey());
|
|
if (fragment == null) {
|
|
Bundle args = new Bundle();
|
|
args.putString(Page.KEY_PAGE_ARGUMENT, getKey());
|
|
args.putInt(Page.KEY_PAGE_ACTION, action);
|
|
fragment = new MobileDataFragment();
|
|
fragment.setArguments(args);
|
|
}
|
|
return fragment;
|
|
}
|
|
|
|
@Override
|
|
public String getKey() {
|
|
return TAG;
|
|
}
|
|
|
|
@Override
|
|
public int getTitleResId() {
|
|
return R.string.setup_mobile_data;
|
|
}
|
|
|
|
public static class MobileDataFragment extends SetupPageFragment {
|
|
|
|
private View mEnableDataRow;
|
|
private Switch mEnableMobileData;
|
|
private ImageView mSignalView;
|
|
private TextView mNameView;
|
|
|
|
private TelephonyManager mPhone;
|
|
private SignalStrength mSignalStrength;
|
|
private ServiceState mServiceState;
|
|
|
|
private PhoneStateListener mPhoneStateListener =
|
|
new PhoneStateListener(SubscriptionManager.getDefaultDataSubId()) {
|
|
|
|
@Override
|
|
public void onSignalStrengthsChanged(SignalStrength signalStrength) {
|
|
if (isDetached()) return;
|
|
mSignalStrength = signalStrength;
|
|
updateSignalStrength();
|
|
}
|
|
|
|
@Override
|
|
public void onServiceStateChanged(ServiceState state) {
|
|
if (isDetached()) return;
|
|
mServiceState = state;
|
|
updateSignalStrength();
|
|
}
|
|
|
|
};
|
|
|
|
private View.OnClickListener mEnableDataClickListener = new View.OnClickListener() {
|
|
@Override
|
|
public void onClick(View view) {
|
|
boolean checked = !mEnableMobileData.isChecked();
|
|
SetupWizardUtils.setMobileDataEnabled(getActivity(), checked);
|
|
mEnableMobileData.setChecked(checked);
|
|
}
|
|
};
|
|
|
|
@Override
|
|
protected void initializePage() {
|
|
mEnableDataRow = mRootView.findViewById(R.id.data);
|
|
mEnableDataRow.setOnClickListener(mEnableDataClickListener);
|
|
mEnableMobileData = (Switch) mRootView.findViewById(R.id.data_switch);
|
|
mSignalView = (ImageView) mRootView.findViewById(R.id.signal);
|
|
mNameView = (TextView) mRootView.findViewById(R.id.enable_data_title);
|
|
updateDataConnectionStatus();
|
|
updateSignalStrength();
|
|
}
|
|
|
|
@Override
|
|
protected int getLayoutResource() {
|
|
return R.layout.mobile_data_settings;
|
|
}
|
|
|
|
@Override
|
|
public void onResume() {
|
|
super.onResume();
|
|
updateDataConnectionStatus();
|
|
updateSignalStrength();
|
|
}
|
|
|
|
@Override
|
|
public void onAttach(Activity activity) {
|
|
super.onAttach(activity);
|
|
mPhone = (TelephonyManager)getActivity().getSystemService(Context.TELEPHONY_SERVICE);
|
|
mPhone.listen(mPhoneStateListener,
|
|
PhoneStateListener.LISTEN_SERVICE_STATE
|
|
| PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
|
|
}
|
|
|
|
@Override
|
|
public void onDetach() {
|
|
mPhone.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
|
|
super.onDetach();
|
|
}
|
|
|
|
private void updateCarrierText() {
|
|
if (isDetached()) return;
|
|
String name = mPhone.getNetworkOperatorName(SubscriptionManager.getDefaultDataSubId());
|
|
if (TextUtils.isEmpty(name)) {
|
|
if (mServiceState != null && mServiceState.isEmergencyOnly()) {
|
|
name = getString(R.string.setup_mobile_data_emergency_only);
|
|
} else {
|
|
name = getString(R.string.setup_mobile_data_no_service);
|
|
}
|
|
}
|
|
mNameView.setText(name);
|
|
}
|
|
|
|
private void updateSignalStrength() {
|
|
if (isDetached()) return;
|
|
if (!hasService()) {
|
|
mSignalView.setImageResource(R.drawable.ic_signal_no_signal);
|
|
} else {
|
|
if (mSignalStrength != null) {
|
|
int resId;
|
|
switch (mSignalStrength.getLevel()) {
|
|
case 4:
|
|
resId = R.drawable.ic_signal_4;
|
|
break;
|
|
case 3:
|
|
resId = R.drawable.ic_signal_3;
|
|
break;
|
|
case 2:
|
|
resId = R.drawable.ic_signal_2;
|
|
break;
|
|
case 1:
|
|
resId = R.drawable.ic_signal_1;
|
|
break;
|
|
default:
|
|
resId = R.drawable.ic_signal_0;
|
|
break;
|
|
}
|
|
mSignalView.setImageResource(resId);
|
|
}
|
|
}
|
|
updateCarrierText();
|
|
}
|
|
|
|
private void updateDataConnectionStatus() {
|
|
mEnableMobileData.setChecked(SetupWizardUtils.isMobileDataEnabled(getActivity()));
|
|
}
|
|
|
|
private boolean hasService() {
|
|
boolean retVal;
|
|
if (mServiceState != null) {
|
|
// Consider the device to be in service if either voice or data service is available.
|
|
// Some SIM cards are marketed as data-only and do not support voice service, and on
|
|
// these SIM cards, we want to show signal bars for data service as well as the "no
|
|
// service" or "emergency calls only" text that indicates that voice is not available.
|
|
switch(mServiceState.getVoiceRegState()) {
|
|
case ServiceState.STATE_POWER_OFF:
|
|
retVal = false;
|
|
break;
|
|
case ServiceState.STATE_OUT_OF_SERVICE:
|
|
case ServiceState.STATE_EMERGENCY_ONLY:
|
|
retVal = mServiceState.getDataRegState() == ServiceState.STATE_IN_SERVICE;
|
|
break;
|
|
default:
|
|
retVal = true;
|
|
}
|
|
} else {
|
|
retVal = false;
|
|
}
|
|
return retVal;
|
|
}
|
|
|
|
}
|
|
}
|