diff --git a/res/values/strings.xml b/res/values/strings.xml index 5abba1faabd..ac23dc7c5a4 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -12671,10 +12671,8 @@ View airplane mode networks Viewing airplane mode networks - - Turn on networks - - Turn off networks + + Turn on Wi\u2011Fi Reset your internet? diff --git a/src/com/android/settings/network/AirplaneSafeNetworksSlice.java b/src/com/android/settings/network/AirplaneSafeNetworksSlice.java deleted file mode 100644 index 763e0c7d9a2..00000000000 --- a/src/com/android/settings/network/AirplaneSafeNetworksSlice.java +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright (C) 2020 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.network; - -import android.app.PendingIntent; -import android.content.BroadcastReceiver; -import android.content.Context; -import android.content.Intent; -import android.content.IntentFilter; -import android.graphics.Color; -import android.graphics.drawable.ColorDrawable; -import android.graphics.drawable.Drawable; -import android.net.Uri; -import android.net.wifi.WifiManager; -import android.util.Log; - -import androidx.annotation.IntDef; -import androidx.core.graphics.drawable.IconCompat; -import androidx.slice.Slice; -import androidx.slice.builders.ListBuilder; -import androidx.slice.builders.ListBuilder.RowBuilder; -import androidx.slice.builders.SliceAction; -import androidx.slice.core.SliceHints; - -import com.android.settings.AirplaneModeEnabler; -import com.android.settings.R; -import com.android.settings.Utils; -import com.android.settings.slices.CustomSliceRegistry; -import com.android.settings.slices.CustomSliceable; -import com.android.settings.slices.SliceBackgroundWorker; -import com.android.settings.slices.SliceBroadcastReceiver; - -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -/** - * {@link CustomSliceable} for airplane-safe networks, used by generic clients. - */ -public class AirplaneSafeNetworksSlice implements CustomSliceable, - AirplaneModeEnabler.OnAirplaneModeChangedListener { - - private static final String TAG = "AirplaneSafeNetworksSlice"; - - public static final String ACTION_INTENT_EXTRA = "action"; - - /** - * Annotation for different action of the slice. - * - * {@code TURN_ON_NETWORKS} for action of turning on Wi-Fi networks. - * {@code TURN_OFF_NETWORKS} for action of turning off Wi-Fi networks. - */ - @Retention(RetentionPolicy.SOURCE) - @IntDef(value = { - Action.TURN_ON_NETWORKS, - Action.TURN_OFF_NETWORKS, - }) - public @interface Action { - int TURN_ON_NETWORKS = 1; - int TURN_OFF_NETWORKS = 2; - } - - private final Context mContext; - private final AirplaneModeEnabler mAirplaneModeEnabler; - private final WifiManager mWifiManager; - - private boolean mIsAirplaneModeOn; - - public AirplaneSafeNetworksSlice(Context context) { - mContext = context; - mAirplaneModeEnabler = new AirplaneModeEnabler(context, this); - mIsAirplaneModeOn = mAirplaneModeEnabler.isAirplaneModeOn(); - mWifiManager = mContext.getSystemService(WifiManager.class); - } - - private static void logd(String s) { - Log.d(TAG, s); - } - - @Override - public Slice getSlice() { - final ListBuilder listBuilder = new ListBuilder(mContext, getUri(), ListBuilder.INFINITY); - if (mIsAirplaneModeOn) { - listBuilder.addRow(new RowBuilder() - .setTitle(getTitle()) - .addEndItem(getEndIcon(), SliceHints.ICON_IMAGE) - .setPrimaryAction(getSliceAction())); - } - return listBuilder.build(); - } - - @Override - public Uri getUri() { - return CustomSliceRegistry.AIRPLANE_SAFE_NETWORKS_SLICE_URI; - } - - @Override - public void onNotifyChange(Intent intent) { - final int action = intent.getIntExtra(ACTION_INTENT_EXTRA, 0); - if (action == Action.TURN_ON_NETWORKS) { - if (!mWifiManager.isWifiEnabled()) { - logd("Action: turn on Wi-Fi networks"); - mWifiManager.setWifiEnabled(true); - } - } else if (action == Action.TURN_OFF_NETWORKS) { - if (mWifiManager.isWifiEnabled()) { - logd("Action: turn off Wi-Fi networks"); - mWifiManager.setWifiEnabled(false); - } - } - } - - @Override - public void onAirplaneModeChanged(boolean isAirplaneModeOn) { - mIsAirplaneModeOn = isAirplaneModeOn; - final AirplaneSafeNetworksWorker worker = SliceBackgroundWorker.getInstance(getUri()); - if (worker != null) { - worker.updateSlice(); - } - } - - @Override - public Intent getIntent() { - return new Intent(getUri().toString()) - .setData(getUri()) - .setClass(mContext, SliceBroadcastReceiver.class) - .putExtra(ACTION_INTENT_EXTRA, getAction()); - } - - @Action - private int getAction() { - return mWifiManager.isWifiEnabled() - ? Action.TURN_OFF_NETWORKS - : Action.TURN_ON_NETWORKS; - } - - private String getTitle() { - return mContext.getText( - (getAction() == Action.TURN_ON_NETWORKS) - ? R.string.turn_on_networks - : R.string.turn_off_networks).toString(); - } - - private IconCompat getEndIcon() { - final Drawable drawable = mContext.getDrawable( - (getAction() == Action.TURN_ON_NETWORKS) ? R.drawable.ic_airplane_safe_networks_24dp - : R.drawable.ic_airplanemode_active); - if (drawable == null) { - return Utils.createIconWithDrawable(new ColorDrawable(Color.TRANSPARENT)); - } - drawable.setTintList(Utils.getColorAttr(mContext, android.R.attr.colorAccent)); - return Utils.createIconWithDrawable(drawable); - } - - private SliceAction getSliceAction() { - final PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, - 0 /* requestCode */, getIntent(), - PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); - final IconCompat icon = Utils.createIconWithDrawable(new ColorDrawable(Color.TRANSPARENT)); - return SliceAction.create(pendingIntent, icon, ListBuilder.ACTION_WITH_LABEL, getTitle()); - } - - @Override - public Class getBackgroundWorkerClass() { - return AirplaneSafeNetworksWorker.class; - } - - public static class AirplaneSafeNetworksWorker extends SliceBackgroundWorker { - - private final IntentFilter mIntentFilter; - private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) { - notifySliceChange(); - } - } - }; - - public AirplaneSafeNetworksWorker(Context context, Uri uri) { - super(context, uri); - mIntentFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION); - } - - @Override - protected void onSlicePinned() { - getContext().registerReceiver(mBroadcastReceiver, mIntentFilter); - } - - @Override - protected void onSliceUnpinned() { - getContext().unregisterReceiver(mBroadcastReceiver); - } - - @Override - public void close() { - // Do nothing. - } - - public void updateSlice() { - notifySliceChange(); - } - } -} diff --git a/src/com/android/settings/network/TurnOnWifiSlice.java b/src/com/android/settings/network/TurnOnWifiSlice.java new file mode 100644 index 00000000000..05a873fef0c --- /dev/null +++ b/src/com/android/settings/network/TurnOnWifiSlice.java @@ -0,0 +1,147 @@ +/* + * Copyright (C) 2021 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.network; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.graphics.drawable.Drawable; +import android.net.Uri; +import android.net.wifi.WifiManager; +import android.util.Log; + +import androidx.core.graphics.drawable.IconCompat; +import androidx.slice.Slice; +import androidx.slice.builders.ListBuilder; +import androidx.slice.builders.ListBuilder.RowBuilder; +import androidx.slice.builders.SliceAction; +import androidx.slice.core.SliceHints; + +import com.android.settings.R; +import com.android.settings.Utils; +import com.android.settings.slices.CustomSliceRegistry; +import com.android.settings.slices.CustomSliceable; +import com.android.settings.slices.SliceBackgroundWorker; +import com.android.settings.slices.SliceBroadcastReceiver; + +/** + * {@link CustomSliceable} for turning on Wi-Fi, used by generic clients. + */ +public class TurnOnWifiSlice implements CustomSliceable { + + private static final String TAG = "TurnOnWifiSlice"; + + private final Context mContext; + private final WifiManager mWifiManager; + + public TurnOnWifiSlice(Context context) { + mContext = context; + mWifiManager = mContext.getSystemService(WifiManager.class); + } + + private static void logd(String s) { + Log.d(TAG, s); + } + + @Override + public Slice getSlice() { + if (mWifiManager.isWifiEnabled()) { + return null; + } + final String title = mContext.getText(R.string.turn_on_wifi).toString(); + final SliceAction primaryAction = SliceAction.create(getBroadcastIntent(mContext), + getEndIcon(), ListBuilder.ICON_IMAGE, title); + final ListBuilder listBuilder = new ListBuilder(mContext, getUri(), ListBuilder.INFINITY) + .addRow(new RowBuilder() + .setTitle(title) + .addEndItem(getEndIcon(), SliceHints.ICON_IMAGE) + .setPrimaryAction(primaryAction)); + return listBuilder.build(); + } + + @Override + public Uri getUri() { + return CustomSliceRegistry.TURN_ON_WIFI_SLICE_URI; + } + + @Override + public void onNotifyChange(Intent intent) { + logd("Action: turn on Wi-Fi networks"); + mWifiManager.setWifiEnabled(true); + } + + @Override + public Intent getIntent() { + return new Intent(getUri().toString()) + .setData(getUri()) + .setClass(mContext, SliceBroadcastReceiver.class); + } + + private IconCompat getEndIcon() { + final Drawable drawable = mContext.getDrawable(R.drawable.ic_settings_wireless); + if (drawable == null) { + return Utils.createIconWithDrawable(new ColorDrawable(Color.TRANSPARENT)); + } + drawable.setTintList(Utils.getColorAttr(mContext, android.R.attr.colorAccent)); + return Utils.createIconWithDrawable(drawable); + } + + @Override + public Class getBackgroundWorkerClass() { + return TurnOnWifiWorker.class; + } + + /** + * The Slice background worker {@link SliceBackgroundWorker} is used to listen the Wi-Fi + * status change, and then notifies the Slice {@link Uri} to update. + */ + public static class TurnOnWifiWorker extends SliceBackgroundWorker { + + private final IntentFilter mIntentFilter; + private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(intent.getAction())) { + notifySliceChange(); + } + } + }; + + public TurnOnWifiWorker(Context context, Uri uri) { + super(context, uri); + mIntentFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION); + } + + @Override + protected void onSlicePinned() { + getContext().registerReceiver(mBroadcastReceiver, mIntentFilter); + } + + @Override + protected void onSliceUnpinned() { + getContext().unregisterReceiver(mBroadcastReceiver); + } + + @Override + public void close() { + // Do nothing. + } + } +} diff --git a/src/com/android/settings/panel/InternetConnectivityPanel.java b/src/com/android/settings/panel/InternetConnectivityPanel.java index bdaa8492230..46843b04166 100644 --- a/src/com/android/settings/panel/InternetConnectivityPanel.java +++ b/src/com/android/settings/panel/InternetConnectivityPanel.java @@ -113,7 +113,7 @@ public class InternetConnectivityPanel implements PanelContent, LifecycleObserve final List uris = new ArrayList<>(); if (mIsProviderModelEnabled) { uris.add(CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI); - uris.add(CustomSliceRegistry.AIRPLANE_SAFE_NETWORKS_SLICE_URI); + uris.add(CustomSliceRegistry.TURN_ON_WIFI_SLICE_URI); } else { uris.add(CustomSliceRegistry.WIFI_SLICE_URI); uris.add(CustomSliceRegistry.MOBILE_DATA_SLICE_URI); diff --git a/src/com/android/settings/slices/CustomSliceRegistry.java b/src/com/android/settings/slices/CustomSliceRegistry.java index e40b164e966..713d61a1ddd 100644 --- a/src/com/android/settings/slices/CustomSliceRegistry.java +++ b/src/com/android/settings/slices/CustomSliceRegistry.java @@ -39,8 +39,8 @@ import com.android.settings.homepage.contextualcards.slices.LowStorageSlice; import com.android.settings.location.LocationSlice; import com.android.settings.media.MediaOutputIndicatorSlice; import com.android.settings.media.RemoteMediaSlice; -import com.android.settings.network.AirplaneSafeNetworksSlice; import com.android.settings.network.ProviderModelSlice; +import com.android.settings.network.TurnOnWifiSlice; import com.android.settings.network.telephony.MobileDataSlice; import com.android.settings.notification.zen.ZenModeButtonPreferenceController; import com.android.settings.wifi.calling.WifiCallingSliceHelper; @@ -307,13 +307,13 @@ public class CustomSliceRegistry { .build(); /** - * Backing Uri for the Always On Slice. + * Backing Uri for the Turn on Wi-Fi Slice. */ - public static final Uri AIRPLANE_SAFE_NETWORKS_SLICE_URI = new Uri.Builder() + public static final Uri TURN_ON_WIFI_SLICE_URI = new Uri.Builder() .scheme(ContentResolver.SCHEME_CONTENT) .authority(SettingsSliceProvider.SLICE_AUTHORITY) .appendPath(SettingsSlicesContract.PATH_SETTING_ACTION) - .appendPath("airplane_safe_networks") + .appendPath("turn_on_wifi") .build(); @VisibleForTesting @@ -337,7 +337,7 @@ public class CustomSliceRegistry { sUriToSlice.put(DARK_THEME_SLICE_URI, DarkThemeSlice.class); sUriToSlice.put(REMOTE_MEDIA_SLICE_URI, RemoteMediaSlice.class); sUriToSlice.put(ALWAYS_ON_SLICE_URI, AlwaysOnDisplaySlice.class); - sUriToSlice.put(AIRPLANE_SAFE_NETWORKS_SLICE_URI, AirplaneSafeNetworksSlice.class); + sUriToSlice.put(TURN_ON_WIFI_SLICE_URI, TurnOnWifiSlice.class); } public static Class getSliceClassByUri(Uri uri) { diff --git a/tests/unit/src/com/android/settings/network/AirplaneSafeNetworksSliceTest.java b/tests/unit/src/com/android/settings/network/AirplaneSafeNetworksSliceTest.java deleted file mode 100644 index a90b89dfdce..00000000000 --- a/tests/unit/src/com/android/settings/network/AirplaneSafeNetworksSliceTest.java +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (C) 2020 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.network; - -import static com.google.common.truth.Truth.assertThat; - -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -import android.content.Context; -import android.content.Intent; -import android.net.wifi.WifiManager; - -import androidx.slice.Slice; -import androidx.slice.SliceItem; -import androidx.slice.SliceMetadata; -import androidx.slice.SliceProvider; -import androidx.slice.widget.SliceLiveData; -import androidx.test.core.app.ApplicationProvider; -import androidx.test.ext.junit.runners.AndroidJUnit4; - -import com.android.settings.testutils.ResourcesUtils; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnit; -import org.mockito.junit.MockitoRule; - -@RunWith(AndroidJUnit4.class) -public class AirplaneSafeNetworksSliceTest { - - @Rule - public MockitoRule mMocks = MockitoJUnit.rule(); - @Mock - private WifiManager mWifiManager; - - private Context mContext; - private AirplaneSafeNetworksSlice mAirplaneSafeNetworksSlice; - - @Before - public void setUp() { - mContext = spy(ApplicationProvider.getApplicationContext()); - when(mContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(mWifiManager); - - // Set-up specs for SliceMetadata. - SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS); - - mAirplaneSafeNetworksSlice = new AirplaneSafeNetworksSlice(mContext); - mAirplaneSafeNetworksSlice.onAirplaneModeChanged(true); - } - - @Test - public void getSlice_airplaneModeOff_shouldBeNotNull() { - mAirplaneSafeNetworksSlice.onAirplaneModeChanged(false); - - assertThat(mAirplaneSafeNetworksSlice.getSlice()).isNotNull(); - } - - @Test - public void getSlice_wifiDisabled_shouldShowTurnOnNetworks() { - when(mWifiManager.isWifiEnabled()).thenReturn(false); - - final Slice slice = mAirplaneSafeNetworksSlice.getSlice(); - - assertThat(slice).isNotNull(); - final SliceItem sliceTitle = - SliceMetadata.from(mContext, slice).getListContent().getHeader().getTitleItem(); - assertThat(sliceTitle.getText()).isEqualTo( - ResourcesUtils.getResourcesString(mContext, "turn_on_networks")); - } - - @Test - public void getSlice_wifiEnabled_shouldShowTurnOffNetworks() { - when(mWifiManager.isWifiEnabled()).thenReturn(true); - - final Slice slice = mAirplaneSafeNetworksSlice.getSlice(); - - assertThat(slice).isNotNull(); - final SliceItem sliceTitle = - SliceMetadata.from(mContext, slice).getListContent().getHeader().getTitleItem(); - assertThat(sliceTitle.getText()).isEqualTo( - ResourcesUtils.getResourcesString(mContext, "turn_off_networks")); - } - - @Test - public void onNotifyChange_turnOnNetworks_shouldSetWifiEnabled() { - when(mWifiManager.isWifiEnabled()).thenReturn(false); - Intent intent = mAirplaneSafeNetworksSlice.getIntent(); - - mAirplaneSafeNetworksSlice.onNotifyChange(intent); - - verify(mWifiManager).setWifiEnabled(true); - } - - @Test - public void onNotifyChange_turnOffNetworks_shouldSetWifiDisabled() { - when(mWifiManager.isWifiEnabled()).thenReturn(true); - Intent intent = mAirplaneSafeNetworksSlice.getIntent(); - - mAirplaneSafeNetworksSlice.onNotifyChange(intent); - - verify(mWifiManager).setWifiEnabled(false); - } -} diff --git a/tests/unit/src/com/android/settings/network/TurnOnWifiSliceTest.java b/tests/unit/src/com/android/settings/network/TurnOnWifiSliceTest.java new file mode 100644 index 00000000000..befa655ce97 --- /dev/null +++ b/tests/unit/src/com/android/settings/network/TurnOnWifiSliceTest.java @@ -0,0 +1,85 @@ +/* + * Copyright (C) 2021 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.network; + +import static com.google.common.truth.Truth.assertThat; + +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import android.content.Context; +import android.content.Intent; +import android.net.wifi.WifiManager; + +import androidx.slice.SliceProvider; +import androidx.slice.widget.SliceLiveData; +import androidx.test.core.app.ApplicationProvider; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +@RunWith(AndroidJUnit4.class) +public class TurnOnWifiSliceTest { + + @Rule + public MockitoRule mMocks = MockitoJUnit.rule(); + @Mock + private WifiManager mWifiManager; + + private Context mContext; + private TurnOnWifiSlice mSlice; + + @Before + public void setUp() { + mContext = spy(ApplicationProvider.getApplicationContext()); + when(mContext.getSystemService(Context.WIFI_SERVICE)).thenReturn(mWifiManager); + + // Set-up specs for SliceMetadata. + SliceProvider.setSpecs(SliceLiveData.SUPPORTED_SPECS); + mSlice = new TurnOnWifiSlice(mContext); + } + + @Test + public void getSlice_wifiEnabled_shouldBeNull() { + when(mWifiManager.isWifiEnabled()).thenReturn(true); + + assertThat(mSlice.getSlice()).isNull(); + } + + @Test + public void getSlice_wifiDisabled_shouldBeNotNull() { + when(mWifiManager.isWifiEnabled()).thenReturn(false); + + assertThat(mSlice.getSlice()).isNotNull(); + } + + @Test + public void onNotifyChange_shouldSetWifiEnabled() { + Intent intent = mSlice.getIntent(); + + mSlice.onNotifyChange(intent); + + verify(mWifiManager).setWifiEnabled(true); + } +} diff --git a/tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java b/tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java index 4b4ec32681c..5d95d9a5fa1 100644 --- a/tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java +++ b/tests/unit/src/com/android/settings/panel/InternetConnectivityPanelTest.java @@ -157,7 +157,7 @@ public class InternetConnectivityPanelTest { assertThat(uris).containsExactly( CustomSliceRegistry.PROVIDER_MODEL_SLICE_URI, - CustomSliceRegistry.AIRPLANE_SAFE_NETWORKS_SLICE_URI); + CustomSliceRegistry.TURN_ON_WIFI_SLICE_URI); } @Test