import android.app.ActionBar;
import android.app.settings.SettingsEnums;
import android.content.Intent;
+import android.net.wifi.WifiConfiguration;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.provider.Settings;
import android.util.Log;
import com.android.settings.R;
import com.android.settings.core.InstrumentedActivity;
+import java.util.List;
+
/**
* To provision "other" device with specified Wi-Fi network.
*
/** The Wi-Fi DPP QR code from intent ACTION_PROCESS_WIFI_EASY_CONNECT_QR_CODE */
private WifiQrCode mWifiDppQrCode;
+
/** Secret extra that allows fake networks to show in UI for testing purposes */
private boolean mIsTest;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ setContentView(R.layout.wifi_dpp_activity);
+ mFragmentManager = getSupportFragmentManager();
+
if (savedInstanceState != null) {
String qrCode = savedInstanceState.getString(KEY_QR_CODE);
mWifiNetworkConfig = WifiNetworkConfig.getValidConfigOrNull(security, ssid,
preSharedKey, hiddenSsid, networkId);
+ } else {
+ handleIntent(getIntent());
}
- setContentView(R.layout.wifi_dpp_activity);
- mFragmentManager = getSupportFragmentManager();
-
- handleIntent(getIntent());
-
ActionBar actionBar = getActionBar();
if (actionBar != null) {
actionBar.setElevation(0);
if (mWifiDppQrCode == null || !isDppSupported) {
cancelActivity = true;
} else {
- showChooseSavedWifiNetworkFragment(/* addToBackStack */ false);
+ final WifiNetworkConfig connectedConfig = getConnectedWifiNetworkConfigOrNull();
+ if (connectedConfig == null) {
+ showChooseSavedWifiNetworkFragment(/* addToBackStack */ false);
+ } else {
+ mWifiNetworkConfig = connectedConfig;
+ showAddDeviceFragment(/* addToBackStack */ false);
+ }
}
break;
default:
WifiDppQrCodeScannerFragment fragment =
(WifiDppQrCodeScannerFragment) mFragmentManager.findFragmentByTag(
WifiDppUtils.TAG_FRAGMENT_QR_CODE_SCANNER);
- // Avoid to replace the same fragment during configuration change
- if (fragment != null && fragment.isVisible()) {
- return;
- }
if (fragment == null) {
fragment = new WifiDppQrCodeScannerFragment();
+ } else {
+ if (fragment.isVisible()) {
+ return;
+ }
+
+ // When the fragment in back stack but not on top of the stack, we can simply pop
+ // stack because current fragment transactions are arranged in an order
+ mFragmentManager.popBackStackImmediate();
+ return;
}
final FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
WifiDppQrCodeGeneratorFragment fragment =
(WifiDppQrCodeGeneratorFragment) mFragmentManager.findFragmentByTag(
WifiDppUtils.TAG_FRAGMENT_QR_CODE_GENERATOR);
- // Avoid to replace the same fragment during configuration change
- if (fragment != null && fragment.isVisible()) {
+
+ if (fragment == null) {
+ fragment = new WifiDppQrCodeGeneratorFragment();
+ } else {
+ if (fragment.isVisible()) {
+ return;
+ }
+
+ // When the fragment in back stack but not on top of the stack, we can simply pop
+ // stack because current fragment transactions are arranged in an order
+ mFragmentManager.popBackStackImmediate();
return;
}
-
- fragment = new WifiDppQrCodeGeneratorFragment();
final FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, fragment,
WifiDppChooseSavedWifiNetworkFragment fragment =
(WifiDppChooseSavedWifiNetworkFragment) mFragmentManager.findFragmentByTag(
WifiDppUtils.TAG_FRAGMENT_CHOOSE_SAVED_WIFI_NETWORK);
- // Avoid to replace the same fragment during configuration change
- if (fragment != null && fragment.isVisible()) {
- return;
- }
if (fragment == null) {
fragment = new WifiDppChooseSavedWifiNetworkFragment();
bundle.putBoolean(WifiDppUtils.EXTRA_TEST, true);
fragment.setArguments(bundle);
}
+ } else {
+ if (fragment.isVisible()) {
+ return;
+ }
+
+ // When the fragment in back stack but not on top of the stack, we can simply pop
+ // stack because current fragment transactions are arranged in an order
+ mFragmentManager.popBackStackImmediate();
+ return;
}
final FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
(WifiDppAddDeviceFragment) mFragmentManager.findFragmentByTag(
WifiDppUtils.TAG_FRAGMENT_ADD_DEVICE);
- // Avoid to replace the same fragment during configuration change
- if (mFragmentManager.findFragmentByTag(
- WifiDppUtils.TAG_FRAGMENT_ADD_DEVICE) != null) {
- return;
- }
-
if (fragment == null) {
fragment = new WifiDppAddDeviceFragment();
+ } else {
+ if (fragment.isVisible()) {
+ return;
+ }
+
+ // When the fragment in back stack but not on top of the stack, we can simply pop
+ // stack because current fragment transactions are arranged in an order
+ mFragmentManager.popBackStackImmediate();
+ return;
}
final FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
showAddDeviceFragment(/* addToBackStack */ true);
}
+
+ private WifiNetworkConfig getConnectedWifiNetworkConfigOrNull() {
+ final WifiManager wifiManager = getSystemService(WifiManager.class);
+ if (!wifiManager.isWifiEnabled()) {
+ return null;
+ }
+
+ final WifiInfo connectionInfo = wifiManager.getConnectionInfo();
+ if (connectionInfo == null) {
+ return null;
+ }
+
+ final int connectionNetworkId = connectionInfo.getNetworkId();
+ final List<WifiConfiguration> configs = wifiManager.getConfiguredNetworks();
+ for (WifiConfiguration wifiConfiguration : configs) {
+ if (wifiConfiguration.networkId == connectionNetworkId) {
+ return WifiNetworkConfig.getValidConfigOrNull(
+ WifiDppUtils.getSecurityString(wifiConfiguration),
+ wifiConfiguration.getPrintableSsid(),
+ wifiConfiguration.preSharedKey,
+ /* hiddenSsid */ false,
+ wifiConfiguration.networkId);
+ }
+ }
+
+ return null;
+ }
}
setContentView(R.layout.wifi_dpp_activity);
mFragmentManager = getSupportFragmentManager();
- handleIntent(getIntent());
+ if (savedInstanceState == null) {
+ handleIntent(getIntent());
+ }
ActionBar actionBar = getActionBar();
if (actionBar != null) {
}
private void showQrCodeScannerFragment(boolean addToBackStack, String ssid) {
- // Avoid to replace the same fragment during configuration change
- if (mFragmentManager.findFragmentByTag(WifiDppUtils.TAG_FRAGMENT_QR_CODE_SCANNER) != null) {
+ WifiDppQrCodeScannerFragment fragment =
+ (WifiDppQrCodeScannerFragment) mFragmentManager.findFragmentByTag(
+ WifiDppUtils.TAG_FRAGMENT_QR_CODE_SCANNER);
+
+ if (fragment == null) {
+ fragment = new WifiDppQrCodeScannerFragment(ssid);
+ } else {
+ if (fragment.isVisible()) {
+ return;
+ }
+
+ // When the fragment in back stack but not on top of the stack, we can simply pop
+ // stack because current fragment transactions are arranged in an order
+ mFragmentManager.popBackStackImmediate();
return;
}
-
- WifiDppQrCodeScannerFragment fragment = new WifiDppQrCodeScannerFragment(ssid);
- FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
+ final FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, fragment,
WifiDppUtils.TAG_FRAGMENT_QR_CODE_SCANNER);
import android.app.settings.SettingsEnums;
import android.content.Context;
import android.content.Intent;
-import android.net.NetworkInfo.DetailedState;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
-import androidx.annotation.VisibleForTesting;
import androidx.preference.Preference;
import androidx.preference.PreferenceCategory;
private WifiManager.ActionListener mSaveListener;
private boolean mIsTest;
- @VisibleForTesting
- boolean mUseConnectedAccessPointDirectly;
-
// Container Activity must implement this interface
public interface OnChooseNetworkListener {
public void onChooseNetwork(WifiNetworkConfig wifiNetworkConfig);
}
}
};
-
- mUseConnectedAccessPointDirectly = true;
}
@Override
if (isValidForDppConfiguration(accessPoint)) {
final String key = accessPoint.getKey();
- // Check if this access point is already connected.
- if (mUseConnectedAccessPointDirectly
- && accessPoint.getDetailedState() == DetailedState.CONNECTED) {
- // Uses connected access point to start DPP in Configurator-Initiator role
- // directly.
- onPreferenceTreeClick(createAccessPointPreference(accessPoint));
- removeCachedPrefs(mAccessPointsPreferenceCategory);
- return;
- }
-
final AccessPointPreference pref = (AccessPointPreference) getCachedPreference(key);
if (pref != null) {
pref.setOrder(index);