Loading src/com/android/settings/network/ProviderModelSlice.java +68 −74 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ package com.android.settings.network; import static android.app.slice.Slice.EXTRA_TOGGLE_STATE; import static com.android.settings.slices.CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI; import static com.android.settings.slices.CustomSliceRegistry.WIFI_SLICE_URI; import android.annotation.ColorInt; import android.app.PendingIntent; Loading Loading @@ -64,7 +65,6 @@ import java.util.stream.Collectors; public class ProviderModelSlice extends WifiSlice { private static final String TAG = "ProviderModelSlice"; protected static final String ACTION_TITLE_CONNECT_TO_CARRIER = "Connect_To_Carrier"; private final ProviderModelSliceHelper mHelper; Loading @@ -89,49 +89,32 @@ public class ProviderModelSlice extends WifiSlice { @Override public Slice getSlice() { // The provider model slice step: // First section: Add a Wi-Fi item which state is connected. // Second section: Add a carrier item. // Third section: Add the Wi-Fi items which are not connected. // Fourth section: If device has connection problem, this row show the message for user. @InternetUpdater.InternetType int internetType = getInternetType(); // First section: Add the Ethernet item. // Second section: Add the carrier item. // Third section: Add the Wi-Fi toggle item. // Fourth section: Add the connected Wi-Fi item. // Fifth section: Add the Wi-Fi items which are not connected. // Sixth section: Add the See All item. final ListBuilder listBuilder = mHelper.createListBuilder(getUri()); if (mHelper.isAirplaneModeEnabled() && !mWifiManager.isWifiEnabled() && internetType != InternetUpdater.INTERNET_ETHERNET) { log("Airplane mode is enabled."); return listBuilder.build(); } int maxListSize = 0; List<WifiSliceItem> wifiList = null; final NetworkProviderWorker worker = getWorker(); if (worker != null) { // get Wi-Fi list. wifiList = worker.getResults(); maxListSize = worker.getApRowCount(); } else { log("network provider worker is null."); } final boolean hasCarrier = mHelper.hasCarrier(); log("hasCarrier: " + hasCarrier); // First section: Add a Ethernet or Wi-Fi item which state is connected. boolean isConnectedWifiAddedTop = false; final WifiSliceItem connectedWifiItem = mHelper.getConnectedWifiItem(wifiList); if (internetType == InternetUpdater.INTERNET_ETHERNET) { // First section: Add the Ethernet item. if (getInternetType() == InternetUpdater.INTERNET_ETHERNET) { log("get Ethernet item which is connected"); listBuilder.addRow(createEthernetRow()); maxListSize--; } else { if (connectedWifiItem != null && internetType == InternetUpdater.INTERNET_WIFI) { log("get Wi-Fi item which is connected to internet"); listBuilder.addRow(getWifiSliceItemRow(connectedWifiItem)); isConnectedWifiAddedTop = true; maxListSize--; } } // Second section: Add a carrier item. // Second section: Add the carrier item. if (!mHelper.isAirplaneModeEnabled()) { final boolean hasCarrier = mHelper.hasCarrier(); log("hasCarrier: " + hasCarrier); if (hasCarrier) { mHelper.updateTelephony(); listBuilder.addRow( Loading @@ -139,28 +122,44 @@ public class ProviderModelSlice extends WifiSlice { worker != null ? worker.getNetworkTypeDescription() : "")); maxListSize--; } } // Third section: Add the Wi-Fi toggle item. final boolean isWifiEnabled = mWifiManager.isWifiEnabled(); listBuilder.addRow(createWifiToggleRow(mContext, isWifiEnabled)); maxListSize--; if (!isWifiEnabled) { log("Wi-Fi is disabled"); return listBuilder.build(); } List<WifiSliceItem> wifiList = (worker != null) ? worker.getResults() : null; if (wifiList == null || wifiList.size() <= 0) { log("Wi-Fi list is empty"); return listBuilder.build(); } // Third section: Add the connected Wi-Fi item to Wi-Fi list if the Ethernet is connected. if (connectedWifiItem != null && !isConnectedWifiAddedTop) { // Fourth section: Add the connected Wi-Fi item. final WifiSliceItem connectedWifiItem = mHelper.getConnectedWifiItem(wifiList); if (connectedWifiItem != null) { log("get Wi-Fi item which is connected"); listBuilder.addRow(getWifiSliceItemRow(connectedWifiItem)); maxListSize--; } // Fourth section: Add the Wi-Fi items which are not connected. if (wifiList != null && wifiList.size() > 0) { // Fifth section: Add the Wi-Fi items which are not connected. log("get Wi-Fi items which are not connected. Wi-Fi items : " + wifiList.size()); final List<WifiSliceItem> disconnectedWifiList = wifiList.stream() .filter(wifiSliceItem -> wifiSliceItem.getConnectedState() != WifiEntry.CONNECTED_STATE_CONNECTED) .filter(item -> item.getConnectedState() != WifiEntry.CONNECTED_STATE_CONNECTED) .limit(maxListSize - 1) .collect(Collectors.toList()); for (WifiSliceItem item : disconnectedWifiList) { listBuilder.addRow(getWifiSliceItemRow(item)); } // Sixth section: Add the See All item. log("add See-All"); listBuilder.addRow(getSeeAllRow()); } return listBuilder.build(); } Loading Loading @@ -269,6 +268,26 @@ public class ProviderModelSlice extends WifiSlice { .setSubtitle(mContext.getText(R.string.to_switch_networks_disconnect_ethernet)); } /** * @return a {@link ListBuilder.RowBuilder} of the Wi-Fi toggle. */ protected ListBuilder.RowBuilder createWifiToggleRow(Context context, boolean isWifiEnabled) { final Intent intent = new Intent(WIFI_SLICE_URI.toString()) .setData(WIFI_SLICE_URI) .setClass(context, SliceBroadcastReceiver.class) .putExtra(EXTRA_TOGGLE_STATE, !isWifiEnabled) // The FLAG_RECEIVER_FOREGROUND flag is necessary to avoid the intent delay of // the first sending after the device restarts .addFlags(Intent.FLAG_RECEIVER_FOREGROUND); final PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); final SliceAction toggleSliceAction = SliceAction.createToggle(pendingIntent, null /* actionTitle */, isWifiEnabled); return new ListBuilder.RowBuilder() .setTitle(context.getString(R.string.wifi_settings)) .setPrimaryAction(toggleSliceAction); } protected ListBuilder.RowBuilder getSeeAllRow() { final CharSequence title = mContext.getText(R.string.previous_connected_see_all); final IconCompat icon = getSeeAllIcon(); Loading @@ -294,31 +313,6 @@ public class ProviderModelSlice extends WifiSlice { return SliceAction.createDeeplink(intent, icon, ListBuilder.ICON_IMAGE, title); } @Override protected ListBuilder.RowBuilder getWifiSliceItemRow(WifiSliceItem wifiSliceItem) { final CharSequence title = wifiSliceItem.getTitle(); final IconCompat levelIcon = getWifiSliceItemLevelIcon(wifiSliceItem); final ListBuilder.RowBuilder rowBuilder = new ListBuilder.RowBuilder() .setTitleItem(levelIcon, ListBuilder.ICON_IMAGE) .setTitle(title) .setSubtitle(wifiSliceItem.getSummary()) .setContentDescription(wifiSliceItem.getContentDescription()); final IconCompat endIcon; if (wifiSliceItem.hasInternetAccess()) { rowBuilder.setPrimaryAction(SliceAction.create(getBroadcastIntent(mContext), levelIcon, ListBuilder.ICON_IMAGE, ACTION_TITLE_CONNECT_TO_CARRIER)); endIcon = IconCompat.createWithResource(mContext, R.drawable.ic_settings_close); } else { rowBuilder.setPrimaryAction(getWifiEntryAction(wifiSliceItem, levelIcon, title)); endIcon = getEndIcon(wifiSliceItem); } if (endIcon != null) { rowBuilder.addEndItem(endIcon, ListBuilder.ICON_IMAGE); } return rowBuilder; } @Override protected IconCompat getWifiSliceItemLevelIcon(WifiSliceItem wifiSliceItem) { if (wifiSliceItem.getConnectedState() == WifiEntry.CONNECTED_STATE_CONNECTED Loading src/com/android/settings/network/telephony/NetworkProviderWorker.java +1 −1 Original line number Diff line number Diff line Loading @@ -54,7 +54,7 @@ public class NetworkProviderWorker extends WifiScanWorker implements DataConnectivityListener.Client, InternetUpdater.InternetChangeListener, SubscriptionsChangeListener.SubscriptionsChangeListenerClient { private static final String TAG = "NetworkProviderWorker"; private static final int PROVIDER_MODEL_DEFAULT_EXPANDED_ROW_COUNT = 5; private static final int PROVIDER_MODEL_DEFAULT_EXPANDED_ROW_COUNT = 6; private DataContentObserver mMobileDataObserver; private SignalStrengthListener mSignalStrengthListener; private SubscriptionsChangeListener mSubscriptionsListener; Loading src/com/android/settings/panel/InternetConnectivityPanel.java +47 −33 Original line number Diff line number Diff line Loading @@ -38,7 +38,6 @@ import android.text.TextUtils; import android.util.Log; import androidx.annotation.VisibleForTesting; import androidx.fragment.app.FragmentActivity; import androidx.lifecycle.LifecycleObserver; import androidx.lifecycle.OnLifecycleEvent; Loading Loading @@ -84,12 +83,13 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve } if (TextUtils.equals(intent.getAction(), WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { showProgressBar(); updateProgressBar(); updatePanelTitle(); return; } if (TextUtils.equals(intent.getAction(), WifiManager.NETWORK_STATE_CHANGED_ACTION)) { updateProgressBar(); updatePanelTitle(); } } Loading @@ -110,13 +110,40 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve private int mDefaultDataSubid = SubscriptionManager.INVALID_SUBSCRIPTION_ID; // Wi-Fi scanning progress bar protected HandlerInjector mHandlerInjector; protected boolean mIsProgressBarVisible; protected final Runnable mHideProgressBarRunnable = () -> { protected boolean mIsScanningSubTitleShownOnce; protected Runnable mHideProgressBarRunnable = () -> { setProgressBarVisible(false); }; protected Runnable mHideScanningSubTitleRunnable = () -> { mIsScanningSubTitleShownOnce = true; updatePanelTitle(); }; /** * Wrapper for testing compatibility. */ @VisibleForTesting static class HandlerInjector { protected final Handler mHandler; HandlerInjector(Context context) { mHandler = context.getMainThreadHandler(); } public void postDelay(Runnable runnable) { mHandler.postDelayed(runnable, 2000 /* delay millis */); } public void removeCallbacks(Runnable runnable) { mHandler.removeCallbacks(runnable); } } private InternetConnectivityPanel(Context context) { mContext = context.getApplicationContext(); mHandlerInjector = new HandlerInjector(context); mIsProviderModelEnabled = Utils.isProviderModelEnabled(mContext); mInternetUpdater = new InternetUpdater(context, null /* Lifecycle */, this); Loading Loading @@ -150,7 +177,7 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve mTelephonyManager.registerTelephonyCallback( new HandlerExecutor(new Handler(Looper.getMainLooper())), mTelephonyCallback); mContext.registerReceiver(mWifiStateReceiver, mWifiStateFilter); showProgressBar(); updateProgressBar(); updatePanelTitle(); } Loading @@ -165,7 +192,8 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve mConnectivityListener.stop(); mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback); mContext.unregisterReceiver(mWifiStateReceiver); mContext.getMainThreadHandler().removeCallbacks(mHideProgressBarRunnable); mHandlerInjector.removeCallbacks(mHideProgressBarRunnable); mHandlerInjector.removeCallbacks(mHideScanningSubTitleRunnable); } /** Loading Loading @@ -209,23 +237,6 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve return null; } @Override public boolean isCustomizedButtonUsed() { return mIsProviderModelEnabled; } @Override public CharSequence getCustomizedButtonTitle() { return mContext.getText( mInternetUpdater.isWifiEnabled() ? R.string.turn_off_wifi : R.string.turn_on_wifi); } @Override public void onClickCustomizedButton(FragmentActivity panelActivity) { // Don't finish the panel activity mWifiManager.setWifiEnabled(!mInternetUpdater.isWifiEnabled()); } @Override public boolean isProgressBarVisible() { return mIsProgressBarVisible; Loading @@ -246,6 +257,7 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve */ @Override public void onAirplaneModeChanged(boolean isAirplaneModeOn) { log("onAirplaneModeChanged: isAirplaneModeOn:" + isAirplaneModeOn); updatePanelTitle(); } Loading @@ -254,6 +266,7 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve */ @Override public void onWifiEnabledChanged(boolean enabled) { log("onWifiEnabledChanged: enabled:" + enabled); updatePanelTitle(); } Loading Loading @@ -305,13 +318,6 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve return; } if (mIsProgressBarVisible) { // When the Wi-Fi scan result callback is received // Sub-Title: Searching for networks... mSubtitle = SUBTITLE_TEXT_SEARCHING_FOR_NETWORKS; return; } if (mInternetUpdater.isAirplaneModeOn()) { return; } Loading @@ -319,11 +325,18 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve final List<ScanResult> wifiList = mWifiManager.getScanResults(); if (wifiList != null && wifiList.size() != 0) { // When the Wi-Fi scan result is not empty // Sub-Title: Select the network you want to use for data // Sub-Title: Tap a network to connect mSubtitle = SUBTITLE_TEXT_TAP_A_NETWORK_TO_CONNECT; return; } if (!mIsScanningSubTitleShownOnce && mIsProgressBarVisible) { // When the Wi-Fi scan result callback is received // Sub-Title: Searching for networks... mSubtitle = SUBTITLE_TEXT_SEARCHING_FOR_NETWORKS; return; } // Sub-Title: // show non_carrier_network_unavailable // - while Wi-Fi on + no Wi-Fi item Loading Loading @@ -353,7 +366,7 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve mSubtitle = SUBTITLE_TEXT_NON_CARRIER_NETWORK_UNAVAILABLE; } protected void showProgressBar() { protected void updateProgressBar() { if (mWifiManager == null || !mInternetUpdater.isWifiEnabled()) { setProgressBarVisible(false); return; Loading @@ -362,8 +375,9 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve setProgressBarVisible(true); List<ScanResult> wifiScanResults = mWifiManager.getScanResults(); if (wifiScanResults != null && wifiScanResults.size() > 0) { mContext.getMainThreadHandler().postDelayed(mHideProgressBarRunnable, 2000 /* delay millis */); mHandlerInjector.postDelay(mHideProgressBarRunnable); } else if (!mIsScanningSubTitleShownOnce) { mHandlerInjector.postDelay(mHideScanningSubTitleRunnable); } } Loading tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java +35 −40 Original line number Diff line number Diff line Loading @@ -16,8 +16,6 @@ package com.android.settings.network; import static com.android.settings.network.ProviderModelSlice.ACTION_TITLE_CONNECT_TO_CARRIER; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; Loading @@ -42,6 +40,8 @@ import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import androidx.slice.Slice; import androidx.slice.SliceItem; import androidx.slice.SliceMetadata; import androidx.slice.SliceProvider; import androidx.slice.builders.ListBuilder; import androidx.slice.builders.SliceAction; Loading Loading @@ -100,8 +100,6 @@ public class ProviderModelSliceTest { ListBuilder.RowBuilder mMockCarrierRowBuild; @Mock WifiPickerTracker mWifiPickerTracker; @Mock WifiSliceItem mWifiSliceItem; private FakeFeatureFactory mFeatureFactory; Loading @@ -122,7 +120,7 @@ public class ProviderModelSliceTest { when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager); when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager); when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager); when(mWifiManager.isWifiEnabled()).thenReturn(true); // Set-up specs for SliceMetadata. SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS); Loading Loading @@ -182,7 +180,24 @@ public class ProviderModelSliceTest { @Test @UiThreadTest public void getSlice_haveTwoWifiAndOneCarrier_getCarrierAndTwoWiFiAndSeeAll() { public void getSlice_airplaneModeIsOn_oneWifiToggle() { mWifiList.clear(); mMockNetworkProviderWorker.updateSelfResults(null); mockHelperCondition(true, false, false, null); final Slice slice = mMockProviderModelSlice.getSlice(); assertThat(slice).isNotNull(); verify(mListBuilder, times(1)).addRow(any(ListBuilder.RowBuilder.class)); final SliceItem sliceTitle = SliceMetadata.from(mContext, slice).getListContent().getHeader().getTitleItem(); assertThat(sliceTitle.getText()).isEqualTo( ResourcesUtils.getResourcesString(mContext, "wifi_settings")); } @Test @UiThreadTest public void getSlice_haveTwoWifiAndOneCarrier_getFiveRow() { mWifiList.clear(); mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1", WifiEntry.CONNECTED_STATE_CONNECTED, "wifi1_key", true); Loading @@ -197,13 +212,13 @@ public class ProviderModelSliceTest { assertThat(slice).isNotNull(); verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild); verify(mListBuilder, times(4)).addRow(any(ListBuilder.RowBuilder.class)); verify(mListBuilder, times(5)).addRow(any(ListBuilder.RowBuilder.class)); assertThat(mMockProviderModelSlice.hasSeeAllRow()).isTrue(); } @Test @UiThreadTest public void getSlice_haveOneConnectedWifiAndTwoDisconnectedWifiAndNoCarrier_getFourRow() { public void getSlice_haveOneConnectedWifiAndTwoDisconnectedWifiAndNoCarrier_getFiveRow() { mWifiList.clear(); mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1", WifiEntry.CONNECTED_STATE_CONNECTED, "wifi1_key", true); Loading @@ -220,13 +235,13 @@ public class ProviderModelSliceTest { final Slice slice = mMockProviderModelSlice.getSlice(); assertThat(slice).isNotNull(); verify(mListBuilder, times(4)).addRow(any(ListBuilder.RowBuilder.class)); verify(mListBuilder, times(5)).addRow(any(ListBuilder.RowBuilder.class)); assertThat(mMockProviderModelSlice.hasSeeAllRow()).isTrue(); } @Test @UiThreadTest public void getSlice_haveTwoDisconnectedWifiAndNoCarrier_getThreeRow() { public void getSlice_haveTwoDisconnectedWifiAndNoCarrier_getFourRow() { mWifiList.clear(); mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1", WifiEntry.CONNECTED_STATE_DISCONNECTED, "wifi1_key", true); Loading @@ -240,13 +255,13 @@ public class ProviderModelSliceTest { final Slice slice = mMockProviderModelSlice.getSlice(); assertThat(slice).isNotNull(); verify(mListBuilder, times(3)).addRow(any(ListBuilder.RowBuilder.class)); verify(mListBuilder, times(4)).addRow(any(ListBuilder.RowBuilder.class)); assertThat(mMockProviderModelSlice.hasSeeAllRow()).isTrue(); } @Test @UiThreadTest public void getSlice_haveEthernetAndCarrierAndTwoDisconnectedWifi_getFiveRow() { public void getSlice_haveEthernetAndCarrierAndTwoDisconnectedWifi_getSixRow() { mWifiList.clear(); mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1", WifiEntry.CONNECTED_STATE_DISCONNECTED, "wifi1_key", true); Loading @@ -264,13 +279,13 @@ public class ProviderModelSliceTest { assertThat(slice).isNotNull(); assertThat(mMockProviderModelSlice.hasCreateEthernetRow()).isTrue(); verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild); verify(mListBuilder, times(5)).addRow(any(ListBuilder.RowBuilder.class)); verify(mListBuilder, times(6)).addRow(any(ListBuilder.RowBuilder.class)); assertThat(mMockProviderModelSlice.hasSeeAllRow()).isTrue(); } @Test @UiThreadTest public void getSlice_haveEthernetAndCarrierAndConnectedWifiAndDisconnectedWifi_getFiveRow() { public void getSlice_haveEthernetAndCarrierAndConnectedWifiAndDisconnectedWifi_getSixRow() { mWifiList.clear(); mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1", WifiEntry.CONNECTED_STATE_CONNECTED, "wifi1_key", true); Loading @@ -288,7 +303,7 @@ public class ProviderModelSliceTest { assertThat(slice).isNotNull(); assertThat(mMockProviderModelSlice.hasCreateEthernetRow()).isTrue(); verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild); verify(mListBuilder, times(5)).addRow(any(ListBuilder.RowBuilder.class)); verify(mListBuilder, times(6)).addRow(any(ListBuilder.RowBuilder.class)); assertThat(mMockProviderModelSlice.hasSeeAllRow()).isTrue(); } Loading Loading @@ -380,6 +395,11 @@ public class ProviderModelSliceTest { return super.getSeeAllRow(); } @Override public ListBuilder.RowBuilder getWifiSliceItemRow(WifiSliceItem wifiSliceItem) { return super.getWifiSliceItemRow(wifiSliceItem); } public boolean hasCreateEthernetRow() { return mHasCreateEthernetRow; } Loading Loading @@ -420,29 +440,4 @@ public class ProviderModelSliceTest { verify(mMockNetworkProviderWorker, never()).connectCarrierNetwork(); } @Test public void getWifiSliceItemRow_wifiNoInternetAccess_actionConnectToWifiSsid() { when(mWifiSliceItem.getKey()).thenReturn("wifi_key"); when(mWifiSliceItem.getTitle()).thenReturn("wifi_ssid"); when(mWifiSliceItem.hasInternetAccess()).thenReturn(false); ListBuilder.RowBuilder rowBuilder = mMockProviderModelSlice.getWifiSliceItemRow(mWifiSliceItem); assertThat(rowBuilder.getPrimaryAction().getTitle()) .isEqualTo("wifi_ssid"); } @Test public void getWifiSliceItemRow_wifiHasInternetAccess_actionConnectToCarrier() { when(mWifiSliceItem.getTitle()).thenReturn("wifi_ssid"); when(mWifiSliceItem.hasInternetAccess()).thenReturn(true); ListBuilder.RowBuilder rowBuilder = mMockProviderModelSlice.getWifiSliceItemRow(mWifiSliceItem); assertThat(rowBuilder.getPrimaryAction().getTitle()) .isEqualTo(ACTION_TITLE_CONNECT_TO_CARRIER); } } tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java +40 −59 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
src/com/android/settings/network/ProviderModelSlice.java +68 −74 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ package com.android.settings.network; import static android.app.slice.Slice.EXTRA_TOGGLE_STATE; import static com.android.settings.slices.CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI; import static com.android.settings.slices.CustomSliceRegistry.WIFI_SLICE_URI; import android.annotation.ColorInt; import android.app.PendingIntent; Loading Loading @@ -64,7 +65,6 @@ import java.util.stream.Collectors; public class ProviderModelSlice extends WifiSlice { private static final String TAG = "ProviderModelSlice"; protected static final String ACTION_TITLE_CONNECT_TO_CARRIER = "Connect_To_Carrier"; private final ProviderModelSliceHelper mHelper; Loading @@ -89,49 +89,32 @@ public class ProviderModelSlice extends WifiSlice { @Override public Slice getSlice() { // The provider model slice step: // First section: Add a Wi-Fi item which state is connected. // Second section: Add a carrier item. // Third section: Add the Wi-Fi items which are not connected. // Fourth section: If device has connection problem, this row show the message for user. @InternetUpdater.InternetType int internetType = getInternetType(); // First section: Add the Ethernet item. // Second section: Add the carrier item. // Third section: Add the Wi-Fi toggle item. // Fourth section: Add the connected Wi-Fi item. // Fifth section: Add the Wi-Fi items which are not connected. // Sixth section: Add the See All item. final ListBuilder listBuilder = mHelper.createListBuilder(getUri()); if (mHelper.isAirplaneModeEnabled() && !mWifiManager.isWifiEnabled() && internetType != InternetUpdater.INTERNET_ETHERNET) { log("Airplane mode is enabled."); return listBuilder.build(); } int maxListSize = 0; List<WifiSliceItem> wifiList = null; final NetworkProviderWorker worker = getWorker(); if (worker != null) { // get Wi-Fi list. wifiList = worker.getResults(); maxListSize = worker.getApRowCount(); } else { log("network provider worker is null."); } final boolean hasCarrier = mHelper.hasCarrier(); log("hasCarrier: " + hasCarrier); // First section: Add a Ethernet or Wi-Fi item which state is connected. boolean isConnectedWifiAddedTop = false; final WifiSliceItem connectedWifiItem = mHelper.getConnectedWifiItem(wifiList); if (internetType == InternetUpdater.INTERNET_ETHERNET) { // First section: Add the Ethernet item. if (getInternetType() == InternetUpdater.INTERNET_ETHERNET) { log("get Ethernet item which is connected"); listBuilder.addRow(createEthernetRow()); maxListSize--; } else { if (connectedWifiItem != null && internetType == InternetUpdater.INTERNET_WIFI) { log("get Wi-Fi item which is connected to internet"); listBuilder.addRow(getWifiSliceItemRow(connectedWifiItem)); isConnectedWifiAddedTop = true; maxListSize--; } } // Second section: Add a carrier item. // Second section: Add the carrier item. if (!mHelper.isAirplaneModeEnabled()) { final boolean hasCarrier = mHelper.hasCarrier(); log("hasCarrier: " + hasCarrier); if (hasCarrier) { mHelper.updateTelephony(); listBuilder.addRow( Loading @@ -139,28 +122,44 @@ public class ProviderModelSlice extends WifiSlice { worker != null ? worker.getNetworkTypeDescription() : "")); maxListSize--; } } // Third section: Add the Wi-Fi toggle item. final boolean isWifiEnabled = mWifiManager.isWifiEnabled(); listBuilder.addRow(createWifiToggleRow(mContext, isWifiEnabled)); maxListSize--; if (!isWifiEnabled) { log("Wi-Fi is disabled"); return listBuilder.build(); } List<WifiSliceItem> wifiList = (worker != null) ? worker.getResults() : null; if (wifiList == null || wifiList.size() <= 0) { log("Wi-Fi list is empty"); return listBuilder.build(); } // Third section: Add the connected Wi-Fi item to Wi-Fi list if the Ethernet is connected. if (connectedWifiItem != null && !isConnectedWifiAddedTop) { // Fourth section: Add the connected Wi-Fi item. final WifiSliceItem connectedWifiItem = mHelper.getConnectedWifiItem(wifiList); if (connectedWifiItem != null) { log("get Wi-Fi item which is connected"); listBuilder.addRow(getWifiSliceItemRow(connectedWifiItem)); maxListSize--; } // Fourth section: Add the Wi-Fi items which are not connected. if (wifiList != null && wifiList.size() > 0) { // Fifth section: Add the Wi-Fi items which are not connected. log("get Wi-Fi items which are not connected. Wi-Fi items : " + wifiList.size()); final List<WifiSliceItem> disconnectedWifiList = wifiList.stream() .filter(wifiSliceItem -> wifiSliceItem.getConnectedState() != WifiEntry.CONNECTED_STATE_CONNECTED) .filter(item -> item.getConnectedState() != WifiEntry.CONNECTED_STATE_CONNECTED) .limit(maxListSize - 1) .collect(Collectors.toList()); for (WifiSliceItem item : disconnectedWifiList) { listBuilder.addRow(getWifiSliceItemRow(item)); } // Sixth section: Add the See All item. log("add See-All"); listBuilder.addRow(getSeeAllRow()); } return listBuilder.build(); } Loading Loading @@ -269,6 +268,26 @@ public class ProviderModelSlice extends WifiSlice { .setSubtitle(mContext.getText(R.string.to_switch_networks_disconnect_ethernet)); } /** * @return a {@link ListBuilder.RowBuilder} of the Wi-Fi toggle. */ protected ListBuilder.RowBuilder createWifiToggleRow(Context context, boolean isWifiEnabled) { final Intent intent = new Intent(WIFI_SLICE_URI.toString()) .setData(WIFI_SLICE_URI) .setClass(context, SliceBroadcastReceiver.class) .putExtra(EXTRA_TOGGLE_STATE, !isWifiEnabled) // The FLAG_RECEIVER_FOREGROUND flag is necessary to avoid the intent delay of // the first sending after the device restarts .addFlags(Intent.FLAG_RECEIVER_FOREGROUND); final PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); final SliceAction toggleSliceAction = SliceAction.createToggle(pendingIntent, null /* actionTitle */, isWifiEnabled); return new ListBuilder.RowBuilder() .setTitle(context.getString(R.string.wifi_settings)) .setPrimaryAction(toggleSliceAction); } protected ListBuilder.RowBuilder getSeeAllRow() { final CharSequence title = mContext.getText(R.string.previous_connected_see_all); final IconCompat icon = getSeeAllIcon(); Loading @@ -294,31 +313,6 @@ public class ProviderModelSlice extends WifiSlice { return SliceAction.createDeeplink(intent, icon, ListBuilder.ICON_IMAGE, title); } @Override protected ListBuilder.RowBuilder getWifiSliceItemRow(WifiSliceItem wifiSliceItem) { final CharSequence title = wifiSliceItem.getTitle(); final IconCompat levelIcon = getWifiSliceItemLevelIcon(wifiSliceItem); final ListBuilder.RowBuilder rowBuilder = new ListBuilder.RowBuilder() .setTitleItem(levelIcon, ListBuilder.ICON_IMAGE) .setTitle(title) .setSubtitle(wifiSliceItem.getSummary()) .setContentDescription(wifiSliceItem.getContentDescription()); final IconCompat endIcon; if (wifiSliceItem.hasInternetAccess()) { rowBuilder.setPrimaryAction(SliceAction.create(getBroadcastIntent(mContext), levelIcon, ListBuilder.ICON_IMAGE, ACTION_TITLE_CONNECT_TO_CARRIER)); endIcon = IconCompat.createWithResource(mContext, R.drawable.ic_settings_close); } else { rowBuilder.setPrimaryAction(getWifiEntryAction(wifiSliceItem, levelIcon, title)); endIcon = getEndIcon(wifiSliceItem); } if (endIcon != null) { rowBuilder.addEndItem(endIcon, ListBuilder.ICON_IMAGE); } return rowBuilder; } @Override protected IconCompat getWifiSliceItemLevelIcon(WifiSliceItem wifiSliceItem) { if (wifiSliceItem.getConnectedState() == WifiEntry.CONNECTED_STATE_CONNECTED Loading
src/com/android/settings/network/telephony/NetworkProviderWorker.java +1 −1 Original line number Diff line number Diff line Loading @@ -54,7 +54,7 @@ public class NetworkProviderWorker extends WifiScanWorker implements DataConnectivityListener.Client, InternetUpdater.InternetChangeListener, SubscriptionsChangeListener.SubscriptionsChangeListenerClient { private static final String TAG = "NetworkProviderWorker"; private static final int PROVIDER_MODEL_DEFAULT_EXPANDED_ROW_COUNT = 5; private static final int PROVIDER_MODEL_DEFAULT_EXPANDED_ROW_COUNT = 6; private DataContentObserver mMobileDataObserver; private SignalStrengthListener mSignalStrengthListener; private SubscriptionsChangeListener mSubscriptionsListener; Loading
src/com/android/settings/panel/InternetConnectivityPanel.java +47 −33 Original line number Diff line number Diff line Loading @@ -38,7 +38,6 @@ import android.text.TextUtils; import android.util.Log; import androidx.annotation.VisibleForTesting; import androidx.fragment.app.FragmentActivity; import androidx.lifecycle.LifecycleObserver; import androidx.lifecycle.OnLifecycleEvent; Loading Loading @@ -84,12 +83,13 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve } if (TextUtils.equals(intent.getAction(), WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { showProgressBar(); updateProgressBar(); updatePanelTitle(); return; } if (TextUtils.equals(intent.getAction(), WifiManager.NETWORK_STATE_CHANGED_ACTION)) { updateProgressBar(); updatePanelTitle(); } } Loading @@ -110,13 +110,40 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve private int mDefaultDataSubid = SubscriptionManager.INVALID_SUBSCRIPTION_ID; // Wi-Fi scanning progress bar protected HandlerInjector mHandlerInjector; protected boolean mIsProgressBarVisible; protected final Runnable mHideProgressBarRunnable = () -> { protected boolean mIsScanningSubTitleShownOnce; protected Runnable mHideProgressBarRunnable = () -> { setProgressBarVisible(false); }; protected Runnable mHideScanningSubTitleRunnable = () -> { mIsScanningSubTitleShownOnce = true; updatePanelTitle(); }; /** * Wrapper for testing compatibility. */ @VisibleForTesting static class HandlerInjector { protected final Handler mHandler; HandlerInjector(Context context) { mHandler = context.getMainThreadHandler(); } public void postDelay(Runnable runnable) { mHandler.postDelayed(runnable, 2000 /* delay millis */); } public void removeCallbacks(Runnable runnable) { mHandler.removeCallbacks(runnable); } } private InternetConnectivityPanel(Context context) { mContext = context.getApplicationContext(); mHandlerInjector = new HandlerInjector(context); mIsProviderModelEnabled = Utils.isProviderModelEnabled(mContext); mInternetUpdater = new InternetUpdater(context, null /* Lifecycle */, this); Loading Loading @@ -150,7 +177,7 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve mTelephonyManager.registerTelephonyCallback( new HandlerExecutor(new Handler(Looper.getMainLooper())), mTelephonyCallback); mContext.registerReceiver(mWifiStateReceiver, mWifiStateFilter); showProgressBar(); updateProgressBar(); updatePanelTitle(); } Loading @@ -165,7 +192,8 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve mConnectivityListener.stop(); mTelephonyManager.unregisterTelephonyCallback(mTelephonyCallback); mContext.unregisterReceiver(mWifiStateReceiver); mContext.getMainThreadHandler().removeCallbacks(mHideProgressBarRunnable); mHandlerInjector.removeCallbacks(mHideProgressBarRunnable); mHandlerInjector.removeCallbacks(mHideScanningSubTitleRunnable); } /** Loading Loading @@ -209,23 +237,6 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve return null; } @Override public boolean isCustomizedButtonUsed() { return mIsProviderModelEnabled; } @Override public CharSequence getCustomizedButtonTitle() { return mContext.getText( mInternetUpdater.isWifiEnabled() ? R.string.turn_off_wifi : R.string.turn_on_wifi); } @Override public void onClickCustomizedButton(FragmentActivity panelActivity) { // Don't finish the panel activity mWifiManager.setWifiEnabled(!mInternetUpdater.isWifiEnabled()); } @Override public boolean isProgressBarVisible() { return mIsProgressBarVisible; Loading @@ -246,6 +257,7 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve */ @Override public void onAirplaneModeChanged(boolean isAirplaneModeOn) { log("onAirplaneModeChanged: isAirplaneModeOn:" + isAirplaneModeOn); updatePanelTitle(); } Loading @@ -254,6 +266,7 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve */ @Override public void onWifiEnabledChanged(boolean enabled) { log("onWifiEnabledChanged: enabled:" + enabled); updatePanelTitle(); } Loading Loading @@ -305,13 +318,6 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve return; } if (mIsProgressBarVisible) { // When the Wi-Fi scan result callback is received // Sub-Title: Searching for networks... mSubtitle = SUBTITLE_TEXT_SEARCHING_FOR_NETWORKS; return; } if (mInternetUpdater.isAirplaneModeOn()) { return; } Loading @@ -319,11 +325,18 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve final List<ScanResult> wifiList = mWifiManager.getScanResults(); if (wifiList != null && wifiList.size() != 0) { // When the Wi-Fi scan result is not empty // Sub-Title: Select the network you want to use for data // Sub-Title: Tap a network to connect mSubtitle = SUBTITLE_TEXT_TAP_A_NETWORK_TO_CONNECT; return; } if (!mIsScanningSubTitleShownOnce && mIsProgressBarVisible) { // When the Wi-Fi scan result callback is received // Sub-Title: Searching for networks... mSubtitle = SUBTITLE_TEXT_SEARCHING_FOR_NETWORKS; return; } // Sub-Title: // show non_carrier_network_unavailable // - while Wi-Fi on + no Wi-Fi item Loading Loading @@ -353,7 +366,7 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve mSubtitle = SUBTITLE_TEXT_NON_CARRIER_NETWORK_UNAVAILABLE; } protected void showProgressBar() { protected void updateProgressBar() { if (mWifiManager == null || !mInternetUpdater.isWifiEnabled()) { setProgressBarVisible(false); return; Loading @@ -362,8 +375,9 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve setProgressBarVisible(true); List<ScanResult> wifiScanResults = mWifiManager.getScanResults(); if (wifiScanResults != null && wifiScanResults.size() > 0) { mContext.getMainThreadHandler().postDelayed(mHideProgressBarRunnable, 2000 /* delay millis */); mHandlerInjector.postDelay(mHideProgressBarRunnable); } else if (!mIsScanningSubTitleShownOnce) { mHandlerInjector.postDelay(mHideScanningSubTitleRunnable); } } Loading
tests/unit/src/com/android/settings/network/ProviderModelSliceTest.java +35 −40 Original line number Diff line number Diff line Loading @@ -16,8 +16,6 @@ package com.android.settings.network; import static com.android.settings.network.ProviderModelSlice.ACTION_TITLE_CONNECT_TO_CARRIER; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; Loading @@ -42,6 +40,8 @@ import android.telephony.SubscriptionManager; import android.telephony.TelephonyManager; import androidx.slice.Slice; import androidx.slice.SliceItem; import androidx.slice.SliceMetadata; import androidx.slice.SliceProvider; import androidx.slice.builders.ListBuilder; import androidx.slice.builders.SliceAction; Loading Loading @@ -100,8 +100,6 @@ public class ProviderModelSliceTest { ListBuilder.RowBuilder mMockCarrierRowBuild; @Mock WifiPickerTracker mWifiPickerTracker; @Mock WifiSliceItem mWifiSliceItem; private FakeFeatureFactory mFeatureFactory; Loading @@ -122,7 +120,7 @@ public class ProviderModelSliceTest { when(mContext.getSystemService(TelephonyManager.class)).thenReturn(mTelephonyManager); when(mTelephonyManager.createForSubscriptionId(anyInt())).thenReturn(mTelephonyManager); when(mContext.getSystemService(WifiManager.class)).thenReturn(mWifiManager); when(mWifiManager.isWifiEnabled()).thenReturn(true); // Set-up specs for SliceMetadata. SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS); Loading Loading @@ -182,7 +180,24 @@ public class ProviderModelSliceTest { @Test @UiThreadTest public void getSlice_haveTwoWifiAndOneCarrier_getCarrierAndTwoWiFiAndSeeAll() { public void getSlice_airplaneModeIsOn_oneWifiToggle() { mWifiList.clear(); mMockNetworkProviderWorker.updateSelfResults(null); mockHelperCondition(true, false, false, null); final Slice slice = mMockProviderModelSlice.getSlice(); assertThat(slice).isNotNull(); verify(mListBuilder, times(1)).addRow(any(ListBuilder.RowBuilder.class)); final SliceItem sliceTitle = SliceMetadata.from(mContext, slice).getListContent().getHeader().getTitleItem(); assertThat(sliceTitle.getText()).isEqualTo( ResourcesUtils.getResourcesString(mContext, "wifi_settings")); } @Test @UiThreadTest public void getSlice_haveTwoWifiAndOneCarrier_getFiveRow() { mWifiList.clear(); mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1", WifiEntry.CONNECTED_STATE_CONNECTED, "wifi1_key", true); Loading @@ -197,13 +212,13 @@ public class ProviderModelSliceTest { assertThat(slice).isNotNull(); verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild); verify(mListBuilder, times(4)).addRow(any(ListBuilder.RowBuilder.class)); verify(mListBuilder, times(5)).addRow(any(ListBuilder.RowBuilder.class)); assertThat(mMockProviderModelSlice.hasSeeAllRow()).isTrue(); } @Test @UiThreadTest public void getSlice_haveOneConnectedWifiAndTwoDisconnectedWifiAndNoCarrier_getFourRow() { public void getSlice_haveOneConnectedWifiAndTwoDisconnectedWifiAndNoCarrier_getFiveRow() { mWifiList.clear(); mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1", WifiEntry.CONNECTED_STATE_CONNECTED, "wifi1_key", true); Loading @@ -220,13 +235,13 @@ public class ProviderModelSliceTest { final Slice slice = mMockProviderModelSlice.getSlice(); assertThat(slice).isNotNull(); verify(mListBuilder, times(4)).addRow(any(ListBuilder.RowBuilder.class)); verify(mListBuilder, times(5)).addRow(any(ListBuilder.RowBuilder.class)); assertThat(mMockProviderModelSlice.hasSeeAllRow()).isTrue(); } @Test @UiThreadTest public void getSlice_haveTwoDisconnectedWifiAndNoCarrier_getThreeRow() { public void getSlice_haveTwoDisconnectedWifiAndNoCarrier_getFourRow() { mWifiList.clear(); mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1", WifiEntry.CONNECTED_STATE_DISCONNECTED, "wifi1_key", true); Loading @@ -240,13 +255,13 @@ public class ProviderModelSliceTest { final Slice slice = mMockProviderModelSlice.getSlice(); assertThat(slice).isNotNull(); verify(mListBuilder, times(3)).addRow(any(ListBuilder.RowBuilder.class)); verify(mListBuilder, times(4)).addRow(any(ListBuilder.RowBuilder.class)); assertThat(mMockProviderModelSlice.hasSeeAllRow()).isTrue(); } @Test @UiThreadTest public void getSlice_haveEthernetAndCarrierAndTwoDisconnectedWifi_getFiveRow() { public void getSlice_haveEthernetAndCarrierAndTwoDisconnectedWifi_getSixRow() { mWifiList.clear(); mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1", WifiEntry.CONNECTED_STATE_DISCONNECTED, "wifi1_key", true); Loading @@ -264,13 +279,13 @@ public class ProviderModelSliceTest { assertThat(slice).isNotNull(); assertThat(mMockProviderModelSlice.hasCreateEthernetRow()).isTrue(); verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild); verify(mListBuilder, times(5)).addRow(any(ListBuilder.RowBuilder.class)); verify(mListBuilder, times(6)).addRow(any(ListBuilder.RowBuilder.class)); assertThat(mMockProviderModelSlice.hasSeeAllRow()).isTrue(); } @Test @UiThreadTest public void getSlice_haveEthernetAndCarrierAndConnectedWifiAndDisconnectedWifi_getFiveRow() { public void getSlice_haveEthernetAndCarrierAndConnectedWifiAndDisconnectedWifi_getSixRow() { mWifiList.clear(); mockWifiItemCondition(mMockWifiSliceItem1, "wifi1", "wifi1", WifiEntry.CONNECTED_STATE_CONNECTED, "wifi1_key", true); Loading @@ -288,7 +303,7 @@ public class ProviderModelSliceTest { assertThat(slice).isNotNull(); assertThat(mMockProviderModelSlice.hasCreateEthernetRow()).isTrue(); verify(mListBuilder, times(1)).addRow(mMockCarrierRowBuild); verify(mListBuilder, times(5)).addRow(any(ListBuilder.RowBuilder.class)); verify(mListBuilder, times(6)).addRow(any(ListBuilder.RowBuilder.class)); assertThat(mMockProviderModelSlice.hasSeeAllRow()).isTrue(); } Loading Loading @@ -380,6 +395,11 @@ public class ProviderModelSliceTest { return super.getSeeAllRow(); } @Override public ListBuilder.RowBuilder getWifiSliceItemRow(WifiSliceItem wifiSliceItem) { return super.getWifiSliceItemRow(wifiSliceItem); } public boolean hasCreateEthernetRow() { return mHasCreateEthernetRow; } Loading Loading @@ -420,29 +440,4 @@ public class ProviderModelSliceTest { verify(mMockNetworkProviderWorker, never()).connectCarrierNetwork(); } @Test public void getWifiSliceItemRow_wifiNoInternetAccess_actionConnectToWifiSsid() { when(mWifiSliceItem.getKey()).thenReturn("wifi_key"); when(mWifiSliceItem.getTitle()).thenReturn("wifi_ssid"); when(mWifiSliceItem.hasInternetAccess()).thenReturn(false); ListBuilder.RowBuilder rowBuilder = mMockProviderModelSlice.getWifiSliceItemRow(mWifiSliceItem); assertThat(rowBuilder.getPrimaryAction().getTitle()) .isEqualTo("wifi_ssid"); } @Test public void getWifiSliceItemRow_wifiHasInternetAccess_actionConnectToCarrier() { when(mWifiSliceItem.getTitle()).thenReturn("wifi_ssid"); when(mWifiSliceItem.hasInternetAccess()).thenReturn(true); ListBuilder.RowBuilder rowBuilder = mMockProviderModelSlice.getWifiSliceItemRow(mWifiSliceItem); assertThat(rowBuilder.getPrimaryAction().getTitle()) .isEqualTo(ACTION_TITLE_CONNECT_TO_CARRIER); } }
tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java +40 −59 File changed.Preview size limit exceeded, changes collapsed. Show changes