Merge remote-tracking branch 'goog/mirror-m-wireless-internal-release'

Change-Id: I6c9de433a224925961b484b400a89edf9059d2bd
This commit is contained in:
Vinit Deshpande
2015-03-16 00:55:25 -07:00
17 changed files with 506 additions and 38 deletions

View File

@@ -100,5 +100,6 @@ public class Settings extends SettingsActivity {
public static class TopLevelSettings extends SettingsActivity { /* empty */ }
public static class ApnSettingsActivity extends SettingsActivity { /* empty */ }
public static class WifiCallingSettingsActivity extends SettingsActivity { /* empty */ }
}

View File

@@ -112,6 +112,7 @@ import com.android.settings.wifi.AdvancedWifiSettings;
import com.android.settings.wifi.SavedAccessPointsWifiSettings;
import com.android.settings.wifi.WifiSettings;
import com.android.settings.wifi.p2p.WifiP2pSettings;
import com.android.settings.WifiCallingSettings;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -302,6 +303,8 @@ public class SettingsActivity extends Activity
AppNotificationSettings.class.getName(),
OtherSoundSettings.class.getName(),
ApnSettings.class.getName()
QuickLaunchSettings.class.getName(),
WifiCallingSettings.class.getName()
};

View File

@@ -0,0 +1,275 @@
/*
* Copyright (C) 2015 The Android Open Source 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.android.settings;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.SwitchPreference;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.widget.Switch;
import com.android.ims.ImsConfig;
import com.android.ims.ImsManager;
import com.android.internal.telephony.imsphone.ImsPhone;
import com.android.settings.widget.SwitchBar;
/**
* "Wi-Fi Calling settings" screen. This preference screen lets you
* enable/disable Wi-Fi Calling, change mode, enable/disable
* handover while on roaming.
*/
public class WifiCallingSettings extends SettingsPreferenceFragment
implements SwitchBar.OnSwitchChangeListener,
Preference.OnPreferenceChangeListener {
private static final String TAG = "WifiCallingSettings";
//String keys for preference lookup
private static final String BUTTON_WFC_MODE = "wifi_calling_mode";
private static final String BUTTON_WFC_ROAM = "wifi_calling_roam";
//UI objects
private SwitchBar mSwitchBar;
private Switch mSwitch;
private ListPreference mButtonWfcMode;
private SwitchPreference mButtonWfcRoam;
private final PhoneStateListener mPhoneStateListener = new PhoneStateListener() {
/*
* Enable/disable controls when in/out of a call and depending on
* TTY mode and TTY support over VoLTE.
* @see android.telephony.PhoneStateListener#onCallStateChanged(int,
* java.lang.String)
*/
@Override
public void onCallStateChanged(int state, String incomingNumber) {
final SettingsActivity activity = (SettingsActivity) getActivity();
boolean isNonTtyOrTtyOnVolteEnabled = ImsManager
.isNonTtyOrTtyOnVolteEnabled(activity);
final SwitchBar switchBar = activity.getSwitchBar();
boolean isWfcEnabled = switchBar.getSwitch().isChecked()
&& isNonTtyOrTtyOnVolteEnabled;
switchBar.setEnabled((state == TelephonyManager.CALL_STATE_IDLE)
&& isNonTtyOrTtyOnVolteEnabled);
Preference pref = getPreferenceScreen().findPreference(BUTTON_WFC_MODE);
int wfcMode = ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY;
if (pref != null) {
pref.setEnabled(isWfcEnabled
&& (state == TelephonyManager.CALL_STATE_IDLE));
ListPreference prefWfcMode = (ListPreference) pref;
wfcMode = Integer.valueOf(prefWfcMode.getValue()).intValue();
}
pref = getPreferenceScreen().findPreference(BUTTON_WFC_ROAM);
if (pref != null) {
pref.setEnabled(isWfcEnabled
&& (wfcMode != ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY)
&& (state == TelephonyManager.CALL_STATE_IDLE));
}
}
};
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
final SettingsActivity activity = (SettingsActivity) getActivity();
mSwitchBar = activity.getSwitchBar();
mSwitch = mSwitchBar.getSwitch();
mSwitchBar.show();
}
@Override
public void onDestroyView() {
super.onDestroyView();
mSwitchBar.hide();
}
private void showAlert(Intent intent) {
Context context = getActivity();
CharSequence title = intent.getCharSequenceExtra(ImsPhone.EXTRA_KEY_ALERT_TITLE);
CharSequence message = intent.getCharSequenceExtra(ImsPhone.EXTRA_KEY_ALERT_MESSAGE);
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage(message)
.setTitle(title)
.setIcon(android.R.drawable.stat_sys_warning)
.setPositiveButton(android.R.string.ok, null);
AlertDialog dialog = builder.create();
dialog.show();
}
private IntentFilter mIntentFilter;
private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(ImsPhone.REGISTRATION_ERROR)) {
// If this fragment is active then we are immediately
// showing alert on screen. There is no need to add
// notification in this case.
//
// In order to communicate to ImsPhone that it should
// not show notification, we are changing result code here.
setResultCode(Activity.RESULT_CANCELED);
showAlert(intent);
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.wifi_calling_settings);
mButtonWfcMode = (ListPreference) findPreference(BUTTON_WFC_MODE);
mButtonWfcMode.setOnPreferenceChangeListener(this);
mButtonWfcRoam = (SwitchPreference) findPreference(BUTTON_WFC_ROAM);
mButtonWfcRoam.setOnPreferenceChangeListener(this);
mIntentFilter = new IntentFilter();
mIntentFilter.addAction(ImsPhone.REGISTRATION_ERROR);
}
@Override
public void onResume() {
super.onResume();
final Context context = getActivity();
if (ImsManager.isWfcEnabledByPlatform(context)) {
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_CALL_STATE);
mSwitchBar.addOnSwitchChangeListener(this);
}
// NOTE: Buttons will be enabled/disabled in mPhoneStateListener
boolean wfcEnabled = ImsManager.isWfcEnabledByUser(context)
&& ImsManager.isNonTtyOrTtyOnVolteEnabled(context);
mSwitch.setChecked(wfcEnabled);
int wfcMode = ImsManager.getWfcMode(context);
mButtonWfcMode.setValue(Integer.toString(wfcMode));
mButtonWfcMode.setSummary(getWfcModeSummary(context, wfcMode));
mButtonWfcRoam.setChecked(wfcEnabled
&& (wfcMode != ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY)
&& ImsManager.isWfcRoamingEnabledByUser(context));
context.registerReceiver(mIntentReceiver, mIntentFilter);
Intent intent = getActivity().getIntent();
if (intent.getBooleanExtra(ImsPhone.EXTRA_KEY_ALERT_SHOW, false)) {
showAlert(intent);
}
}
@Override
public void onPause() {
super.onPause();
final Context context = getActivity();
if (ImsManager.isWfcEnabledByPlatform(getActivity())) {
TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
tm.listen(mPhoneStateListener, PhoneStateListener.LISTEN_NONE);
mSwitchBar.removeOnSwitchChangeListener(this);
}
context.unregisterReceiver(mIntentReceiver);
}
/**
* Listens to the state change of the switch.
*/
@Override
public void onSwitchChanged(Switch switchView, boolean isChecked) {
final Context context = getActivity();
ImsManager.setWfcSetting(context, isChecked);
int wfcMode = ImsManager.getWfcMode(context);
mButtonWfcMode.setSummary(getWfcModeSummary(context, wfcMode));
mButtonWfcMode.setEnabled(isChecked);
boolean wfcHandoffEnabled = (wfcMode != ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY);
mButtonWfcRoam.setEnabled(isChecked && wfcHandoffEnabled);
mButtonWfcRoam.setChecked(isChecked && wfcHandoffEnabled
&& ImsManager.isWfcRoamingEnabledByUser(context));
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
final Context context = getActivity();
if (preference == mButtonWfcMode) {
mButtonWfcMode.setValue((String) newValue);
int buttonMode = Integer.valueOf((String) newValue);
int currentMode = ImsManager.getWfcMode(context);
if (buttonMode != currentMode) {
ImsManager.setWfcMode(context, buttonMode);
mButtonWfcMode.setSummary(getWfcModeSummary(context, buttonMode));
}
boolean wfcHandoffEnabled =
(buttonMode != ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY);
mButtonWfcRoam.setEnabled(wfcHandoffEnabled);
mButtonWfcRoam.setChecked(wfcHandoffEnabled &&
ImsManager.isWfcRoamingEnabledByUser(context));
} else if (preference == mButtonWfcRoam) {
SwitchPreference wfcRoamPref = (SwitchPreference) preference;
wfcRoamPref.setChecked(!wfcRoamPref.isChecked());
ImsManager.setWfcRoamingSetting(context, wfcRoamPref.isChecked());
}
return true;
}
static int getWfcModeSummary(Context context, int wfcMode) {
int resId = R.string.wifi_calling_off_summary;
if (ImsManager.isWfcEnabledByUser(context)) {
switch (wfcMode) {
case ImsConfig.WfcModeFeatureValueConstants.WIFI_ONLY:
resId = R.string.wfc_mode_wifi_only_summary;
break;
case ImsConfig.WfcModeFeatureValueConstants.CELLULAR_PREFERRED:
resId = R.string.wfc_mode_cellular_preferred_summary;
break;
case ImsConfig.WfcModeFeatureValueConstants.WIFI_PREFERRED:
resId = R.string.wfc_mode_wifi_preferred_summary;
break;
default:
Log.e(TAG, "Unexpected WFC mode value: " + wfcMode);
}
}
return resId;
}
}

View File

@@ -47,6 +47,8 @@ import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.util.Log;
import com.android.ims.ImsConfig;
import com.android.ims.ImsManager;
import com.android.internal.telephony.SmsApplication;
import com.android.internal.telephony.SmsApplication.SmsApplicationData;
import com.android.internal.telephony.TelephonyIntents;
@@ -54,6 +56,7 @@ import com.android.internal.telephony.TelephonyProperties;
import com.android.settings.nfc.NfcEnabler;
import com.android.settings.search.BaseSearchIndexProvider;
import com.android.settings.search.Indexable;
import com.android.settings.WifiCallingSettings;
import java.util.ArrayList;
import java.util.Arrays;
@@ -76,6 +79,7 @@ public class WirelessSettings extends SettingsPreferenceFragment
private static final String KEY_SMS_APPLICATION = "sms_application";
private static final String KEY_TOGGLE_NSD = "toggle_nsd"; //network service discovery
private static final String KEY_CELL_BROADCAST_SETTINGS = "cell_broadcast_settings";
private static final String KEY_WFC_SETTINGS = "wifi_calling_settings";
public static final String EXIT_ECM_RESULT = "exit_ecm_result";
public static final int REQUEST_CODE_EXIT_ECM = 1;
@@ -95,6 +99,7 @@ public class WirelessSettings extends SettingsPreferenceFragment
private static final String SAVED_MANAGE_MOBILE_PLAN_MSG = "mManageMobilePlanMessage";
private AppListPreference mSmsApplicationPreference;
private PreferenceScreen mButtonWfc;
/**
* Invoked on each preference click in this hierarchy, overrides
@@ -272,6 +277,12 @@ public class WirelessSettings extends SettingsPreferenceFragment
initSmsApplicationSetting();
}
if (ImsManager.isWfcEnabledByPlatform(activity)) {
mButtonWfc = (PreferenceScreen) findPreference(KEY_WFC_SETTINGS);
} else {
removePreference(KEY_WFC_SETTINGS);
}
// Remove NSD checkbox by default
getPreferenceScreen().removePreference(nsd);
//mNsdEnabler = new NsdEnabler(activity, nsd);
@@ -413,6 +424,12 @@ public class WirelessSettings extends SettingsPreferenceFragment
if (mNsdEnabler != null) {
mNsdEnabler.resume();
}
final Context context = getActivity();
if (ImsManager.isWfcEnabledByPlatform(context)) {
mButtonWfc.setSummary(WifiCallingSettings.getWfcModeSummary(
context, ImsManager.getWfcMode(context)));
}
}
@Override

View File

@@ -47,6 +47,7 @@ import com.android.settings.voice.VoiceInputSettings;
import com.android.settings.wifi.AdvancedWifiSettings;
import com.android.settings.wifi.SavedAccessPointsWifiSettings;
import com.android.settings.wifi.WifiSettings;
import com.android.settings.WifiCallingSettings;
import java.util.HashMap;
@@ -104,6 +105,7 @@ public final class Ranking {
// Other wireless settinfs
sRankMap.put(WirelessSettings.class.getName(), RANK_WIRELESS);
sRankMap.put(WifiCallingSettings.class.getName(), RANK_WIRELESS);
// Home
sRankMap.put(HomeSettings.class.getName(), RANK_HOME);

View File

@@ -49,6 +49,7 @@ import com.android.settings.voice.VoiceInputSettings;
import com.android.settings.wifi.AdvancedWifiSettings;
import com.android.settings.wifi.SavedAccessPointsWifiSettings;
import com.android.settings.wifi.WifiSettings;
import com.android.settings.WifiCallingSettings;
import java.util.Collection;
import java.util.HashMap;
@@ -270,6 +271,13 @@ public final class SearchIndexableResources {
NO_DATA_RES_ID,
DeviceInfoSettings.class.getName(),
R.drawable.ic_settings_about));
sResMap.put(WifiCallingSettings.class.getName(),
new SearchIndexableResource(
Ranking.getRankForClassName(WifiCallingSettings.class.getName()),
R.xml.wifi_calling_settings,
WifiCallingSettings.class.getName(),
R.drawable.ic_settings_wireless));
}
private SearchIndexableResources() {

View File

@@ -22,6 +22,7 @@ import android.content.DialogInterface;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiConfiguration.AuthAlgorithm;
import android.net.wifi.WifiConfiguration.KeyMgmt;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.text.Editable;
import android.text.InputType;
@@ -32,9 +33,13 @@ import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.RadioGroup;
import android.widget.RadioButton;
import com.android.settings.R;
import android.util.Log;
/**
* Dialog to configure the SSID and security settings
* for Access Point operation
@@ -53,8 +58,14 @@ public class WifiApDialog extends AlertDialog implements View.OnClickListener,
private TextView mSsid;
private int mSecurityTypeIndex = OPEN_INDEX;
private EditText mPassword;
private RadioGroup mChannel;
private RadioButton mChannel2G;
private RadioButton mChannel5G;
WifiConfiguration mWifiConfig;
WifiManager mWifiManager;
private static final String TAG = "WifiApDialog";
public WifiApDialog(Context context, DialogInterface.OnClickListener listener,
WifiConfiguration wifiConfig) {
@@ -64,6 +75,7 @@ public class WifiApDialog extends AlertDialog implements View.OnClickListener,
if (wifiConfig != null) {
mSecurityTypeIndex = getSecurityTypeIndex(wifiConfig);
}
mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
}
public static int getSecurityTypeIndex(WifiConfiguration wifiConfig) {
@@ -85,6 +97,16 @@ public class WifiApDialog extends AlertDialog implements View.OnClickListener,
*/
config.SSID = mSsid.getText().toString();
//obtain the band configure
if (mChannel2G.isChecked()) {
config.apBand = 0;
} else if(mChannel5G.isChecked()) {
config.apBand = 1;
} else {
Log.e("TAG", "AP band configure error!");
return null;
}
switch (mSecurityTypeIndex) {
case OPEN_INDEX:
config.allowedKeyManagement.set(KeyMgmt.NONE);
@@ -118,15 +140,36 @@ public class WifiApDialog extends AlertDialog implements View.OnClickListener,
mSsid = (TextView) mView.findViewById(R.id.ssid);
mPassword = (EditText) mView.findViewById(R.id.password);
mChannel = (RadioGroup) mView.findViewById(R.id.choose_channel);
mChannel2G = (RadioButton) mView.findViewById(R.id.ap_2G_band);
mChannel5G = (RadioButton) mView.findViewById(R.id.ap_5G_band);
String countryCode = mWifiManager.getCountryCode();
if (!mWifiManager.is5GHzBandSupported() || countryCode == null) {
//If no country code, 5GHz AP is forbidden
Log.e(TAG," NO country code, forbid 5GHz");
mChannel5G.setVisibility(View.INVISIBLE);
mWifiConfig.apBand = 0;
} else {
mChannel5G.setVisibility(View.VISIBLE);
}
setButton(BUTTON_SUBMIT, context.getString(R.string.wifi_save), mListener);
setButton(DialogInterface.BUTTON_NEGATIVE,
context.getString(R.string.wifi_cancel), mListener);
if (mWifiConfig != null) {
mSsid.setText(mWifiConfig.SSID);
if (mWifiConfig.apBand == 0) {
mChannel2G.setChecked(true);
} else {
mChannel5G.setChecked(true);
}
mSecurity.setSelection(mSecurityTypeIndex);
if (mSecurityTypeIndex == WPA2_INDEX) {
mPassword.setText(mWifiConfig.preSharedKey);
mPassword.setText(mWifiConfig.preSharedKey);
}
}