Add description for Wi-Fi calling mode

Replace the view of dialog with custom view that adds description
as summary.

Test: manual
Bug: 34793636
Change-Id: If9792b0a35c59c1260176b4b2c62107861de73b5
Merged-In: If9792b0a35c59c1260176b4b2c62107861de73b5
This commit is contained in:
Kazuya Ohshiro
2016-08-29 18:29:35 +09:00
committed by Hall Liu
parent 70b1830e7e
commit eb57875f64
9 changed files with 445 additions and 14 deletions

View File

@@ -1157,4 +1157,17 @@
<item>0</item>
</string-array>
<!-- WiFi calling mode array -->
<string-array name="wifi_calling_mode_summaries" translatable="false">
<item>@string/wifi_calling_mode_wifi_preferred_summary</item>
<item>@string/wifi_calling_mode_cellular_preferred_summary</item>
<item>@string/wifi_calling_mode_wifi_only_summary</item>
</string-array>
<!-- WiFi calling mode array without wifi only mode -->
<string-array name="wifi_calling_mode_summaries_without_wifi_only" translatable="false">
<item>@string/wifi_calling_mode_wifi_preferred_summary</item>
<item>@string/wifi_calling_mode_cellular_preferred_summary</item>
</string-array>
</resources>

View File

@@ -149,6 +149,11 @@
<attr name="aspectRatio" format="float" />
</declare-styleable>
<declare-styleable name="ListWithEntrySummaryPreference">
<!-- Summaries of entry -->
<attr name="entrySummaries" format="reference" />
</declare-styleable>
<!-- For UsageView -->
<declare-styleable name="UsageView">
<attr name="android:colorAccent" />

View File

@@ -291,6 +291,15 @@
<dimen name="password_requirement_textsize">14sp</dimen>
<!-- Visible vertical space we want to show below password edittext field when ime is shown.
The unit is sp as it is related to the text size of password requirement item. -->
<dimen name="visible_vertical_space_below_password">20sp</dimen>
<!-- Select dialog -->
<dimen name="select_dialog_padding_start">20dp</dimen>
<dimen name="select_dialog_item_margin_start">12dp</dimen>
<dimen name="select_dialog_summary_padding_bottom">8dp</dimen>
<!-- Padding between the donut and the storage summary. -->
<dimen name="storage_summary_padding_end">16dp</dimen>
<!-- Text size of the big number in the donut. -->

View File

@@ -2302,7 +2302,7 @@
<!-- Title of WFC preference item [CHAR LIMIT=30] -->
<string name="wifi_calling_mode_title">Calling preference</string>
<!-- Title of WFC preference selection dialog [CHAR LIMIT=30] -->
<string name="wifi_calling_mode_dialog_title">Wi-Fi calling mode</string>
<string name="wifi_calling_mode_dialog_title">Calling preference</string>
<!-- Title of WFC roaming preference item [CHAR LIMIT=45] -->
<string name="wifi_calling_roaming_mode_title">Roaming preference</string>
<!-- Summary of WFC roaming preference item [CHAR LIMIT=NONE]-->
@@ -2310,9 +2310,9 @@
<!-- WFC mode dialog [CHAR LIMIT=45] -->
<string name="wifi_calling_roaming_mode_dialog_title">Roaming preference</string>
<string-array name="wifi_calling_mode_choices">
<item>Wi-Fi preferred</item>
<item>Mobile preferred</item>
<item>Wi-Fi only</item>
<item>@*android:string/wfc_mode_wifi_preferred_summary</item>
<item>@*android:string/wfc_mode_cellular_preferred_summary</item>
<item>@*android:string/wfc_mode_wifi_only_summary</item>
</string-array>
<string-array name="wifi_calling_mode_choices_v2">
<item>Wi-Fi</item>
@@ -2325,8 +2325,8 @@
<item>"0"</item>
</string-array>
<string-array name="wifi_calling_mode_choices_without_wifi_only">
<item>Wi-Fi preferred</item>
<item>Mobile preferred</item>
<item>@*android:string/wfc_mode_wifi_preferred_summary</item>
<item>@*android:string/wfc_mode_cellular_preferred_summary</item>
</string-array>
<string-array name="wifi_calling_mode_choices_v2_without_wifi_only">
<item>Wi-Fi</item>
@@ -2336,6 +2336,14 @@
<item>"2"</item>
<item>"1"</item>
</string-array>
<!-- Summary of WFC preference item on the WFC preference selection dialog. [CHAR LIMIT=70]-->
<string name="wifi_calling_mode_wifi_preferred_summary">If Wi\u2011Fi is unavailable, use mobile network</string>
<!-- Summary of WFC preference item on the WFC preference selection dialog. [CHAR LIMIT=70]-->
<string name="wifi_calling_mode_cellular_preferred_summary">If mobile network is unavailable, use Wi\u2011Fi</string>
<!-- Summary of WFC preference item on the WFC preference selection dialog. [CHAR LIMIT=70]-->
<string name="wifi_calling_mode_wifi_only_summary">Call over Wi\u2011Fi. If Wi\u2011Fi is lost, call will end.</string>
<!-- Wi-Fi Calling settings. Text displayed when Wi-Fi Calling is off -->
<string name="wifi_calling_off_explanation">When Wi-Fi calling is on, your phone can route calls via Wi-Fi networks or your carrier\u2019s network, depending on your preference and which signal is stronger. Before turning on this feature, check with your carrier regarding fees and other details.</string>
<!-- Wi-Fi Calling settings. Additional text displayed when Wi-Fi Calling is off. Default empty. [CHAR LIMIT=NONE] -->

View File

@@ -0,0 +1,58 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Copyright (C) 2018 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.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="@dimen/select_dialog_padding_start"
android:paddingEnd="?android:attr/dialogPreferredPadding"
android:orientation="horizontal"
android:descendantFocusability="blocksDescendants">
<RadioButton
android:id="@+id/radio"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:clickable="false" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:layout_marginStart="@dimen/select_dialog_item_margin_start"
android:layout_gravity="center_vertical">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="?android:attr/textColorAlertDialogListItem"
android:ellipsize="marquee" />
<TextView
android:id="@+id/summary"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="@dimen/select_dialog_summary_padding_bottom"
android:textAppearance="?android:attr/textAppearanceListItemSecondary"
android:textColor="?android:attr/textColorSecondary"
android:maxLines="10" />
</LinearLayout>
</LinearLayout>

View File

@@ -15,24 +15,27 @@
-->
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:settings="http://schemas.android.com/apk/res-auto"
android:key="wifi_calling_settings"
android:title="@string/wifi_calling_settings_title">
<ListPreference
<com.android.settings.wifi.calling.ListWithEntrySummaryPreference
android:key="wifi_calling_mode"
android:title="@string/wifi_calling_mode_title"
android:summary="@string/wifi_calling_mode_title"
android:entries="@array/wifi_calling_mode_choices"
android:entryValues="@array/wifi_calling_mode_values"
android:dialogTitle="@string/wifi_calling_mode_dialog_title" />
android:dialogTitle="@string/wifi_calling_mode_dialog_title"
settings:entrySummaries="@array/wifi_calling_mode_summaries" />
<ListPreference
<com.android.settings.wifi.calling.ListWithEntrySummaryPreference
android:key="wifi_calling_roaming_mode"
android:title="@string/wifi_calling_roaming_mode_title"
android:summary="@string/wifi_calling_roaming_mode_summary"
android:entries="@array/wifi_calling_mode_choices_v2"
android:entryValues="@array/wifi_calling_mode_values"
android:dialogTitle="@string/wifi_calling_roaming_mode_dialog_title" />
android:dialogTitle="@string/wifi_calling_roaming_mode_dialog_title"
settings:entrySummaries="@array/wifi_calling_mode_summaries" />
<Preference
android:key="emergency_address_key"

View File

@@ -0,0 +1,204 @@
/*
* Copyright (C) 2018 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.wifi.calling;
import android.app.AlertDialog.Builder;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.TypedArray;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.RadioButton;
import android.widget.TextView;
import com.android.settings.CustomListPreference;
import com.android.settings.R;
/**
* ListPreference contain the entry summary.
*/
public class ListWithEntrySummaryPreference extends CustomListPreference {
private static final String LOG_TAG = "ListWithEntrySummaryPreference";
private final Context mContext;
private CharSequence[] mSummaries;
/**
* ListWithEntrySummaryPreference constructor.
*
* @param context The context of view.
* @param attrs The attributes of the XML tag that is inflating the linear layout.
*/
public ListWithEntrySummaryPreference(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
TypedArray array = context.obtainStyledAttributes(attrs,
R.styleable.ListWithEntrySummaryPreference, 0, 0);
mSummaries = array.getTextArray(R.styleable.ListWithEntrySummaryPreference_entrySummaries);
array.recycle();
}
/**
* Sets the summaries of mode items to be shown in the mode select dialog.
*
* @param summariesResId The summaries of mode items.
*/
public void setEntrySummaries(int summariesResId) {
mSummaries = getContext().getResources().getTextArray(summariesResId);
}
/**
* Sets the summaries of mode items to be shown in the mode select dialog.
*
* @param summaries The summaries of mode items.
*/
public void setEntrySummaries(CharSequence[] summaries) {
mSummaries = summaries;
}
private CharSequence getEntrySummary(int index) {
if (mSummaries == null) {
Log.w(LOG_TAG, "getEntrySummary : mSummaries is null");
return "";
}
return mSummaries[index];
}
@Override
protected void onPrepareDialogBuilder(Builder builder,
DialogInterface.OnClickListener listener) {
ListAdapter la = (ListAdapter) new SelectorAdapter(mContext,
R.xml.single_choice_list_item_2, this);
builder.setSingleChoiceItems(la, findIndexOfValue(getValue()), listener);
super.onPrepareDialogBuilder(builder, listener);
}
private static class SelectorAdapter extends ArrayAdapter<CharSequence> {
private final Context mContext;
private ListWithEntrySummaryPreference mSelector;
/**
* SelectorAdapter constructor.
*
* @param context The current context.
* @param rowResourceId The resource id of the XML tag that is inflating the linear layout.
* @param listPreference The instance of ListWithEntrySummaryPreference.
*/
public SelectorAdapter(Context context, int rowResourceId,
ListWithEntrySummaryPreference listPreference) {
super(context, rowResourceId, listPreference.getEntryValues());
mContext = context;
mSelector = listPreference;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(mContext);
View row = inflater.inflate(R.xml.single_choice_list_item_2, parent, false);
TextView title = (TextView) row.findViewById(R.id.title);
title.setText(mSelector.getEntries()[position]);
TextView summary = (TextView) row.findViewById(R.id.summary);
summary.setText(mSelector.getEntrySummary(position));
RadioButton rb = (RadioButton) row.findViewById(R.id.radio);
if (position == mSelector.findIndexOfValue(mSelector.getValue())) {
rb.setChecked(true);
}
return row;
}
}
@Override
protected Parcelable onSaveInstanceState() {
final Parcelable superState = super.onSaveInstanceState();
final SavedState myState = new SavedState(superState);
myState.mEntries = getEntries();
myState.mEntryValues = getEntryValues();
myState.mSummaries = mSummaries;
return myState;
}
@Override
protected void onRestoreInstanceState(Parcelable state) {
if (state == null || !state.getClass().equals(SavedState.class)) {
// Didn't save state for us in onSaveInstanceState
super.onRestoreInstanceState(state);
return;
}
SavedState myState = (SavedState) state;
super.onRestoreInstanceState(myState.getSuperState());
setEntries(myState.mEntries);
setEntryValues(myState.mEntryValues);
mSummaries = myState.mSummaries;
}
/**
* We save entries, entryValues and summaries into bundle.
* At onCreate of fragment, dialog will be restored if it was open. In this case,
* we need to restore entries, entryValues and summaries. Without those information,
* crash when entering multi window during wfc modes dialog shown.
*/
private static class SavedState extends BaseSavedState {
private CharSequence[] mEntries;
private CharSequence[] mEntryValues;
private CharSequence[] mSummaries;
public SavedState(Parcel source) {
super(source);
mEntries = source.readCharSequenceArray();
mEntryValues = source.readCharSequenceArray();
mSummaries = source.readCharSequenceArray();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
super.writeToParcel(dest, flags);
dest.writeCharSequenceArray(mEntries);
dest.writeCharSequenceArray(mEntryValues);
dest.writeCharSequenceArray(mSummaries);
}
public SavedState(Parcelable superState) {
super(superState);
}
public static final Parcelable.Creator<SavedState> CREATOR =
new Parcelable.Creator<SavedState>() {
@Override
public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
}
@Override
public SavedState[] newArray(int size) {
return new SavedState[size];
}
};
}
}

View File

@@ -77,8 +77,8 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
//UI objects
private SwitchBar mSwitchBar;
private Switch mSwitch;
private ListPreference mButtonWfcMode;
private ListPreference mButtonWfcRoamingMode;
private ListWithEntrySummaryPreference mButtonWfcMode;
private ListWithEntrySummaryPreference mButtonWfcRoamingMode;
private Preference mUpdateAddress;
private TextView mEmptyView;
@@ -237,10 +237,11 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
mImsManager = ImsManager.getInstance(
getActivity(), SubscriptionManager.getPhoneId(mSubId));
mButtonWfcMode = (ListPreference) findPreference(BUTTON_WFC_MODE);
mButtonWfcMode = (ListWithEntrySummaryPreference) findPreference(BUTTON_WFC_MODE);
mButtonWfcMode.setOnPreferenceChangeListener(this);
mButtonWfcRoamingMode = (ListPreference) findPreference(BUTTON_WFC_ROAMING_MODE);
mButtonWfcRoamingMode = (ListWithEntrySummaryPreference) findPreference(
BUTTON_WFC_ROAMING_MODE);
mButtonWfcRoamingMode.setOnPreferenceChangeListener(this);
mUpdateAddress = (Preference) findPreference(PREFERENCE_EMERGENCY_ADDRESS);
@@ -291,10 +292,14 @@ public class WifiCallingSettingsForSub extends SettingsPreferenceFragment
if (!isWifiOnlySupported) {
mButtonWfcMode.setEntries(R.array.wifi_calling_mode_choices_without_wifi_only);
mButtonWfcMode.setEntryValues(R.array.wifi_calling_mode_values_without_wifi_only);
mButtonWfcMode.setEntrySummaries(R.array.wifi_calling_mode_summaries_without_wifi_only);
mButtonWfcRoamingMode.setEntries(
R.array.wifi_calling_mode_choices_v2_without_wifi_only);
mButtonWfcRoamingMode.setEntryValues(
R.array.wifi_calling_mode_values_without_wifi_only);
mButtonWfcRoamingMode.setEntrySummaries(
R.array.wifi_calling_mode_summaries_without_wifi_only);
}

View File

@@ -0,0 +1,126 @@
/*
* Copyright (C) 2018 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.wifi.calling;
import static com.google.common.truth.Truth.assertThat;
import android.app.AlertDialog;
import android.content.Context;
import android.os.Parcelable;
import android.widget.ListAdapter;
import android.widget.TextView;
import com.android.settings.R;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import java.io.IOException;
@RunWith(RobolectricTestRunner.class)
public class ListWithEntrySummaryPreferenceTest {
private Context mContext;
private ListWithEntrySummaryPreference mPreference;
private CharSequence[] mDefaultEntries =
{"default_entry1", "default_entry2", "default_entry3"};
private CharSequence[] mDefaultEntryValues = {"0", "1", "2"};
private CharSequence[] mDefaultEntrySummaries =
{"default_summary1", "default_summary2", "default_summary3"};
private CharSequence[] mCustomEntries = {"custom_entry1", "custom_entry2"};
private CharSequence[] mCustomEntryValues = {"0", "1"};
private CharSequence[] mCustomEntrySummaries = {"custom_summary1", "custom_summary2"};
@Before
public void setUp() {
mContext = RuntimeEnvironment.application;
mPreference = new ListWithEntrySummaryPreference(mContext, null);
mPreference.setEntries(mDefaultEntries);
mPreference.setEntryValues(mDefaultEntryValues);
mPreference.setEntrySummaries(mDefaultEntrySummaries);
}
@Test
public void initialize_defaultEntries_shouldDisplayDefalutEntries() {
AlertDialog dialog = showDialog(mPreference);
ListAdapter adapter = dialog.getListView().getAdapter();
int len = mDefaultEntries.length;
assertThat(adapter.getCount()).isEqualTo(len);
for (int i = 0; i < len; i++) {
TextView title = adapter.getView(i, null, null).findViewById(R.id.title);
TextView summary = adapter.getView(i, null, null).findViewById(R.id.summary);
assertThat(title.getText()).isEqualTo(mDefaultEntries[i]);
assertThat(summary.getText()).isEqualTo(mDefaultEntrySummaries[i]);
}
}
@Test
public void setEntries_customEntries_shouldUpdateEntries() {
mPreference.setEntries(mCustomEntries);
mPreference.setEntryValues(mCustomEntryValues);
mPreference.setEntrySummaries(mCustomEntrySummaries);
AlertDialog dialog = showDialog(mPreference);
ListAdapter adapter = dialog.getListView().getAdapter();
int len = mCustomEntries.length;
assertThat(adapter.getCount()).isEqualTo(len);
for (int i = 0; i < len; i++) {
TextView title = adapter.getView(i, null, null).findViewById(R.id.title);
TextView summary = adapter.getView(i, null, null).findViewById(R.id.summary);
assertThat(title.getText()).isEqualTo(mCustomEntries[i]);
assertThat(summary.getText()).isEqualTo(mCustomEntrySummaries[i]);
}
}
@Test
public void onSaveAndRestoreInstanceState_resumePreference_shouldNotChangeEntries() {
setEntries_customEntries_shouldUpdateEntries();
final Parcelable parcelable = mPreference.onSaveInstanceState();
ListWithEntrySummaryPreference preference
= new ListWithEntrySummaryPreference(mContext, null);
preference.setEntries(mDefaultEntries);
preference.setEntryValues(mDefaultEntryValues);
preference.setEntrySummaries(mDefaultEntrySummaries);
preference.onRestoreInstanceState(parcelable);
AlertDialog dialog = showDialog(preference);
ListAdapter adapter = dialog.getListView().getAdapter();
int len = mCustomEntries.length;
assertThat(adapter.getCount()).isEqualTo(len);
for (int i = 0; i < len; i++) {
TextView title = adapter.getView(i, null, null).findViewById(R.id.title);
TextView summary = adapter.getView(i, null, null).findViewById(R.id.summary);
assertThat(title.getText()).isEqualTo(mCustomEntries[i]);
assertThat(summary.getText()).isEqualTo(mCustomEntrySummaries[i]);
}
}
private AlertDialog showDialog(ListWithEntrySummaryPreference preference) {
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
preference.onPrepareDialogBuilder(builder, null);
return builder.show();
}
}