Loading src/com/android/settings/network/ProviderModelSlice.java +0 −25 Original line number Diff line number Diff line Loading @@ -147,31 +147,6 @@ public class ProviderModelSlice extends WifiSlice { listBuilder.addRow(getWifiSliceItemRow(item)); } } // Fifth section: If device has connection problem, this row show the message for user. // 1) show non_carrier_network_unavailable: // - while no wifi item // 2) show all_network_unavailable: // - while no wifi item + no carrier // - while no wifi item + no data capability if (worker == null || wifiList == null || wifiList.size() == 0) { log("no wifi item"); int resId = R.string.non_carrier_network_unavailable; if (!hasCarrier || !mHelper.isDataSimActive()) { log("No carrier item or no carrier data."); resId = R.string.all_network_unavailable; } if (!hasCarrier && !hasEthernet) { // If there is no item in ProviderModelItem, slice needs a header. listBuilder.setHeader(mHelper.createHeader( NetworkProviderSettings.ACTION_NETWORK_PROVIDER_SETTINGS)); } listBuilder.addGridRow( mHelper.createMessageGridRow(resId, NetworkProviderSettings.ACTION_NETWORK_PROVIDER_SETTINGS)); } return listBuilder.build(); } Loading src/com/android/settings/network/ProviderModelSliceHelper.java +10 −22 Original line number Diff line number Diff line Loading @@ -36,7 +36,6 @@ import android.util.Log; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.core.graphics.drawable.IconCompat; import androidx.slice.builders.GridRowBuilder; import androidx.slice.builders.ListBuilder; import androidx.slice.builders.SliceAction; Loading Loading @@ -79,12 +78,6 @@ public class ProviderModelSliceHelper { Log.d(TAG, s); } protected ListBuilder.HeaderBuilder createHeader(String intentAction) { return new ListBuilder.HeaderBuilder() .setTitle(mContext.getText(R.string.summary_placeholder)) .setPrimaryAction(getPrimarySliceAction(intentAction)); } protected ListBuilder createListBuilder(Uri uri) { final ListBuilder builder = new ListBuilder(mContext, uri, ListBuilder.INFINITY) .setAccentColor(-1) Loading @@ -92,14 +85,6 @@ public class ProviderModelSliceHelper { return builder; } protected GridRowBuilder createMessageGridRow(int messageResId, String intentAction) { final CharSequence title = mContext.getText(messageResId); return new GridRowBuilder() // Add cells to the grid row. .addCell(new GridRowBuilder.CellBuilder().addTitleText(title)) .setPrimaryAction(getPrimarySliceAction(intentAction)); } @Nullable protected WifiSliceItem getConnectedWifiItem(List<WifiSliceItem> wifiList) { if (wifiList == null) { Loading @@ -111,7 +96,10 @@ public class ProviderModelSliceHelper { return item.isPresent() ? item.get() : null; } protected boolean hasCarrier() { /** * @return whether there is the carrier item in the slice. */ public boolean hasCarrier() { if (isAirplaneModeEnabled() || mSubscriptionManager == null || mTelephonyManager == null || mSubscriptionManager.getDefaultDataSubscriptionId() Loading Loading @@ -175,7 +163,12 @@ public class ProviderModelSliceHelper { return mTelephonyManager.isDataEnabled(); } protected boolean isDataSimActive() { /** * To check the carrier data status. * * @return whether the carrier data is active. */ public boolean isDataSimActive() { return isNoCarrierData() ? false : MobileNetworkUtils.activeNetworkIsCellular(mContext); } Loading @@ -193,11 +186,6 @@ public class ProviderModelSliceHelper { return mobileDataOnAndNoData || mobileDataOffAndOutOfService; } private boolean isAirplaneSafeNetworksModeEnabled() { // TODO: isAirplaneSafeNetworksModeEnabled is not READY return false; } @VisibleForTesting Drawable getMobileDrawable(Drawable drawable) throws Throwable { // set color and drawable Loading src/com/android/settings/panel/InternetConnectivityPanel.java +164 −13 Original line number Diff line number Diff line Loading @@ -22,10 +22,23 @@ import static androidx.lifecycle.Lifecycle.Event.ON_RESUME; import static com.android.settings.network.NetworkProviderSettings.ACTION_NETWORK_PROVIDER_SETTINGS; import android.app.settings.SettingsEnums; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.Uri; import android.net.wifi.ScanResult; import android.net.wifi.WifiManager; import android.os.Handler; import android.os.HandlerExecutor; import android.os.Looper; import android.provider.Settings; import android.telephony.ServiceState; import android.telephony.SubscriptionManager; import android.telephony.TelephonyCallback; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.Log; import androidx.annotation.VisibleForTesting; import androidx.lifecycle.LifecycleObserver; Loading @@ -35,6 +48,9 @@ import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.network.AirplaneModePreferenceController; import com.android.settings.network.InternetUpdater; import com.android.settings.network.ProviderModelSliceHelper; import com.android.settings.network.SubscriptionsChangeListener; import com.android.settings.network.telephony.DataConnectivityListener; import com.android.settings.slices.CustomSliceRegistry; import java.util.ArrayList; Loading @@ -44,23 +60,69 @@ import java.util.List; * Represents the Internet Connectivity Panel. */ public class InternetConnectivityPanel implements PanelContent, LifecycleObserver, InternetUpdater.InternetChangeListener { InternetUpdater.InternetChangeListener, DataConnectivityListener.Client, SubscriptionsChangeListener.SubscriptionsChangeListenerClient { private static final String TAG = "InternetConnectivityPanel"; private static final int SUBTITLE_TEXT_NONE = -1; private static final int SUBTITLE_TEXT_WIFI_IS_TURNED_ON = R.string.wifi_is_turned_on_subtitle; private static final int SUBTITLE_TEXT_NON_CARRIER_NETWORK_UNAVAILABLE = R.string.non_carrier_network_unavailable; private static final int SUBTITLE_TEXT_ALL_CARRIER_NETWORK_UNAVAILABLE = R.string.all_network_unavailable; private final Context mContext; private final WifiManager mWifiManager; private final IntentFilter mWifiStateFilter; private final NetworkProviderTelephonyCallback mTelephonyCallback; private final BroadcastReceiver mWifiStateReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent == null) { return; } if (TextUtils.equals(intent.getAction(), WifiManager.NETWORK_STATE_CHANGED_ACTION) || TextUtils.equals(intent.getAction(), WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { updatePanelTitle(); } } }; @VisibleForTesting boolean mIsProviderModelEnabled; private PanelContentCallback mCallback; @VisibleForTesting InternetUpdater mInternetUpdater; @VisibleForTesting ProviderModelSliceHelper mProviderModelSliceHelper; public static InternetConnectivityPanel create(Context context) { return new InternetConnectivityPanel(context); } private int mSubtitle = SUBTITLE_TEXT_NONE; private PanelContentCallback mCallback; private TelephonyManager mTelephonyManager; private SubscriptionsChangeListener mSubscriptionsListener; private DataConnectivityListener mConnectivityListener; private int mDefaultDataSubid = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private InternetConnectivityPanel(Context context) { mContext = context.getApplicationContext(); mIsProviderModelEnabled = Utils.isProviderModelEnabled(mContext); mInternetUpdater = new InternetUpdater(context, null /* Lifecycle */, this); mSubscriptionsListener = new SubscriptionsChangeListener(context, this); mConnectivityListener = new DataConnectivityListener(context, this); mTelephonyCallback = new NetworkProviderTelephonyCallback(); mDefaultDataSubid = getDefaultDataSubscriptionId(); mTelephonyManager = mContext.getSystemService(TelephonyManager.class); mWifiManager = mContext.getSystemService(WifiManager.class); mWifiStateFilter = new IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION); mWifiStateFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); mProviderModelSliceHelper = new ProviderModelSliceHelper(mContext, null); } /** create the panel */ public static InternetConnectivityPanel create(Context context) { return new InternetConnectivityPanel(context); } /** @OnLifecycleEvent(ON_RESUME) */ Loading @@ -70,6 +132,12 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve return; } mInternetUpdater.onResume(); mSubscriptionsListener.start(); mConnectivityListener.start(); mTelephonyManager.registerTelephonyCallback( new HandlerExecutor(new Handler(Looper.getMainLooper())), mTelephonyCallback); mContext.registerReceiver(mWifiStateReceiver, mWifiStateFilter); updatePanelTitle(); } /** @OnLifecycleEvent(ON_PAUSE) */ Loading @@ -79,6 +147,10 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve return; } mInternetUpdater.onPause(); mSubscriptionsListener.stop(); mConnectivityListener.stop(); mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback); mContext.unregisterReceiver(mWifiStateReceiver); } /** Loading @@ -98,9 +170,8 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve */ @Override public CharSequence getSubTitle() { if (mIsProviderModelEnabled && mInternetUpdater.isAirplaneModeOn() && mInternetUpdater.isWifiEnabled()) { return mContext.getText(R.string.wifi_is_turned_on_subtitle); if (mIsProviderModelEnabled && mSubtitle != SUBTITLE_TEXT_NONE) { return mContext.getText(mSubtitle); } return null; } Loading Loading @@ -170,15 +241,36 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve updatePanelTitle(); } private void updatePanelTitle() { @Override public void onSubscriptionsChanged() { final int defaultDataSubId = getDefaultDataSubscriptionId(); log("onSubscriptionsChanged: defaultDataSubId:" + defaultDataSubId); if (mDefaultDataSubid == defaultDataSubId) { return; } if (SubscriptionManager.isUsableSubscriptionId(defaultDataSubId)) { mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback); mTelephonyManager.registerTelephonyCallback( new HandlerExecutor(new Handler(Looper.getMainLooper())), mTelephonyCallback); } updatePanelTitle(); } @Override public void onDataConnectivityChange() { log("onDataConnectivityChange"); updatePanelTitle(); } @VisibleForTesting void updatePanelTitle() { if (mCallback == null) { return; } updateSubtitleText(); if (mInternetUpdater.isAirplaneModeOn() && mInternetUpdater.isWifiEnabled()) { // When the airplane mode is on and Wi-Fi is enabled. // Title: Airplane mode // Sub-Title: Wi-Fi is turned on log("Subtitle:" + mSubtitle); if (mSubtitle != SUBTITLE_TEXT_NONE) { mCallback.onHeaderChanged(); } else { // Other situations. Loading @@ -187,4 +279,63 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve } mCallback.onCustomizedButtonStateChanged(); } @VisibleForTesting int getDefaultDataSubscriptionId() { return SubscriptionManager.getDefaultDataSubscriptionId(); } private void updateSubtitleText() { mSubtitle = SUBTITLE_TEXT_NONE; if (!mInternetUpdater.isWifiEnabled()) { return; } if (mInternetUpdater.isAirplaneModeOn()) { // When the airplane mode is on and Wi-Fi is enabled. // Title: Airplane mode // Sub-Title: Wi-Fi is turned on log("Airplane mode is on + Wi-Fi on."); mSubtitle = SUBTITLE_TEXT_WIFI_IS_TURNED_ON; return; } final List<ScanResult> wifiList = mWifiManager.getScanResults(); if (wifiList != null && wifiList.size() == 0) { // Sub-Title: // show non_carrier_network_unavailable // - while Wi-Fi on + no Wi-Fi item // show all_network_unavailable: // - while Wi-Fi on + no Wi-Fi item + no carrier // - while Wi-Fi on + no Wi-Fi item + no data capability log("No Wi-Fi item."); mSubtitle = SUBTITLE_TEXT_NON_CARRIER_NETWORK_UNAVAILABLE; if (!mProviderModelSliceHelper.hasCarrier() || !mProviderModelSliceHelper.isDataSimActive()) { log("No carrier item or no carrier data."); mSubtitle = SUBTITLE_TEXT_ALL_CARRIER_NETWORK_UNAVAILABLE; } } } private class NetworkProviderTelephonyCallback extends TelephonyCallback implements TelephonyCallback.DataConnectionStateListener, TelephonyCallback.ServiceStateListener { @Override public void onServiceStateChanged(ServiceState state) { log("onServiceStateChanged voiceState=" + state.getState() + " dataState=" + state.getDataRegistrationState()); updatePanelTitle(); } @Override public void onDataConnectionStateChanged(int state, int networkType) { log("onDataConnectionStateChanged: networkType=" + networkType + " state=" + state); updatePanelTitle(); } } private static void log(String s) { Log.d(TAG, s); } } tests/unit/src/com/android/settings/network/ProviderModelSliceHelperTest.java +0 −17 Original line number Diff line number Diff line Loading @@ -34,7 +34,6 @@ import android.net.Network; import android.net.NetworkCapabilities; import android.net.Uri; import android.os.PersistableBundle; import android.provider.Settings; import android.telephony.CarrierConfigManager; import android.telephony.ServiceState; import android.telephony.SubscriptionInfo; Loading @@ -43,8 +42,6 @@ import android.telephony.TelephonyManager; import android.text.Html; import androidx.slice.Slice; import androidx.slice.builders.GridRowBuilder; import androidx.slice.builders.GridRowBuilder.CellBuilder; import androidx.slice.builders.ListBuilder; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; Loading Loading @@ -114,20 +111,6 @@ public class ProviderModelSliceHelperTest { mProviderModelSliceHelper = new MockProviderModelSliceHelper(mContext, testCustomSliceable); } @Test public void createMessageGridRow_inputTheResourceId_verifyTitle() { int messageResId = ResourcesUtils.getResourcesId(mContext, "string", "non_carrier_network_unavailable"); CharSequence title = ResourcesUtils.getResourcesString(mContext, "non_carrier_network_unavailable"); GridRowBuilder testGridRow = mProviderModelSliceHelper.createMessageGridRow(messageResId, Settings.ACTION_AIRPLANE_MODE_SETTINGS); List<CellBuilder> cellItem = testGridRow.getCells(); assertThat(cellItem.get(0).getTitle()).isEqualTo(title); } @Test public void getConnectedWifiItem_inputListInvolveOneConnectedWifiItem_verifyReturnItem() { when(mWifiSliceItem1.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_CONNECTED); Loading tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java +2 −53 Original line number Diff line number Diff line Loading @@ -22,7 +22,6 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; Loading @@ -42,7 +41,6 @@ import android.telephony.TelephonyManager; import androidx.slice.Slice; import androidx.slice.SliceProvider; import androidx.slice.builders.GridRowBuilder; import androidx.slice.builders.ListBuilder; import androidx.slice.builders.SliceAction; import androidx.slice.widget.SliceLiveData; Loading Loading @@ -97,12 +95,6 @@ public class ProviderModelSliceTest { private WifiSliceItem mMockWifiSliceItem3; @Mock ListBuilder.RowBuilder mMockCarrierRowBuild; @Mock ListBuilder.HeaderBuilder mMockHeader; @Mock GridRowBuilder mMockGridRowBuilderNonCarrierNetworkUnavailable; @Mock GridRowBuilder mMockGridRowBuilderAllNetworkUnavailable; private FakeFeatureFactory mFeatureFactory; @Mock Loading Loading @@ -147,35 +139,7 @@ public class ProviderModelSliceTest { @Test @UiThreadTest public void getSlice_noWorkerAndNoCarrier_getOneHeaderOneGridRowWithAllNetworkUnavailable() { mWifiList.clear(); mMockProviderModelSlice = new MockProviderModelSlice(mContext, null); mockHelperCondition(false, false, false, null); final Slice slice = mMockProviderModelSlice.getSlice(); assertThat(slice).isNotNull(); verify(mListBuilder, times(1)).setHeader(mMockHeader); verify(mListBuilder, times(1)).addGridRow(mMockGridRowBuilderAllNetworkUnavailable); } @Test @UiThreadTest public void getSlice_noWifiAndNoCarrier_getOneHeaderOneGridRowWithAllNetworkUnavailable() { mWifiList.clear(); mMockNetworkProviderWorker.updateSelfResults(null); mockHelperCondition(false, false, false, null); final Slice slice = mMockProviderModelSlice.getSlice(); assertThat(slice).isNotNull(); verify(mListBuilder, times(1)).setHeader(mMockHeader); verify(mListBuilder, times(1)).addGridRow(mMockGridRowBuilderAllNetworkUnavailable); } @Test @UiThreadTest public void getSlice_noWifiAndHasCarrierNoData_oneCarrierOneGridRowWithAllNetworkUnavailable() { public void getSlice_noWifiAndHasCarrierNoData_oneCarrier() { mWifiList.clear(); mMockNetworkProviderWorker.updateSelfResults(null); mockHelperCondition(false, true, false, null); Loading @@ -184,12 +148,11 @@ public class ProviderModelSliceTest { assertThat(slice).isNotNull(); verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild); verify(mListBuilder, times(1)).addGridRow(mMockGridRowBuilderAllNetworkUnavailable); } @Test @UiThreadTest public void getSlice_noWifiAndNoCarrier_oneCarrierOneGridRowWithNonCarrierNetworkUnavailable() { public void getSlice_noWifiAndNoCarrier_oneCarrier() { mWifiList.clear(); mMockProviderModelSlice = new MockProviderModelSlice(mContext, null); mockHelperCondition(false, true, true, null); Loading @@ -198,7 +161,6 @@ public class ProviderModelSliceTest { assertThat(slice).isNotNull(); verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild); verify(mListBuilder, times(1)).addGridRow(mMockGridRowBuilderNonCarrierNetworkUnavailable); } @Test Loading Loading @@ -331,19 +293,6 @@ public class ProviderModelSliceTest { private void mockBuilder() { SliceAction mockSliceAction = getPrimarySliceAction(); when(mMockHeader.getTitle()).thenReturn("mockHeader"); when(mMockHeader.getPrimaryAction()).thenReturn(mockSliceAction); when(mProviderModelSliceHelper.createHeader(anyString())).thenReturn(mMockHeader); int resId = ResourcesUtils.getResourcesId(mContext, "string", "non_carrier_network_unavailable"); when(mProviderModelSliceHelper.createMessageGridRow(eq(resId), anyString())).thenReturn( mMockGridRowBuilderNonCarrierNetworkUnavailable); resId = ResourcesUtils.getResourcesId(mContext, "string", "all_network_unavailable"); when(mProviderModelSliceHelper.createMessageGridRow(eq(resId), anyString())).thenReturn( mMockGridRowBuilderAllNetworkUnavailable); when(mMockCarrierRowBuild.getTitle()).thenReturn("mockRow"); when(mMockCarrierRowBuild.getPrimaryAction()).thenReturn(mockSliceAction); when(mProviderModelSliceHelper.createCarrierRow(anyString())).thenReturn( Loading Loading
src/com/android/settings/network/ProviderModelSlice.java +0 −25 Original line number Diff line number Diff line Loading @@ -147,31 +147,6 @@ public class ProviderModelSlice extends WifiSlice { listBuilder.addRow(getWifiSliceItemRow(item)); } } // Fifth section: If device has connection problem, this row show the message for user. // 1) show non_carrier_network_unavailable: // - while no wifi item // 2) show all_network_unavailable: // - while no wifi item + no carrier // - while no wifi item + no data capability if (worker == null || wifiList == null || wifiList.size() == 0) { log("no wifi item"); int resId = R.string.non_carrier_network_unavailable; if (!hasCarrier || !mHelper.isDataSimActive()) { log("No carrier item or no carrier data."); resId = R.string.all_network_unavailable; } if (!hasCarrier && !hasEthernet) { // If there is no item in ProviderModelItem, slice needs a header. listBuilder.setHeader(mHelper.createHeader( NetworkProviderSettings.ACTION_NETWORK_PROVIDER_SETTINGS)); } listBuilder.addGridRow( mHelper.createMessageGridRow(resId, NetworkProviderSettings.ACTION_NETWORK_PROVIDER_SETTINGS)); } return listBuilder.build(); } Loading
src/com/android/settings/network/ProviderModelSliceHelper.java +10 −22 Original line number Diff line number Diff line Loading @@ -36,7 +36,6 @@ import android.util.Log; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import androidx.core.graphics.drawable.IconCompat; import androidx.slice.builders.GridRowBuilder; import androidx.slice.builders.ListBuilder; import androidx.slice.builders.SliceAction; Loading Loading @@ -79,12 +78,6 @@ public class ProviderModelSliceHelper { Log.d(TAG, s); } protected ListBuilder.HeaderBuilder createHeader(String intentAction) { return new ListBuilder.HeaderBuilder() .setTitle(mContext.getText(R.string.summary_placeholder)) .setPrimaryAction(getPrimarySliceAction(intentAction)); } protected ListBuilder createListBuilder(Uri uri) { final ListBuilder builder = new ListBuilder(mContext, uri, ListBuilder.INFINITY) .setAccentColor(-1) Loading @@ -92,14 +85,6 @@ public class ProviderModelSliceHelper { return builder; } protected GridRowBuilder createMessageGridRow(int messageResId, String intentAction) { final CharSequence title = mContext.getText(messageResId); return new GridRowBuilder() // Add cells to the grid row. .addCell(new GridRowBuilder.CellBuilder().addTitleText(title)) .setPrimaryAction(getPrimarySliceAction(intentAction)); } @Nullable protected WifiSliceItem getConnectedWifiItem(List<WifiSliceItem> wifiList) { if (wifiList == null) { Loading @@ -111,7 +96,10 @@ public class ProviderModelSliceHelper { return item.isPresent() ? item.get() : null; } protected boolean hasCarrier() { /** * @return whether there is the carrier item in the slice. */ public boolean hasCarrier() { if (isAirplaneModeEnabled() || mSubscriptionManager == null || mTelephonyManager == null || mSubscriptionManager.getDefaultDataSubscriptionId() Loading Loading @@ -175,7 +163,12 @@ public class ProviderModelSliceHelper { return mTelephonyManager.isDataEnabled(); } protected boolean isDataSimActive() { /** * To check the carrier data status. * * @return whether the carrier data is active. */ public boolean isDataSimActive() { return isNoCarrierData() ? false : MobileNetworkUtils.activeNetworkIsCellular(mContext); } Loading @@ -193,11 +186,6 @@ public class ProviderModelSliceHelper { return mobileDataOnAndNoData || mobileDataOffAndOutOfService; } private boolean isAirplaneSafeNetworksModeEnabled() { // TODO: isAirplaneSafeNetworksModeEnabled is not READY return false; } @VisibleForTesting Drawable getMobileDrawable(Drawable drawable) throws Throwable { // set color and drawable Loading
src/com/android/settings/panel/InternetConnectivityPanel.java +164 −13 Original line number Diff line number Diff line Loading @@ -22,10 +22,23 @@ import static androidx.lifecycle.Lifecycle.Event.ON_RESUME; import static com.android.settings.network.NetworkProviderSettings.ACTION_NETWORK_PROVIDER_SETTINGS; import android.app.settings.SettingsEnums; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.Uri; import android.net.wifi.ScanResult; import android.net.wifi.WifiManager; import android.os.Handler; import android.os.HandlerExecutor; import android.os.Looper; import android.provider.Settings; import android.telephony.ServiceState; import android.telephony.SubscriptionManager; import android.telephony.TelephonyCallback; import android.telephony.TelephonyManager; import android.text.TextUtils; import android.util.Log; import androidx.annotation.VisibleForTesting; import androidx.lifecycle.LifecycleObserver; Loading @@ -35,6 +48,9 @@ import com.android.settings.R; import com.android.settings.Utils; import com.android.settings.network.AirplaneModePreferenceController; import com.android.settings.network.InternetUpdater; import com.android.settings.network.ProviderModelSliceHelper; import com.android.settings.network.SubscriptionsChangeListener; import com.android.settings.network.telephony.DataConnectivityListener; import com.android.settings.slices.CustomSliceRegistry; import java.util.ArrayList; Loading @@ -44,23 +60,69 @@ import java.util.List; * Represents the Internet Connectivity Panel. */ public class InternetConnectivityPanel implements PanelContent, LifecycleObserver, InternetUpdater.InternetChangeListener { InternetUpdater.InternetChangeListener, DataConnectivityListener.Client, SubscriptionsChangeListener.SubscriptionsChangeListenerClient { private static final String TAG = "InternetConnectivityPanel"; private static final int SUBTITLE_TEXT_NONE = -1; private static final int SUBTITLE_TEXT_WIFI_IS_TURNED_ON = R.string.wifi_is_turned_on_subtitle; private static final int SUBTITLE_TEXT_NON_CARRIER_NETWORK_UNAVAILABLE = R.string.non_carrier_network_unavailable; private static final int SUBTITLE_TEXT_ALL_CARRIER_NETWORK_UNAVAILABLE = R.string.all_network_unavailable; private final Context mContext; private final WifiManager mWifiManager; private final IntentFilter mWifiStateFilter; private final NetworkProviderTelephonyCallback mTelephonyCallback; private final BroadcastReceiver mWifiStateReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent == null) { return; } if (TextUtils.equals(intent.getAction(), WifiManager.NETWORK_STATE_CHANGED_ACTION) || TextUtils.equals(intent.getAction(), WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { updatePanelTitle(); } } }; @VisibleForTesting boolean mIsProviderModelEnabled; private PanelContentCallback mCallback; @VisibleForTesting InternetUpdater mInternetUpdater; @VisibleForTesting ProviderModelSliceHelper mProviderModelSliceHelper; public static InternetConnectivityPanel create(Context context) { return new InternetConnectivityPanel(context); } private int mSubtitle = SUBTITLE_TEXT_NONE; private PanelContentCallback mCallback; private TelephonyManager mTelephonyManager; private SubscriptionsChangeListener mSubscriptionsListener; private DataConnectivityListener mConnectivityListener; private int mDefaultDataSubid = SubscriptionManager.INVALID_SUBSCRIPTION_ID; private InternetConnectivityPanel(Context context) { mContext = context.getApplicationContext(); mIsProviderModelEnabled = Utils.isProviderModelEnabled(mContext); mInternetUpdater = new InternetUpdater(context, null /* Lifecycle */, this); mSubscriptionsListener = new SubscriptionsChangeListener(context, this); mConnectivityListener = new DataConnectivityListener(context, this); mTelephonyCallback = new NetworkProviderTelephonyCallback(); mDefaultDataSubid = getDefaultDataSubscriptionId(); mTelephonyManager = mContext.getSystemService(TelephonyManager.class); mWifiManager = mContext.getSystemService(WifiManager.class); mWifiStateFilter = new IntentFilter(WifiManager.NETWORK_STATE_CHANGED_ACTION); mWifiStateFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); mProviderModelSliceHelper = new ProviderModelSliceHelper(mContext, null); } /** create the panel */ public static InternetConnectivityPanel create(Context context) { return new InternetConnectivityPanel(context); } /** @OnLifecycleEvent(ON_RESUME) */ Loading @@ -70,6 +132,12 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve return; } mInternetUpdater.onResume(); mSubscriptionsListener.start(); mConnectivityListener.start(); mTelephonyManager.registerTelephonyCallback( new HandlerExecutor(new Handler(Looper.getMainLooper())), mTelephonyCallback); mContext.registerReceiver(mWifiStateReceiver, mWifiStateFilter); updatePanelTitle(); } /** @OnLifecycleEvent(ON_PAUSE) */ Loading @@ -79,6 +147,10 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve return; } mInternetUpdater.onPause(); mSubscriptionsListener.stop(); mConnectivityListener.stop(); mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback); mContext.unregisterReceiver(mWifiStateReceiver); } /** Loading @@ -98,9 +170,8 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve */ @Override public CharSequence getSubTitle() { if (mIsProviderModelEnabled && mInternetUpdater.isAirplaneModeOn() && mInternetUpdater.isWifiEnabled()) { return mContext.getText(R.string.wifi_is_turned_on_subtitle); if (mIsProviderModelEnabled && mSubtitle != SUBTITLE_TEXT_NONE) { return mContext.getText(mSubtitle); } return null; } Loading Loading @@ -170,15 +241,36 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve updatePanelTitle(); } private void updatePanelTitle() { @Override public void onSubscriptionsChanged() { final int defaultDataSubId = getDefaultDataSubscriptionId(); log("onSubscriptionsChanged: defaultDataSubId:" + defaultDataSubId); if (mDefaultDataSubid == defaultDataSubId) { return; } if (SubscriptionManager.isUsableSubscriptionId(defaultDataSubId)) { mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback); mTelephonyManager.registerTelephonyCallback( new HandlerExecutor(new Handler(Looper.getMainLooper())), mTelephonyCallback); } updatePanelTitle(); } @Override public void onDataConnectivityChange() { log("onDataConnectivityChange"); updatePanelTitle(); } @VisibleForTesting void updatePanelTitle() { if (mCallback == null) { return; } updateSubtitleText(); if (mInternetUpdater.isAirplaneModeOn() && mInternetUpdater.isWifiEnabled()) { // When the airplane mode is on and Wi-Fi is enabled. // Title: Airplane mode // Sub-Title: Wi-Fi is turned on log("Subtitle:" + mSubtitle); if (mSubtitle != SUBTITLE_TEXT_NONE) { mCallback.onHeaderChanged(); } else { // Other situations. Loading @@ -187,4 +279,63 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve } mCallback.onCustomizedButtonStateChanged(); } @VisibleForTesting int getDefaultDataSubscriptionId() { return SubscriptionManager.getDefaultDataSubscriptionId(); } private void updateSubtitleText() { mSubtitle = SUBTITLE_TEXT_NONE; if (!mInternetUpdater.isWifiEnabled()) { return; } if (mInternetUpdater.isAirplaneModeOn()) { // When the airplane mode is on and Wi-Fi is enabled. // Title: Airplane mode // Sub-Title: Wi-Fi is turned on log("Airplane mode is on + Wi-Fi on."); mSubtitle = SUBTITLE_TEXT_WIFI_IS_TURNED_ON; return; } final List<ScanResult> wifiList = mWifiManager.getScanResults(); if (wifiList != null && wifiList.size() == 0) { // Sub-Title: // show non_carrier_network_unavailable // - while Wi-Fi on + no Wi-Fi item // show all_network_unavailable: // - while Wi-Fi on + no Wi-Fi item + no carrier // - while Wi-Fi on + no Wi-Fi item + no data capability log("No Wi-Fi item."); mSubtitle = SUBTITLE_TEXT_NON_CARRIER_NETWORK_UNAVAILABLE; if (!mProviderModelSliceHelper.hasCarrier() || !mProviderModelSliceHelper.isDataSimActive()) { log("No carrier item or no carrier data."); mSubtitle = SUBTITLE_TEXT_ALL_CARRIER_NETWORK_UNAVAILABLE; } } } private class NetworkProviderTelephonyCallback extends TelephonyCallback implements TelephonyCallback.DataConnectionStateListener, TelephonyCallback.ServiceStateListener { @Override public void onServiceStateChanged(ServiceState state) { log("onServiceStateChanged voiceState=" + state.getState() + " dataState=" + state.getDataRegistrationState()); updatePanelTitle(); } @Override public void onDataConnectionStateChanged(int state, int networkType) { log("onDataConnectionStateChanged: networkType=" + networkType + " state=" + state); updatePanelTitle(); } } private static void log(String s) { Log.d(TAG, s); } }
tests/unit/src/com/android/settings/network/ProviderModelSliceHelperTest.java +0 −17 Original line number Diff line number Diff line Loading @@ -34,7 +34,6 @@ import android.net.Network; import android.net.NetworkCapabilities; import android.net.Uri; import android.os.PersistableBundle; import android.provider.Settings; import android.telephony.CarrierConfigManager; import android.telephony.ServiceState; import android.telephony.SubscriptionInfo; Loading @@ -43,8 +42,6 @@ import android.telephony.TelephonyManager; import android.text.Html; import androidx.slice.Slice; import androidx.slice.builders.GridRowBuilder; import androidx.slice.builders.GridRowBuilder.CellBuilder; import androidx.slice.builders.ListBuilder; import androidx.test.core.app.ApplicationProvider; import androidx.test.ext.junit.runners.AndroidJUnit4; Loading Loading @@ -114,20 +111,6 @@ public class ProviderModelSliceHelperTest { mProviderModelSliceHelper = new MockProviderModelSliceHelper(mContext, testCustomSliceable); } @Test public void createMessageGridRow_inputTheResourceId_verifyTitle() { int messageResId = ResourcesUtils.getResourcesId(mContext, "string", "non_carrier_network_unavailable"); CharSequence title = ResourcesUtils.getResourcesString(mContext, "non_carrier_network_unavailable"); GridRowBuilder testGridRow = mProviderModelSliceHelper.createMessageGridRow(messageResId, Settings.ACTION_AIRPLANE_MODE_SETTINGS); List<CellBuilder> cellItem = testGridRow.getCells(); assertThat(cellItem.get(0).getTitle()).isEqualTo(title); } @Test public void getConnectedWifiItem_inputListInvolveOneConnectedWifiItem_verifyReturnItem() { when(mWifiSliceItem1.getConnectedState()).thenReturn(WifiEntry.CONNECTED_STATE_CONNECTED); Loading
tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java +2 −53 Original line number Diff line number Diff line Loading @@ -22,7 +22,6 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; Loading @@ -42,7 +41,6 @@ import android.telephony.TelephonyManager; import androidx.slice.Slice; import androidx.slice.SliceProvider; import androidx.slice.builders.GridRowBuilder; import androidx.slice.builders.ListBuilder; import androidx.slice.builders.SliceAction; import androidx.slice.widget.SliceLiveData; Loading Loading @@ -97,12 +95,6 @@ public class ProviderModelSliceTest { private WifiSliceItem mMockWifiSliceItem3; @Mock ListBuilder.RowBuilder mMockCarrierRowBuild; @Mock ListBuilder.HeaderBuilder mMockHeader; @Mock GridRowBuilder mMockGridRowBuilderNonCarrierNetworkUnavailable; @Mock GridRowBuilder mMockGridRowBuilderAllNetworkUnavailable; private FakeFeatureFactory mFeatureFactory; @Mock Loading Loading @@ -147,35 +139,7 @@ public class ProviderModelSliceTest { @Test @UiThreadTest public void getSlice_noWorkerAndNoCarrier_getOneHeaderOneGridRowWithAllNetworkUnavailable() { mWifiList.clear(); mMockProviderModelSlice = new MockProviderModelSlice(mContext, null); mockHelperCondition(false, false, false, null); final Slice slice = mMockProviderModelSlice.getSlice(); assertThat(slice).isNotNull(); verify(mListBuilder, times(1)).setHeader(mMockHeader); verify(mListBuilder, times(1)).addGridRow(mMockGridRowBuilderAllNetworkUnavailable); } @Test @UiThreadTest public void getSlice_noWifiAndNoCarrier_getOneHeaderOneGridRowWithAllNetworkUnavailable() { mWifiList.clear(); mMockNetworkProviderWorker.updateSelfResults(null); mockHelperCondition(false, false, false, null); final Slice slice = mMockProviderModelSlice.getSlice(); assertThat(slice).isNotNull(); verify(mListBuilder, times(1)).setHeader(mMockHeader); verify(mListBuilder, times(1)).addGridRow(mMockGridRowBuilderAllNetworkUnavailable); } @Test @UiThreadTest public void getSlice_noWifiAndHasCarrierNoData_oneCarrierOneGridRowWithAllNetworkUnavailable() { public void getSlice_noWifiAndHasCarrierNoData_oneCarrier() { mWifiList.clear(); mMockNetworkProviderWorker.updateSelfResults(null); mockHelperCondition(false, true, false, null); Loading @@ -184,12 +148,11 @@ public class ProviderModelSliceTest { assertThat(slice).isNotNull(); verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild); verify(mListBuilder, times(1)).addGridRow(mMockGridRowBuilderAllNetworkUnavailable); } @Test @UiThreadTest public void getSlice_noWifiAndNoCarrier_oneCarrierOneGridRowWithNonCarrierNetworkUnavailable() { public void getSlice_noWifiAndNoCarrier_oneCarrier() { mWifiList.clear(); mMockProviderModelSlice = new MockProviderModelSlice(mContext, null); mockHelperCondition(false, true, true, null); Loading @@ -198,7 +161,6 @@ public class ProviderModelSliceTest { assertThat(slice).isNotNull(); verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild); verify(mListBuilder, times(1)).addGridRow(mMockGridRowBuilderNonCarrierNetworkUnavailable); } @Test Loading Loading @@ -331,19 +293,6 @@ public class ProviderModelSliceTest { private void mockBuilder() { SliceAction mockSliceAction = getPrimarySliceAction(); when(mMockHeader.getTitle()).thenReturn("mockHeader"); when(mMockHeader.getPrimaryAction()).thenReturn(mockSliceAction); when(mProviderModelSliceHelper.createHeader(anyString())).thenReturn(mMockHeader); int resId = ResourcesUtils.getResourcesId(mContext, "string", "non_carrier_network_unavailable"); when(mProviderModelSliceHelper.createMessageGridRow(eq(resId), anyString())).thenReturn( mMockGridRowBuilderNonCarrierNetworkUnavailable); resId = ResourcesUtils.getResourcesId(mContext, "string", "all_network_unavailable"); when(mProviderModelSliceHelper.createMessageGridRow(eq(resId), anyString())).thenReturn( mMockGridRowBuilderAllNetworkUnavailable); when(mMockCarrierRowBuild.getTitle()).thenReturn("mockRow"); when(mMockCarrierRowBuild.getPrimaryAction()).thenReturn(mockSliceAction); when(mProviderModelSliceHelper.createCarrierRow(anyString())).thenReturn( Loading