Merge "Add a plus button to the mobile pref on Network & internet page"

This commit is contained in:
TreeHugger Robot
2019-01-29 22:08:33 +00:00
committed by Android (Google) Code Review
8 changed files with 411 additions and 45 deletions

View File

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright (C) 2019 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.
-->
<ImageView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/add_preference_widget"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:paddingStart="?android:attr/listPreferredItemPaddingEnd"
android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
android:background="?android:attr/selectableItemBackground"
android:scaleType="center"
android:src="@drawable/ic_add_24dp"
android:contentDescription="@string/add" />

View File

@@ -658,6 +658,8 @@
<string name="apply">Apply</string> <string name="apply">Apply</string>
<!-- Button label for generic share action [CHAR LIMIT=20] --> <!-- Button label for generic share action [CHAR LIMIT=20] -->
<string name="share">Share</string> <string name="share">Share</string>
<!-- Button label for generic add action [CHAR LIMIT=20] -->
<string name="add">Add</string>
<!-- Title of the Settings activity shown within the application itself. --> <!-- Title of the Settings activity shown within the application itself. -->
<string name="settings_label">Settings</string> <string name="settings_label">Settings</string>

View File

@@ -23,6 +23,8 @@
android:key="add_more" android:key="add_more"
android:title="@string/mobile_network_list_add_more" android:title="@string/mobile_network_list_add_more"
android:icon="@drawable/ic_menu_add" android:icon="@drawable/ic_menu_add"
android:order="100" /> android:order="100" >
<intent android:action="android.telephony.euicc.action.PROVISION_EMBEDDED_SUBSCRIPTION" />
</Preference>
</PreferenceScreen> </PreferenceScreen>

View File

@@ -39,7 +39,7 @@
android:targetClass="Settings$WifiSettingsActivity" /> android:targetClass="Settings$WifiSettingsActivity" />
</com.android.settings.widget.MasterSwitchPreference> </com.android.settings.widget.MasterSwitchPreference>
<com.android.settingslib.RestrictedPreference <com.android.settings.widget.AddPreference
android:key="mobile_network_list" android:key="mobile_network_list"
android:title="@string/network_settings_title" android:title="@string/network_settings_title"
android:summary="@string/summary_placeholder" android:summary="@string/summary_placeholder"

View File

@@ -16,6 +16,8 @@
package com.android.settings.network; package com.android.settings.network;
import static android.telephony.TelephonyManager.MultiSimVariants.UNKNOWN;
import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE; import static androidx.lifecycle.Lifecycle.Event.ON_PAUSE;
import static androidx.lifecycle.Lifecycle.Event.ON_RESUME; import static androidx.lifecycle.Lifecycle.Event.ON_RESUME;
@@ -23,6 +25,15 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager; import android.telephony.SubscriptionManager;
import android.telephony.TelephonyManager;
import android.telephony.euicc.EuiccManager;
import com.android.settings.R;
import com.android.settings.network.telephony.MobileNetworkActivity;
import com.android.settings.widget.AddPreference;
import com.android.settingslib.core.AbstractPreferenceController;
import java.util.List;
import androidx.lifecycle.Lifecycle; import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleObserver; import androidx.lifecycle.LifecycleObserver;
@@ -30,12 +41,6 @@ import androidx.lifecycle.OnLifecycleEvent;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.network.telephony.MobileNetworkActivity;
import com.android.settingslib.core.AbstractPreferenceController;
import java.util.List;
public class MobileNetworkSummaryController extends AbstractPreferenceController implements public class MobileNetworkSummaryController extends AbstractPreferenceController implements
SubscriptionsChangeListener.SubscriptionsChangeListenerClient, LifecycleObserver { SubscriptionsChangeListener.SubscriptionsChangeListenerClient, LifecycleObserver {
private static final String TAG = "MobileNetSummaryCtlr"; private static final String TAG = "MobileNetSummaryCtlr";
@@ -44,7 +49,8 @@ public class MobileNetworkSummaryController extends AbstractPreferenceController
private SubscriptionManager mSubscriptionManager; private SubscriptionManager mSubscriptionManager;
private SubscriptionsChangeListener mChangeListener; private SubscriptionsChangeListener mChangeListener;
private PreferenceScreen mScreen; private TelephonyManager mTelephonyMgr;
private AddPreference mPreference;
/** /**
* This controls the summary text and click behavior of the "Mobile network" item on the * This controls the summary text and click behavior of the "Mobile network" item on the
@@ -64,6 +70,7 @@ public class MobileNetworkSummaryController extends AbstractPreferenceController
public MobileNetworkSummaryController(Context context, Lifecycle lifecycle) { public MobileNetworkSummaryController(Context context, Lifecycle lifecycle) {
super(context); super(context);
mSubscriptionManager = context.getSystemService(SubscriptionManager.class); mSubscriptionManager = context.getSystemService(SubscriptionManager.class);
mTelephonyMgr = mContext.getSystemService(TelephonyManager.class);
mChangeListener = new SubscriptionsChangeListener(context, this); mChangeListener = new SubscriptionsChangeListener(context, this);
lifecycle.addObserver(this); lifecycle.addObserver(this);
} }
@@ -82,7 +89,7 @@ public class MobileNetworkSummaryController extends AbstractPreferenceController
@Override @Override
public void displayPreference(PreferenceScreen screen) { public void displayPreference(PreferenceScreen screen) {
super.displayPreference(screen); super.displayPreference(screen);
mScreen = screen; mPreference = screen.findPreference(getPreferenceKey());
} }
@Override @Override
@@ -100,29 +107,51 @@ public class MobileNetworkSummaryController extends AbstractPreferenceController
} }
} }
private void update() { private void startAddSimFlow() {
if (mScreen != null) { final Intent intent = new Intent(EuiccManager.ACTION_PROVISION_EMBEDDED_SUBSCRIPTION);
final Preference preference = mScreen.findPreference(getPreferenceKey()); mContext.startActivity(intent);
refreshSummary(preference); }
final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions(
mSubscriptionManager);
preference.setOnPreferenceClickListener(null); private boolean shouldEnableAddButton() {
preference.setFragment(null); // The add button should only show up if the device is in multi-sim mode.
if (subs.size() == 0) { return mTelephonyMgr.getMultiSimConfiguration() != UNKNOWN;
preference.setOnPreferenceClickListener((Preference pref) -> { }
// TODO(asargent) - need to get correct intent to fire here
return true; private void update() {
}); if (mPreference == null) {
} else if (subs.size() == 1) { return;
preference.setOnPreferenceClickListener((Preference pref) -> { }
final Intent intent = new Intent(mContext, MobileNetworkActivity.class); final boolean enableAddButton = shouldEnableAddButton();
mContext.startActivity(intent); refreshSummary(mPreference);
return true; if (!enableAddButton) {
}); mPreference.setOnAddClickListener(null);
} else {
mPreference.setOnAddClickListener(p -> {
startAddSimFlow();
});
}
final List<SubscriptionInfo> subs = SubscriptionUtil.getAvailableSubscriptions(
mSubscriptionManager);
mPreference.setOnPreferenceClickListener(null);
mPreference.setFragment(null);
mPreference.setEnabled(true);
if (subs.isEmpty()) {
if (enableAddButton) {
mPreference.setEnabled(false);
} else { } else {
preference.setFragment(MobileNetworkListFragment.class.getCanonicalName()); mPreference.setOnPreferenceClickListener((Preference pref) -> {
startAddSimFlow();
return true;
});
} }
} else if (subs.size() == 1) {
mPreference.setOnPreferenceClickListener((Preference pref) -> {
final Intent intent = new Intent(mContext, MobileNetworkActivity.class);
mContext.startActivity(intent);
return true;
});
} else {
mPreference.setFragment(MobileNetworkListFragment.class.getCanonicalName());
} }
} }
@@ -142,6 +171,7 @@ public class MobileNetworkSummaryController extends AbstractPreferenceController
@Override @Override
public void onSubscriptionsChanged() { public void onSubscriptionsChanged() {
refreshSummary(mPreference);
update(); update();
} }
} }

View File

@@ -0,0 +1,85 @@
/*
* Copyright (C) 2019 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.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import com.android.settings.R;
import com.android.settingslib.RestrictedPreference;
import androidx.annotation.VisibleForTesting;
import androidx.preference.PreferenceViewHolder;
/**
* A preference with a plus button on the side representing an "add" action. The plus button will
* only be visible when a non-null click listener is registered.
*/
public class AddPreference extends RestrictedPreference implements View.OnClickListener {
private OnAddClickListener mListener;
private View mWidgetFrame;
public AddPreference(Context context, AttributeSet attrs) {
super(context, attrs);
}
@VisibleForTesting
int getAddWidgetResId() {
return R.id.add_preference_widget;
}
/** Sets a listener for clicks on the plus button. Passing null will cause the button to be
* hidden. */
public void setOnAddClickListener(OnAddClickListener listener) {
mListener = listener;
if (mWidgetFrame != null) {
mWidgetFrame.setVisibility(shouldHideSecondTarget() ? View.GONE : View.VISIBLE);
}
}
@Override
protected int getSecondTargetResId() {
return R.layout.preference_widget_add;
}
@Override
protected boolean shouldHideSecondTarget() {
return mListener == null;
}
@Override
public void onBindViewHolder(PreferenceViewHolder holder) {
super.onBindViewHolder(holder);
mWidgetFrame = holder.findViewById(android.R.id.widget_frame);
final View addWidget = holder.findViewById(getAddWidgetResId());
addWidget.setEnabled(true);
addWidget.setOnClickListener(this);
}
@Override
public void onClick(View view) {
if (view.getId() == getAddWidgetResId() && mListener != null) {
mListener.onAddClick(this);
}
}
public interface OnAddClickListener {
void onAddClick(AddPreference p);
}
}

View File

@@ -16,10 +16,16 @@
package com.android.settings.network; package com.android.settings.network;
import static android.telephony.TelephonyManager.MultiSimVariants.DSDS;
import static android.telephony.TelephonyManager.MultiSimVariants.UNKNOWN;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.isNull;
import static org.mockito.ArgumentMatchers.notNull;
import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.spy; import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -28,8 +34,11 @@ import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionInfo;
import android.telephony.TelephonyManager;
import android.telephony.euicc.EuiccManager;
import com.android.settings.network.telephony.MobileNetworkActivity; import com.android.settings.network.telephony.MobileNetworkActivity;
import com.android.settings.widget.AddPreference;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
@@ -44,7 +53,6 @@ import org.robolectric.RobolectricTestRunner;
import java.util.Arrays; import java.util.Arrays;
import androidx.lifecycle.Lifecycle; import androidx.lifecycle.Lifecycle;
import androidx.preference.Preference;
import androidx.preference.PreferenceScreen; import androidx.preference.PreferenceScreen;
@RunWith(RobolectricTestRunner.class) @RunWith(RobolectricTestRunner.class)
@@ -52,10 +60,12 @@ public class MobileNetworkSummaryControllerTest {
@Mock @Mock
private Lifecycle mLifecycle; private Lifecycle mLifecycle;
@Mock @Mock
PreferenceScreen mPreferenceScreen; private TelephonyManager mTelephonyManager;
Preference mPreference; @Mock
private PreferenceScreen mPreferenceScreen;
private AddPreference mPreference;
private Context mContext; private Context mContext;
private MobileNetworkSummaryController mController; private MobileNetworkSummaryController mController;
@@ -63,8 +73,11 @@ public class MobileNetworkSummaryControllerTest {
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mContext = spy(Robolectric.setupActivity(Activity.class)); mContext = spy(Robolectric.setupActivity(Activity.class));
when(mContext.getSystemService(eq(TelephonyManager.class))).thenReturn(mTelephonyManager);
when(mTelephonyManager.getMultiSimConfiguration()).thenReturn(UNKNOWN);
mController = new MobileNetworkSummaryController(mContext, mLifecycle); mController = new MobileNetworkSummaryController(mContext, mLifecycle);
mPreference = new Preference(mContext); mPreference = spy(new AddPreference(mContext, null));
mPreference.setKey(mController.getPreferenceKey()); mPreference.setKey(mController.getPreferenceKey());
when(mPreferenceScreen.findPreference(eq(mController.getPreferenceKey()))).thenReturn( when(mPreferenceScreen.findPreference(eq(mController.getPreferenceKey()))).thenReturn(
mPreference); mPreference);
@@ -76,15 +89,21 @@ public class MobileNetworkSummaryControllerTest {
} }
@Test @Test
public void getSummary_noSubscriptions_correctSummary() { public void getSummary_noSubscriptions_correctSummaryAndClickHandler() {
mController.displayPreference(mPreferenceScreen); mController.displayPreference(mPreferenceScreen);
mController.onResume(); mController.onResume();
assertThat(mController.getSummary()).isEqualTo("Add a network"); assertThat(mController.getSummary()).isEqualTo("Add a network");
mPreference.getOnPreferenceClickListener().onPreferenceClick(mPreference);
final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
verify(mContext).startActivity(intentCaptor.capture());
assertThat(intentCaptor.getValue().getAction()).isEqualTo(
EuiccManager.ACTION_PROVISION_EMBEDDED_SUBSCRIPTION);
} }
@Test @Test
public void getSummary_oneSubscription_correctSummaryAndClickHandler() { public void getSummary_oneSubscription_correctSummaryAndClickHandler() {
SubscriptionInfo sub1 = mock(SubscriptionInfo.class); final SubscriptionInfo sub1 = mock(SubscriptionInfo.class);
when(sub1.getSubscriptionId()).thenReturn(1); when(sub1.getSubscriptionId()).thenReturn(1);
when(sub1.getDisplayName()).thenReturn("sub1"); when(sub1.getDisplayName()).thenReturn("sub1");
SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(sub1)); SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(sub1));
@@ -93,7 +112,7 @@ public class MobileNetworkSummaryControllerTest {
assertThat(mController.getSummary()).isEqualTo("sub1"); assertThat(mController.getSummary()).isEqualTo("sub1");
assertThat(mPreference.getFragment()).isNull(); assertThat(mPreference.getFragment()).isNull();
mPreference.getOnPreferenceClickListener().onPreferenceClick(mPreference); mPreference.getOnPreferenceClickListener().onPreferenceClick(mPreference);
ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
verify(mContext).startActivity(intentCaptor.capture()); verify(mContext).startActivity(intentCaptor.capture());
assertThat(intentCaptor.getValue().getComponent().getClassName()).isEqualTo( assertThat(intentCaptor.getValue().getComponent().getClassName()).isEqualTo(
MobileNetworkActivity.class.getName()); MobileNetworkActivity.class.getName());
@@ -101,8 +120,8 @@ public class MobileNetworkSummaryControllerTest {
@Test @Test
public void getSummary_twoSubscriptions_correctSummaryAndFragment() { public void getSummary_twoSubscriptions_correctSummaryAndFragment() {
SubscriptionInfo sub1 = mock(SubscriptionInfo.class); final SubscriptionInfo sub1 = mock(SubscriptionInfo.class);
SubscriptionInfo sub2 = mock(SubscriptionInfo.class); final SubscriptionInfo sub2 = mock(SubscriptionInfo.class);
when(sub1.getSubscriptionId()).thenReturn(1); when(sub1.getSubscriptionId()).thenReturn(1);
when(sub2.getSubscriptionId()).thenReturn(2); when(sub2.getSubscriptionId()).thenReturn(2);
@@ -115,8 +134,8 @@ public class MobileNetworkSummaryControllerTest {
@Test @Test
public void getSummaryAfterUpdate_twoSubscriptionsBecomesOne_correctSummaryAndFragment() { public void getSummaryAfterUpdate_twoSubscriptionsBecomesOne_correctSummaryAndFragment() {
SubscriptionInfo sub1 = mock(SubscriptionInfo.class); final SubscriptionInfo sub1 = mock(SubscriptionInfo.class);
SubscriptionInfo sub2 = mock(SubscriptionInfo.class); final SubscriptionInfo sub2 = mock(SubscriptionInfo.class);
when(sub1.getSubscriptionId()).thenReturn(1); when(sub1.getSubscriptionId()).thenReturn(1);
when(sub2.getSubscriptionId()).thenReturn(2); when(sub2.getSubscriptionId()).thenReturn(2);
when(sub1.getDisplayName()).thenReturn("sub1"); when(sub1.getDisplayName()).thenReturn("sub1");
@@ -135,7 +154,7 @@ public class MobileNetworkSummaryControllerTest {
assertThat(mController.getSummary()).isEqualTo("sub1"); assertThat(mController.getSummary()).isEqualTo("sub1");
assertThat(mPreference.getFragment()).isNull(); assertThat(mPreference.getFragment()).isNull();
mPreference.getOnPreferenceClickListener().onPreferenceClick(mPreference); mPreference.getOnPreferenceClickListener().onPreferenceClick(mPreference);
ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
verify(mContext).startActivity(intentCaptor.capture()); verify(mContext).startActivity(intentCaptor.capture());
assertThat(intentCaptor.getValue().getComponent().getClassName()).isEqualTo( assertThat(intentCaptor.getValue().getComponent().getClassName()).isEqualTo(
MobileNetworkActivity.class.getName()); MobileNetworkActivity.class.getName());
@@ -143,8 +162,8 @@ public class MobileNetworkSummaryControllerTest {
@Test @Test
public void getSummaryAfterUpdate_oneSubscriptionBecomesTwo_correctSummaryAndFragment() { public void getSummaryAfterUpdate_oneSubscriptionBecomesTwo_correctSummaryAndFragment() {
SubscriptionInfo sub1 = mock(SubscriptionInfo.class); final SubscriptionInfo sub1 = mock(SubscriptionInfo.class);
SubscriptionInfo sub2 = mock(SubscriptionInfo.class); final SubscriptionInfo sub2 = mock(SubscriptionInfo.class);
when(sub1.getSubscriptionId()).thenReturn(1); when(sub1.getSubscriptionId()).thenReturn(1);
when(sub2.getSubscriptionId()).thenReturn(2); when(sub2.getSubscriptionId()).thenReturn(2);
when(sub1.getDisplayName()).thenReturn("sub1"); when(sub1.getDisplayName()).thenReturn("sub1");
@@ -156,7 +175,7 @@ public class MobileNetworkSummaryControllerTest {
assertThat(mController.getSummary()).isEqualTo("sub1"); assertThat(mController.getSummary()).isEqualTo("sub1");
assertThat(mPreference.getFragment()).isNull(); assertThat(mPreference.getFragment()).isNull();
mPreference.getOnPreferenceClickListener().onPreferenceClick(mPreference); mPreference.getOnPreferenceClickListener().onPreferenceClick(mPreference);
ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class); final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
verify(mContext).startActivity(intentCaptor.capture()); verify(mContext).startActivity(intentCaptor.capture());
assertThat(intentCaptor.getValue().getComponent().getClassName()).isEqualTo( assertThat(intentCaptor.getValue().getComponent().getClassName()).isEqualTo(
MobileNetworkActivity.class.getName()); MobileNetworkActivity.class.getName());
@@ -168,4 +187,53 @@ public class MobileNetworkSummaryControllerTest {
assertThat(mController.getSummary()).isEqualTo("2 SIMs"); assertThat(mController.getSummary()).isEqualTo("2 SIMs");
assertThat(mPreference.getFragment()).isEqualTo(MobileNetworkListFragment.class.getName()); assertThat(mPreference.getFragment()).isEqualTo(MobileNetworkListFragment.class.getName());
} }
@Test
public void addButton_noSubscriptionsSingleSimMode_noAddClickListener() {
mController.displayPreference(mPreferenceScreen);
mController.onResume();
verify(mPreference, never()).setOnAddClickListener(notNull());
}
@Test
public void addButton_oneSubscriptionSingleSimMode_noAddClickListener() {
final SubscriptionInfo sub1 = mock(SubscriptionInfo.class);
SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(sub1));
mController.displayPreference(mPreferenceScreen);
mController.onResume();
verify(mPreference, never()).setOnAddClickListener(notNull());
}
@Test
public void addButton_noSubscriptionsMultiSimMode_hasAddClickListenerAndPrefDisabled() {
when(mTelephonyManager.getMultiSimConfiguration()).thenReturn(DSDS);
mController.displayPreference(mPreferenceScreen);
mController.onResume();
assertThat(mPreference.isEnabled()).isFalse();
verify(mPreference, never()).setOnAddClickListener(isNull());
verify(mPreference).setOnAddClickListener(notNull());
}
@Test
public void addButton_oneSubscriptionMultiSimMode_hasAddClickListener() {
when(mTelephonyManager.getMultiSimConfiguration()).thenReturn(DSDS);
final SubscriptionInfo sub1 = mock(SubscriptionInfo.class);
SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(sub1));
mController.displayPreference(mPreferenceScreen);
mController.onResume();
verify(mPreference, never()).setOnAddClickListener(isNull());
verify(mPreference).setOnAddClickListener(notNull());
}
@Test
public void addButton_twoSubscriptionsMultiSimMode_hasAddClickListener() {
when(mTelephonyManager.getMultiSimConfiguration()).thenReturn(DSDS);
final SubscriptionInfo sub1 = mock(SubscriptionInfo.class);
final SubscriptionInfo sub2 = mock(SubscriptionInfo.class);
SubscriptionUtil.setAvailableSubscriptionsForTesting(Arrays.asList(sub1, sub2));
mController.displayPreference(mPreferenceScreen);
mController.onResume();
verify(mPreference, never()).setOnAddClickListener(isNull());
verify(mPreference).setOnAddClickListener(notNull());
}
} }

View File

@@ -0,0 +1,149 @@
/*
* Copyright (C) 2019 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.widget;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import android.content.Context;
import android.view.View;
import com.android.settings.R;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.RuntimeEnvironment;
import androidx.preference.PreferenceViewHolder;
@RunWith(RobolectricTestRunner.class)
public class AddPreferenceTest {
private Context mContext;
private PreferenceViewHolder mViewHolder;
private View mWidgetFrame;
private View mAddWidget;
private AddPreference mPreference;
@Before
public void setUp() {
mContext = RuntimeEnvironment.application;
mPreference = new AddPreference(mContext, null);
final View view = spy(View.inflate(mContext, mPreference.getLayoutResource(), null));
mViewHolder = PreferenceViewHolder.createInstanceForTests(view);
mWidgetFrame = view.findViewById(android.R.id.widget_frame);
mAddWidget = spy(View.inflate(mContext, mPreference.getSecondTargetResId(), null));
when(mViewHolder.findViewById(mPreference.getAddWidgetResId())).thenReturn(mAddWidget);
}
@Test
public void onBindViewHolder_noListener_addButtonNotVisible() {
mPreference.onBindViewHolder(mViewHolder);
assertThat(mPreference.shouldHideSecondTarget()).isTrue();
assertThat(mWidgetFrame.getVisibility()).isEqualTo(View.GONE);
}
@Test
public void onBindViewHolder_hasListener_addButtonVisible() {
mPreference.setOnAddClickListener(p -> {});
mPreference.onBindViewHolder(mViewHolder);
assertThat(mPreference.shouldHideSecondTarget()).isFalse();
assertThat(mWidgetFrame.getVisibility()).isEqualTo(View.VISIBLE);
}
@Test
public void setOnAddClickListener_listenerAddedAfterBinding_addButtonBecomesVisible() {
mPreference.onBindViewHolder(mViewHolder);
assertThat(mPreference.shouldHideSecondTarget()).isTrue();
assertThat(mWidgetFrame.getVisibility()).isEqualTo(View.GONE);
mPreference.setOnAddClickListener(p -> {});
assertThat(mPreference.shouldHideSecondTarget()).isFalse();
assertThat(mWidgetFrame.getVisibility()).isEqualTo(View.VISIBLE);
}
@Test
public void setOnAddClickListener_listenerRemovedAfterBinding_addButtonNotVisible() {
mPreference.setOnAddClickListener(p -> {});
mPreference.onBindViewHolder(mViewHolder);
assertThat(mPreference.shouldHideSecondTarget()).isFalse();
assertThat(mWidgetFrame.getVisibility()).isEqualTo(View.VISIBLE);
mPreference.setOnAddClickListener(null);
assertThat(mPreference.shouldHideSecondTarget()).isTrue();
assertThat(mWidgetFrame.getVisibility()).isEqualTo(View.GONE);
}
@Test
public void setOnAddClickListener_listenerAddedAndRemovedAfterBinding_addButtonNotVisible() {
mPreference.onBindViewHolder(mViewHolder);
assertThat(mPreference.shouldHideSecondTarget()).isTrue();
assertThat(mWidgetFrame.getVisibility()).isEqualTo(View.GONE);
mPreference.setOnAddClickListener(p -> {});
assertThat(mPreference.shouldHideSecondTarget()).isFalse();
assertThat(mWidgetFrame.getVisibility()).isEqualTo(View.VISIBLE);
mPreference.setOnAddClickListener(null);
assertThat(mPreference.shouldHideSecondTarget()).isTrue();
assertThat(mWidgetFrame.getVisibility()).isEqualTo(View.GONE);
}
@Test
public void onClick_noListener_noCrash() {
mPreference.onBindViewHolder(mViewHolder);
// should be no crash here
mPreference.onClick(mAddWidget);
}
@Test
public void onClick_hasListenerBeforeBind_firesCorrectly() {
final AddPreference.OnAddClickListener listener = mock(
AddPreference.OnAddClickListener.class);
mPreference.setOnAddClickListener(listener);
mPreference.onBindViewHolder(mViewHolder);
assertThat(mWidgetFrame.getVisibility()).isEqualTo(View.VISIBLE);
mPreference.onClick(mAddWidget);
verify(listener).onAddClick(eq(mPreference));
}
@Test
public void onClick_listenerAddedAfterBind_firesCorrectly() {
mPreference.onBindViewHolder(mViewHolder);
assertThat(mWidgetFrame.getVisibility()).isEqualTo(View.GONE);
final AddPreference.OnAddClickListener listener = mock(
AddPreference.OnAddClickListener.class);
mPreference.setOnAddClickListener(listener);
assertThat(mWidgetFrame.getVisibility()).isEqualTo(View.VISIBLE);
mPreference.onClick(mAddWidget);
verify(listener).onAddClick(eq(mPreference));
}
}