diff --git a/res/values/strings.xml b/res/values/strings.xml index f30c63d2f80..969353e703e 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -10266,6 +10266,10 @@ Choose device + + No devices found. Make sure the device is turned on and available to connect. + + Scan again %1$d device connected diff --git a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java index 9aac5090e92..c58ff579110 100644 --- a/src/com/android/settings/wifi/NetworkRequestDialogFragment.java +++ b/src/com/android/settings/wifi/NetworkRequestDialogFragment.java @@ -19,6 +19,8 @@ package com.android.settings.wifi; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; +import android.os.Handler; +import android.os.Message; import androidx.appcompat.app.AlertDialog; import android.os.Bundle; import android.view.LayoutInflater; @@ -37,14 +39,16 @@ import java.util.List; public class NetworkRequestDialogFragment extends InstrumentedDialogFragment implements DialogInterface.OnClickListener { + /** Message sent to us to stop scanning wifi and pop up timeout dialog. */ + private static final int MESSAGE_STOP_SCAN_WIFI_LIST = 0; + + /** Delayed time to stop scanning wifi. */ + private static final int DELAY_TIME_STOP_SCAN_MS = 30*1000; + private List mAccessPointList; - public static NetworkRequestDialogFragment newInstance(int uid, String packageName) { - Bundle args = new Bundle(); - args.putInt("uid", uid); - args.putString("packageName", packageName); + public static NetworkRequestDialogFragment newInstance() { NetworkRequestDialogFragment dialogFragment = new NetworkRequestDialogFragment(); - dialogFragment.setArguments(args); return dialogFragment; } @@ -84,6 +88,44 @@ public class NetworkRequestDialogFragment extends InstrumentedDialogFragment imp public void onClick(DialogInterface dialog, int which) { } + @Override + public void onPause() { + super.onPause(); + + mHandler.removeMessages(MESSAGE_STOP_SCAN_WIFI_LIST); + } + + @Override + public void onResume() { + super.onResume(); + + // TODO(b/117399926): Starts to scan current WiFi. + + // Sets time-out to stop scanning. + mHandler.sendEmptyMessageDelayed(MESSAGE_STOP_SCAN_WIFI_LIST, DELAY_TIME_STOP_SCAN_MS); + } + + private Handler mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case MESSAGE_STOP_SCAN_WIFI_LIST: + removeMessages(MESSAGE_STOP_SCAN_WIFI_LIST); + stopScanningAndPopTimeoutDialog(); + break; + default: + // Do nothing. + break; + } + } + }; + + protected void stopScanningAndPopTimeoutDialog() { + dismiss(); + NetworkRequestTimeoutDialogFragment fragment = NetworkRequestTimeoutDialogFragment.newInstance(); + fragment.show(getActivity().getSupportFragmentManager(), null); + } + @Override public int getMetricsCategory() { return MetricsProto.MetricsEvent.WIFI_SCANNING_NEEDED_DIALOG; diff --git a/src/com/android/settings/wifi/NetworkRequestTimeoutDialogFragment.java b/src/com/android/settings/wifi/NetworkRequestTimeoutDialogFragment.java new file mode 100644 index 00000000000..08f285b0b8c --- /dev/null +++ b/src/com/android/settings/wifi/NetworkRequestTimeoutDialogFragment.java @@ -0,0 +1,66 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.wifi; + +import android.app.Dialog; +import android.content.DialogInterface; +import android.os.Bundle; +import androidx.appcompat.app.AlertDialog; +import com.android.internal.logging.nano.MetricsProto; +import com.android.settings.R; +import com.android.settings.core.instrumentation.InstrumentedDialogFragment; + +public class NetworkRequestTimeoutDialogFragment extends InstrumentedDialogFragment implements + DialogInterface.OnClickListener { + + public static NetworkRequestTimeoutDialogFragment newInstance() { + NetworkRequestTimeoutDialogFragment fragment = new NetworkRequestTimeoutDialogFragment(); + return fragment; + } + + @Override + public Dialog onCreateDialog(Bundle savedInstanceState) { + AlertDialog.Builder builder = new AlertDialog.Builder(getContext()) + .setMessage(R.string.network_connection_timeout_dialog_message) + .setPositiveButton(R.string.network_connection_timeout_dialog_ok, this) + .setNegativeButton(R.string.cancel, null); + return builder.create(); + } + + @Override + public int getMetricsCategory() { + return MetricsProto.MetricsEvent.WIFI_SCANNING_NEEDED_DIALOG; + } + + @Override + public void onClick(DialogInterface dialog, int which) { + switch (which) { + case DialogInterface.BUTTON_POSITIVE: + startScanningDialog(); + break; + case DialogInterface.BUTTON_NEGATIVE: + default: + // Do nothing. + break; + } + } + + protected void startScanningDialog() { + NetworkRequestDialogFragment fragment = NetworkRequestDialogFragment.newInstance(); + fragment.show(getActivity().getSupportFragmentManager(), null); + } +} diff --git a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java index f987f404021..17718a692c7 100644 --- a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java +++ b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogFragmentTest.java @@ -18,8 +18,6 @@ package com.android.settings.wifi; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; - import android.content.DialogInterface; import android.widget.Button; import androidx.appcompat.app.AlertDialog; @@ -33,6 +31,7 @@ import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.annotation.Config; import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; +import org.robolectric.shadows.ShadowLooper; @RunWith(SettingsRobolectricTestRunner.class) @Config(shadows = {SettingsShadowResourcesImpl.class, ShadowAlertDialogCompat.class}) @@ -44,7 +43,7 @@ public class NetworkRequestDialogFragmentTest { @Before public void setUp() { mActivity = Robolectric.setupActivity(FragmentActivity.class); - networkRequestDialogFragment = spy(NetworkRequestDialogFragment.newInstance(-1, null)); + networkRequestDialogFragment = spy(NetworkRequestDialogFragment.newInstance()); } @Test @@ -67,4 +66,26 @@ public class NetworkRequestDialogFragmentTest { positiveButton.performClick(); assertThat(alertDialog.isShowing()).isFalse(); } + + @Test + public void onResumeAndWaitTimeout_shouldCallTimeoutDialog() { + FakeNetworkRequestDialogFragment fakeFragment = new FakeNetworkRequestDialogFragment(); + FakeNetworkRequestDialogFragment spyFakeFragment = spy(fakeFragment); + spyFakeFragment.show(mActivity.getSupportFragmentManager(), null); + + assertThat(fakeFragment.bCalledStopAndPop).isFalse(); + + ShadowLooper.getShadowMainLooper().runToEndOfTasks(); + + assertThat(fakeFragment.bCalledStopAndPop).isTrue(); + } + + class FakeNetworkRequestDialogFragment extends NetworkRequestDialogFragment { + boolean bCalledStopAndPop = false; + + @Override + public void stopScanningAndPopTimeoutDialog() { + bCalledStopAndPop = true; + } + } } diff --git a/tests/robotests/src/com/android/settings/wifi/NetworkRequestTimeoutDialogFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/NetworkRequestTimeoutDialogFragmentTest.java new file mode 100644 index 00000000000..ed28e60c0a1 --- /dev/null +++ b/tests/robotests/src/com/android/settings/wifi/NetworkRequestTimeoutDialogFragmentTest.java @@ -0,0 +1,90 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.wifi; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.internal.verification.VerificationModeFactory.times; + +import android.content.DialogInterface; +import android.widget.Button; +import androidx.appcompat.app.AlertDialog; +import androidx.fragment.app.FragmentActivity; +import com.android.settings.R; +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl; +import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.Robolectric; +import org.robolectric.RuntimeEnvironment; +import org.robolectric.annotation.Config; +import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(shadows = {SettingsShadowResourcesImpl.class, ShadowAlertDialogCompat.class}) +public class NetworkRequestTimeoutDialogFragmentTest { + + private FragmentActivity mActivity; + private NetworkRequestTimeoutDialogFragment mFragment; + + @Before + public void setUp() { + mActivity = Robolectric.setupActivity(FragmentActivity.class); + mFragment = spy(NetworkRequestTimeoutDialogFragment.newInstance()); + mFragment.show(mActivity.getSupportFragmentManager(), null); + } + + @Test + public void display_shouldShowTheDialog() { + AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + + assertThat(alertDialog).isNotNull(); + assertThat(alertDialog.isShowing()).isTrue(); + + ShadowAlertDialogCompat shadowAlertDialog = ShadowAlertDialogCompat.shadowOf(alertDialog); + assertThat(RuntimeEnvironment.application + .getString(R.string.network_connection_timeout_dialog_message)) + .isEqualTo(shadowAlertDialog.getMessage()); + } + + @Test + public void clickPositiveButton_shouldCallStartScanningDialog() { + AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + assertThat(alertDialog.isShowing()).isTrue(); + + Button positiveButton = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE); + assertThat(positiveButton).isNotNull(); + + positiveButton.performClick(); + verify(mFragment, times(1)).startScanningDialog(); + } + + @Test + public void clickNegativeButton_shouldCloseTheDialog() { + AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + assertThat(alertDialog.isShowing()).isTrue(); + + Button negativeButton = alertDialog.getButton(DialogInterface.BUTTON_NEGATIVE); + assertThat(negativeButton).isNotNull(); + + negativeButton.performClick(); + assertThat(alertDialog.isShowing()).isFalse(); + } +}