diff --git a/AndroidManifest.xml b/AndroidManifest.xml index 2d2f5843cf3..eae17302284 100644 --- a/AndroidManifest.xml +++ b/AndroidManifest.xml @@ -2585,6 +2585,18 @@ + + + + + + + mAccessPointList; - private AccessPointAdapter mDialogAdapter; - private NetworkRequestUserSelectionCallback mUserSelectionCallback; + private List mAccessPointList; + private AccessPointAdapter mDialogAdapter; + private NetworkRequestUserSelectionCallback mUserSelectionCallback; - public static NetworkRequestDialogFragment newInstance() { - NetworkRequestDialogFragment dialogFragment = new NetworkRequestDialogFragment(); - return dialogFragment; - } - - @Override - public Dialog onCreateDialog(Bundle savedInstanceState) { - final Context context = getContext(); - - // Prepares title. - final LayoutInflater inflater = LayoutInflater.from(context); - final View customTitle = inflater.inflate(R.layout.network_request_dialog_title, null); - - final TextView title = customTitle.findViewById(R.id.network_request_title_text); - title.setText(R.string.network_connection_request_dialog_title); - final ProgressBar progressBar = customTitle.findViewById(R.id.network_request_title_progress); - progressBar.setVisibility(View.VISIBLE); - - // Prepares adapter. - mDialogAdapter = new AccessPointAdapter(context, - R.layout.preference_access_point, getAccessPointList()); - - final AlertDialog.Builder builder = new AlertDialog.Builder(context) - .setCustomTitle(customTitle) - .setAdapter(mDialogAdapter, this) - .setPositiveButton(R.string.cancel, (dialog, which) -> dialog.dismiss()); - return builder.create(); - } - - @NonNull - List getAccessPointList() { - // Initials list for adapter, in case of display crashing. - if (mAccessPointList == null) { - mAccessPointList = new ArrayList<>(); - } - return mAccessPointList; - } - - private BaseAdapter getDialogAdapter() { - return mDialogAdapter; - } - - @Override - public void onClick(DialogInterface dialog, int which) { - final List accessPointList = getAccessPointList(); - if (accessPointList.size() == 0) { - return; // Invalid values. - } - if (mUserSelectionCallback == null) { - return; // Callback is missing or not ready. - } - - if (which < accessPointList.size()) { - WifiConfiguration wifiConfig = accessPointList.get(which).getConfig(); - mUserSelectionCallback.select(wifiConfig); - } - } - - @Override - public void onPause() { - super.onPause(); - - mHandler.removeMessages(MESSAGE_STOP_SCAN_WIFI_LIST); - final WifiManager wifiManager = getContext().getApplicationContext() - .getSystemService(WifiManager.class); - if (wifiManager != null) { - wifiManager.unregisterNetworkRequestMatchCallback(this); - } - } - - @Override - public void onResume() { - super.onResume(); - - final WifiManager wifiManager = getContext().getApplicationContext() - .getSystemService(WifiManager.class); - if (wifiManager != null) { - wifiManager.registerNetworkRequestMatchCallback(this, mHandler); - } - // Sets time-out to stop scanning. - mHandler.sendEmptyMessageDelayed(MESSAGE_STOP_SCAN_WIFI_LIST, DELAY_TIME_STOP_SCAN_MS); - } - - private final 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() { - // Dismisses current dialog. - dismiss(); - - // Throws new timeout dialog. - final NetworkRequestTimeoutDialogFragment fragment = NetworkRequestTimeoutDialogFragment - .newInstance(); - fragment.show(getActivity().getSupportFragmentManager(), null); - } - - @Override - public int getMetricsCategory() { - return MetricsProto.MetricsEvent.WIFI_SCANNING_NEEDED_DIALOG; - } - - private class AccessPointAdapter extends ArrayAdapter { - - private final int mResourceId; - private final LayoutInflater mInflater; - - public AccessPointAdapter(Context context, int resourceId, List objects) { - super(context, resourceId, objects); - mResourceId = resourceId; - mInflater = LayoutInflater.from(context); + public static NetworkRequestDialogFragment newInstance() { + NetworkRequestDialogFragment dialogFragment = new NetworkRequestDialogFragment(); + return dialogFragment; } @Override - public View getView(int position, View view, ViewGroup parent) { - if (view == null) { - view = mInflater.inflate(mResourceId, parent, false); + public Dialog onCreateDialog(Bundle savedInstanceState) { + final Context context = getContext(); - final View divider = view.findViewById(com.android.settingslib.R.id.two_target_divider); - divider.setVisibility(View.GONE); - } + // Prepares title. + final LayoutInflater inflater = LayoutInflater.from(context); + final View customTitle = inflater.inflate(R.layout.network_request_dialog_title, null); - final AccessPoint accessPoint = getItem(position); + final TextView title = customTitle.findViewById(R.id.network_request_title_text); + title.setText(R.string.network_connection_request_dialog_title); + final ProgressBar progressBar = customTitle.findViewById( + R.id.network_request_title_progress); + progressBar.setVisibility(View.VISIBLE); - final TextView titleView = view.findViewById(android.R.id.title); - if (titleView != null) { - titleView.setText(accessPoint.getSsidStr()); - } + // Prepares adapter. + mDialogAdapter = new AccessPointAdapter(context, + R.layout.preference_access_point, getAccessPointList()); - final TextView summary = view.findViewById(android.R.id.summary); - if (summary != null) { - summary.setText(accessPoint.getSettingsSummary()); - } + final AlertDialog.Builder builder = new AlertDialog.Builder(context) + .setCustomTitle(customTitle) + .setAdapter(mDialogAdapter, this) + .setPositiveButton(R.string.cancel, (dialog, which) -> getActivity().finish()); - final PreferenceImageView imageView = view.findViewById(android.R.id.icon); - final int level = accessPoint.getLevel(); - if (imageView != null) { - final Drawable drawable = getContext().getDrawable(Utils.getWifiIconResource(level)); - drawable.setTintList(Utils.getColorAttr(getContext(), android.R.attr.colorControlNormal)); - imageView.setImageDrawable(drawable); - } - - return view; - } - } - - @Override - public void onAbort() { - // TODO(b/117399926): We should have a UI notify user here. - } - - @Override - public void onUserSelectionCallbackRegistration( - NetworkRequestUserSelectionCallback userSelectionCallback) { - mUserSelectionCallback = userSelectionCallback; - } - - @Override - public void onMatch(List scanResults) { - // TODO(b/119846365): Checks if we could escalate the converting effort. - // Converts ScanResult to WifiConfiguration. - List wifiConfigurations = null; - final WifiManager wifiManager = getContext().getApplicationContext() - .getSystemService(WifiManager.class); - if (wifiManager != null) { - wifiConfigurations = wifiManager.getAllMatchingWifiConfigs(scanResults); + // Clicking list item is to connect wifi ap. + final AlertDialog dialog = builder.create(); + dialog.getListView() + .setOnItemClickListener( + (parent, view, position, id) -> this.onClick(dialog, position)); + return dialog; } - setUpAccessPointList(wifiConfigurations); - - if (getDialogAdapter() != null) { - getDialogAdapter().notifyDataSetChanged(); - } - } - - @Override - public void onUserSelectionConnectSuccess(WifiConfiguration wificonfiguration) { - if (getDialogAdapter() != null) { - updateAccessPointListItem(wificonfiguration); - getDialogAdapter().notifyDataSetChanged(); - } - } - - @Override - public void onUserSelectionConnectFailure(WifiConfiguration wificonfiguration) { - if (mDialogAdapter != null) { - updateAccessPointListItem(wificonfiguration); - getDialogAdapter().notifyDataSetChanged(); - } - } - - private void updateAccessPointListItem(WifiConfiguration wificonfiguration) { - if (wificonfiguration == null) { - return; + @NonNull + List getAccessPointList() { + // Initials list for adapter, in case of display crashing. + if (mAccessPointList == null) { + mAccessPointList = new ArrayList<>(); + } + return mAccessPointList; } - final List accessPointList = getAccessPointList(); - final int accessPointListSize = accessPointList.size(); - - for (int i = 0; i < accessPointListSize; i++) { - AccessPoint accessPoint = accessPointList.get(i); - // It is the same AccessPoint SSID, and should be replaced to update latest properties. - if (accessPoint.matches(wificonfiguration)) { - accessPointList.set(i, new AccessPoint(getContext(), wificonfiguration)); - break; - } - } - } - - private void setUpAccessPointList(List wifiConfigurations) { - // Grants for zero size input, since maybe current wifi is off or somethings are wrong. - if (wifiConfigurations == null) { - return; + private BaseAdapter getDialogAdapter() { + return mDialogAdapter; } - final List accessPointList = getAccessPointList(); - accessPointList.clear(); - for (WifiConfiguration config : wifiConfigurations) { - accessPointList.add(new AccessPoint(getContext(), config)); + @Override + public void onClick(DialogInterface dialog, int which) { + final List accessPointList = getAccessPointList(); + if (accessPointList.size() == 0) { + return; // Invalid values. + } + if (mUserSelectionCallback == null) { + return; // Callback is missing or not ready. + } + + if (which < accessPointList.size()) { + WifiConfiguration wifiConfig = accessPointList.get(which).getConfig(); + mUserSelectionCallback.select(wifiConfig); + } } - } -} \ No newline at end of file + + @Override + public void onCancel(@NonNull DialogInterface dialog) { + super.onCancel(dialog); + // Finishes activity when user clicks back key or outside of dialog. + getActivity().finish(); + } + + @Override + public void onPause() { + super.onPause(); + + mHandler.removeMessages(MESSAGE_STOP_SCAN_WIFI_LIST); + final WifiManager wifiManager = getContext().getApplicationContext() + .getSystemService(WifiManager.class); + if (wifiManager != null) { + wifiManager.unregisterNetworkRequestMatchCallback(this); + } + } + + @Override + public void onResume() { + super.onResume(); + + final WifiManager wifiManager = getContext().getApplicationContext() + .getSystemService(WifiManager.class); + if (wifiManager != null) { + wifiManager.registerNetworkRequestMatchCallback(this, mHandler); + } + // Sets time-out to stop scanning. + mHandler.sendEmptyMessageDelayed(MESSAGE_STOP_SCAN_WIFI_LIST, DELAY_TIME_STOP_SCAN_MS); + } + + private final 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() { + // Dismisses current dialog. + dismiss(); + + // Throws new timeout dialog. + final NetworkRequestTimeoutDialogFragment fragment = NetworkRequestTimeoutDialogFragment + .newInstance(); + fragment.show(getActivity().getSupportFragmentManager(), null); + } + + @Override + public int getMetricsCategory() { + return MetricsProto.MetricsEvent.WIFI_SCANNING_NEEDED_DIALOG; + } + + private class AccessPointAdapter extends ArrayAdapter { + + private final int mResourceId; + private final LayoutInflater mInflater; + + public AccessPointAdapter(Context context, int resourceId, List objects) { + super(context, resourceId, objects); + mResourceId = resourceId; + mInflater = LayoutInflater.from(context); + } + + @Override + public View getView(int position, View view, ViewGroup parent) { + if (view == null) { + view = mInflater.inflate(mResourceId, parent, false); + + final View divider = view.findViewById( + com.android.settingslib.R.id.two_target_divider); + divider.setVisibility(View.GONE); + } + + final AccessPoint accessPoint = getItem(position); + + final TextView titleView = view.findViewById(android.R.id.title); + if (titleView != null) { + titleView.setText(accessPoint.getSsidStr()); + } + + final TextView summary = view.findViewById(android.R.id.summary); + if (summary != null) { + summary.setText(accessPoint.getSettingsSummary()); + } + + final PreferenceImageView imageView = view.findViewById(android.R.id.icon); + final int level = accessPoint.getLevel(); + if (imageView != null) { + final Drawable drawable = getContext().getDrawable( + Utils.getWifiIconResource(level)); + drawable.setTintList( + Utils.getColorAttr(getContext(), android.R.attr.colorControlNormal)); + imageView.setImageDrawable(drawable); + } + + return view; + } + } + + @Override + public void onAbort() { + // TODO(b/117399926): We should have a UI notify user here. + } + + @Override + public void onUserSelectionCallbackRegistration( + NetworkRequestUserSelectionCallback userSelectionCallback) { + mUserSelectionCallback = userSelectionCallback; + } + + @Override + public void onMatch(List scanResults) { + // TODO(b/119846365): Checks if we could escalate the converting effort. + // Converts ScanResult to WifiConfiguration. + List wifiConfigurations = null; + final WifiManager wifiManager = getContext().getApplicationContext() + .getSystemService(WifiManager.class); + if (wifiManager != null) { + wifiConfigurations = wifiManager.getAllMatchingWifiConfigs(scanResults); + } + + setUpAccessPointList(wifiConfigurations); + + if (getDialogAdapter() != null) { + getDialogAdapter().notifyDataSetChanged(); + } + } + + @Override + public void onUserSelectionConnectSuccess(WifiConfiguration wificonfiguration) { + if (getDialogAdapter() != null) { + updateAccessPointListItem(wificonfiguration); + getDialogAdapter().notifyDataSetChanged(); + } + } + + @Override + public void onUserSelectionConnectFailure(WifiConfiguration wificonfiguration) { + if (mDialogAdapter != null) { + updateAccessPointListItem(wificonfiguration); + getDialogAdapter().notifyDataSetChanged(); + } + } + + private void updateAccessPointListItem(WifiConfiguration wificonfiguration) { + if (wificonfiguration == null) { + return; + } + + final List accessPointList = getAccessPointList(); + final int accessPointListSize = accessPointList.size(); + + for (int i = 0; i < accessPointListSize; i++) { + AccessPoint accessPoint = accessPointList.get(i); + // It is the same AccessPoint SSID, and should be replaced to update latest properties. + if (accessPoint.matches(wificonfiguration)) { + accessPointList.set(i, new AccessPoint(getContext(), wificonfiguration)); + break; + } + } + } + + private void setUpAccessPointList(List wifiConfigurations) { + // Grants for zero size input, since maybe current wifi is off or somethings are wrong. + if (wifiConfigurations == null) { + return; + } + + final List accessPointList = getAccessPointList(); + accessPointList.clear(); + for (WifiConfiguration config : wifiConfigurations) { + accessPointList.add(new AccessPoint(getContext(), config)); + } + } +} diff --git a/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogActivityTest.java b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogActivityTest.java new file mode 100644 index 00000000000..4889c830d60 --- /dev/null +++ b/tests/robotests/src/com/android/settings/wifi/NetworkRequestDialogActivityTest.java @@ -0,0 +1,48 @@ +/* + * 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 androidx.appcompat.app.AlertDialog; + +import com.android.settings.testutils.SettingsRobolectricTestRunner; +import com.android.settings.testutils.shadow.SettingsShadowResourcesImpl; +import com.android.settings.testutils.shadow.ShadowAlertDialogCompat; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.Robolectric; +import org.robolectric.annotation.Config; + +@RunWith(SettingsRobolectricTestRunner.class) +@Config(shadows = { + ShadowAlertDialogCompat.class, + SettingsShadowResourcesImpl.class +}) +public class NetworkRequestDialogActivityTest { + + @Test + public void LaunchActivity_shouldShowNetworkRequestDialog() { + NetworkRequestDialogActivity activity = Robolectric + .setupActivity(NetworkRequestDialogActivity.class); + + AlertDialog alertDialog = ShadowAlertDialogCompat.getLatestAlertDialog(); + + assertThat(alertDialog.isShowing()).isTrue(); + } +}