Merge "Prevent leaking Wi-Fi dialog on lock screen" into tm-qpr-dev am: bd41fe5a5b

Original change: https://googleplex-android-review.googlesource.com/c/platform/packages/apps/Settings/+/19207636

Change-Id: I8ea19a4c48286a2185450116f06a3314087c5be8
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
TreeHugger Robot
2022-07-19 17:21:39 +00:00
committed by Automerger Merge Worker
2 changed files with 91 additions and 3 deletions

View File

@@ -19,6 +19,7 @@ package com.android.settings.wifi;
import static android.Manifest.permission.ACCESS_FINE_LOCATION; import static android.Manifest.permission.ACCESS_FINE_LOCATION;
import static android.os.UserManager.DISALLOW_CONFIG_WIFI; import static android.os.UserManager.DISALLOW_CONFIG_WIFI;
import android.app.KeyguardManager;
import android.content.DialogInterface; import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
@@ -51,6 +52,7 @@ import com.android.wifitrackerlib.WifiEntry;
import com.google.android.setupcompat.util.WizardManagerHelper; import com.google.android.setupcompat.util.WizardManagerHelper;
import com.google.android.setupdesign.util.ThemeHelper; import com.google.android.setupdesign.util.ThemeHelper;
import java.lang.ref.WeakReference;
import java.time.Clock; import java.time.Clock;
import java.time.ZoneOffset; import java.time.ZoneOffset;
@@ -96,10 +98,12 @@ public class WifiDialogActivity extends ObservableActivity implements WifiDialog
// Interval between initiating NetworkDetailsTracker scans. // Interval between initiating NetworkDetailsTracker scans.
private static final long SCAN_INTERVAL_MILLIS = 10_000; private static final long SCAN_INTERVAL_MILLIS = 10_000;
private WifiDialog mDialog; @VisibleForTesting
WifiDialog mDialog;
private AccessPoint mAccessPoint; private AccessPoint mAccessPoint;
private WifiDialog2 mDialog2; @VisibleForTesting
WifiDialog2 mDialog2;
// The received intent supports a key of WifiTrackerLib or SettingsLib. // The received intent supports a key of WifiTrackerLib or SettingsLib.
private boolean mIsWifiTrackerLib; private boolean mIsWifiTrackerLib;
@@ -108,6 +112,7 @@ public class WifiDialogActivity extends ObservableActivity implements WifiDialog
private NetworkDetailsTracker mNetworkDetailsTracker; private NetworkDetailsTracker mNetworkDetailsTracker;
private HandlerThread mWorkerThread; private HandlerThread mWorkerThread;
private WifiManager mWifiManager; private WifiManager mWifiManager;
private LockScreenMonitor mLockScreenMonitor;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@@ -184,6 +189,10 @@ public class WifiDialogActivity extends ObservableActivity implements WifiDialog
mDialog.setOnDismissListener(this); mDialog.setOnDismissListener(this);
} }
} }
if (mDialog2 != null || mDialog != null) {
mLockScreenMonitor = new LockScreenMonitor(this);
}
} }
@VisibleForTesting @VisibleForTesting
@@ -221,6 +230,10 @@ public class WifiDialogActivity extends ObservableActivity implements WifiDialog
} }
} }
if (mLockScreenMonitor != null) {
mLockScreenMonitor.release();
mLockScreenMonitor = null;
}
super.onDestroy(); super.onDestroy();
} }
@@ -411,4 +424,45 @@ public class WifiDialogActivity extends ObservableActivity implements WifiDialog
} }
return false; return false;
} }
void dismissDialog() {
if (mDialog != null) {
mDialog.dismiss();
mDialog = null;
}
if (mDialog2 != null) {
mDialog2.dismiss();
mDialog2 = null;
}
}
@VisibleForTesting
static final class LockScreenMonitor implements KeyguardManager.KeyguardLockedStateListener {
private final WeakReference<WifiDialogActivity> mWifiDialogActivity;
private KeyguardManager mKeyguardManager;
LockScreenMonitor(WifiDialogActivity activity) {
mWifiDialogActivity = new WeakReference<>(activity);
mKeyguardManager = activity.getSystemService(KeyguardManager.class);
mKeyguardManager.addKeyguardLockedStateListener(activity.getMainExecutor(), this);
}
void release() {
if (mKeyguardManager == null) return;
mKeyguardManager.removeKeyguardLockedStateListener(this);
mKeyguardManager = null;
}
@Override
public void onKeyguardLockedStateChanged(boolean isKeyguardLocked) {
if (!isKeyguardLocked) return;
WifiDialogActivity activity = mWifiDialogActivity.get();
if (activity == null) return;
activity.dismissDialog();
Log.e(TAG, "Dismiss Wi-Fi dialog to prevent leaking user data on lock screen!");
EventLog.writeEvent(0x534e4554, "231583603", -1 /* UID */,
"Leak Wi-Fi dialog on lock screen");
}
}
} }

View File

@@ -33,6 +33,7 @@ import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import android.app.KeyguardManager;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiConfiguration;
@@ -46,7 +47,6 @@ import com.android.wifitrackerlib.WifiEntry;
import com.google.android.setupcompat.util.WizardManagerHelper; import com.google.android.setupcompat.util.WizardManagerHelper;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.mockito.Mock; import org.mockito.Mock;
@@ -82,6 +82,8 @@ public class WifiDialogActivityTest {
Intent mResultData; Intent mResultData;
@Mock @Mock
WifiConfigController mController; WifiConfigController mController;
@Mock
KeyguardManager mKeyguardManager;
WifiDialogActivity mActivity; WifiDialogActivity mActivity;
@@ -99,6 +101,7 @@ public class WifiDialogActivityTest {
mActivity = spy(Robolectric.setupActivity(WifiDialogActivity.class)); mActivity = spy(Robolectric.setupActivity(WifiDialogActivity.class));
when(mActivity.getSystemService(UserManager.class)).thenReturn(mUserManager); when(mActivity.getSystemService(UserManager.class)).thenReturn(mUserManager);
when(mActivity.getSystemService(WifiManager.class)).thenReturn(mWifiManager); when(mActivity.getSystemService(WifiManager.class)).thenReturn(mWifiManager);
when(mActivity.getSystemService(KeyguardManager.class)).thenReturn(mKeyguardManager);
} }
@Test @Test
@@ -294,4 +297,35 @@ public class WifiDialogActivityTest {
assertThat(result).isTrue(); assertThat(result).isTrue();
} }
@Test
public void dismissDialog_hasDialog_dialogDismiss() {
mActivity.mDialog = mWifiDialog;
mActivity.mDialog2 = mWifiDialog2;
mActivity.dismissDialog();
verify(mWifiDialog).dismiss();
verify(mWifiDialog2).dismiss();
}
@Test
public void onKeyguardLockedStateChanged_keyguardIsNotLocked_doNotDismissDialog() {
WifiDialogActivity.LockScreenMonitor lockScreenMonitor =
new WifiDialogActivity.LockScreenMonitor(mActivity);
lockScreenMonitor.onKeyguardLockedStateChanged(false /* isKeyguardLocked */);
verify(mActivity, never()).dismissDialog();
}
@Test
public void onKeyguardLockedStateChanged_keyguardIsLocked_dismissDialog() {
WifiDialogActivity.LockScreenMonitor lockScreenMonitor =
new WifiDialogActivity.LockScreenMonitor(mActivity);
lockScreenMonitor.onKeyguardLockedStateChanged(true /* isKeyguardLocked */);
verify(mActivity).dismissDialog();
}
} }