Redirect intents leading to Security and Privacy pages

We want them to lead to SafetyCenter when it's enabled.

Test: atest SettingsUnitTests
Test: manual: android.settings.PRIVACY_SETTINGS and android.settings.SECURITY_SETTINGS intent actions open the intended target page depending on the flag.
Bug: 204978497

Change-Id: Idc0200f98da359cbf11952393d4c83599f3f541c
diff --git a/src/com/android/settings/Settings.java b/src/com/android/settings/Settings.java
index afd0d15..ed3e230 100644
--- a/src/com/android/settings/Settings.java
+++ b/src/com/android/settings/Settings.java
@@ -16,16 +16,19 @@
 
 package com.android.settings;
 
+import android.content.ActivityNotFoundException;
 import android.content.Context;
 import android.content.Intent;
 import android.os.Bundle;
 import android.text.TextUtils;
 import android.util.FeatureFlagUtils;
+import android.util.Log;
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.settings.core.FeatureFlags;
 import com.android.settings.enterprise.EnterprisePrivacySettings;
 import com.android.settings.overlay.FeatureFactory;
+import com.android.settings.safetycenter.SafetyCenterStatus;
 import com.android.settings.security.SecuritySettingsFeatureProvider;
 
 import com.google.android.setupdesign.util.ThemeHelper;
@@ -131,6 +134,27 @@
     /** Activity for the security dashboard. */
     public static class SecurityDashboardActivity extends SettingsActivity {
 
+        private static final String TAG = "SecurityDashboardActivity";
+
+        @Override
+        protected void onCreate(Bundle savedState) {
+            super.onCreate(savedState);
+            handleSafetyCenterRedirection();
+        }
+
+        /** Redirects to SafetyCenter if enabled. */
+        @VisibleForTesting
+        public void handleSafetyCenterRedirection() {
+            if (SafetyCenterStatus.isEnabled()) {
+                try {
+                    startActivity(new Intent(Intent.ACTION_SAFETY_CENTER));
+                    finish();
+                } catch (ActivityNotFoundException e) {
+                    Log.e(TAG, "Unable to open safety center", e);
+                }
+            }
+        }
+
         /** Whether the given fragment is allowed. */
         @VisibleForTesting
         @Override
@@ -166,7 +190,30 @@
     public static class LocationSettingsActivity extends SettingsActivity { /* empty */ }
     public static class ScanningSettingsActivity extends SettingsActivity { /* empty */ }
     public static class WifiScanningSettingsActivity extends SettingsActivity { /* empty */ }
-    public static class PrivacyDashboardActivity extends SettingsActivity { /* empty */ }
+    /** Activity for the privacy dashboard. */
+    public static class PrivacyDashboardActivity extends SettingsActivity {
+
+        private static final String TAG = "PrivacyDashboardActivity";
+
+        @Override
+        protected void onCreate(Bundle savedState) {
+            super.onCreate(savedState);
+            handleSafetyCenterRedirection();
+        }
+
+        /** Redirects to SafetyCenter if enabled. */
+        @VisibleForTesting
+        public void handleSafetyCenterRedirection() {
+            if (SafetyCenterStatus.isEnabled()) {
+                try {
+                    startActivity(new Intent(Intent.ACTION_SAFETY_CENTER));
+                    finish();
+                } catch (ActivityNotFoundException e) {
+                    Log.e(TAG, "Unable to open safety center", e);
+                }
+            }
+        }
+    }
     public static class PrivacySettingsActivity extends SettingsActivity { /* empty */ }
     public static class FactoryResetActivity extends SettingsActivity {
         @Override
diff --git a/tests/unit/src/com/android/settings/privacy/PrivacyDashboardActivityTest.java b/tests/unit/src/com/android/settings/privacy/PrivacyDashboardActivityTest.java
new file mode 100644
index 0000000..2365553
--- /dev/null
+++ b/tests/unit/src/com/android/settings/privacy/PrivacyDashboardActivityTest.java
@@ -0,0 +1,107 @@
+/*
+ * 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.privacy;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+
+import android.content.Intent;
+import android.provider.DeviceConfig;
+
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.platform.app.InstrumentationRegistry;
+
+import com.android.settings.Settings;
+import com.android.settings.SettingsActivity;
+import com.android.settings.safetycenter.SafetyCenterStatus;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+
+@RunWith(AndroidJUnit4.class)
+public class PrivacyDashboardActivityTest {
+
+    private static final String DEFAULT_FRAGMENT_CLASSNAME = "DefaultFragmentClassname";
+
+    private Settings.PrivacyDashboardActivity mActivity;
+
+    @Before
+    public void setUp() {
+        DeviceConfig.resetToDefaults(android.provider.Settings.RESET_MODE_PACKAGE_DEFAULTS,
+                DeviceConfig.NAMESPACE_PRIVACY);
+        final Intent intent = new Intent();
+        intent.setAction(android.provider.Settings.ACTION_PRIVACY_SETTINGS);
+        intent.setClass(InstrumentationRegistry.getInstrumentation().getTargetContext(),
+                Settings.PrivacyDashboardActivity.class);
+        intent.putExtra(SettingsActivity.EXTRA_SHOW_FRAGMENT, DEFAULT_FRAGMENT_CLASSNAME);
+        InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
+            try {
+                mActivity =
+                        spy((Settings.PrivacyDashboardActivity) InstrumentationRegistry
+                                .getInstrumentation().newActivity(
+                                        getClass().getClassLoader(),
+                                        Settings.PrivacyDashboardActivity.class.getName(),
+                                        intent));
+            } catch (Exception e) {
+                throw new RuntimeException(e); // nothing to do
+            }
+        });
+        doNothing().when(mActivity).startActivity(any(Intent.class));
+    }
+
+    @After
+    public void tearDown() {
+        DeviceConfig.resetToDefaults(android.provider.Settings.RESET_MODE_PACKAGE_DEFAULTS,
+                DeviceConfig.NAMESPACE_PRIVACY);
+    }
+
+    @Test
+    public void onCreate_whenSafetyCenterEnabled_redirectsToSafetyCenter() {
+        DeviceConfig.setProperty(
+                DeviceConfig.NAMESPACE_PRIVACY,
+                SafetyCenterStatus.SAFETY_CENTER_IS_ENABLED,
+                /* value = */ Boolean.toString(true),
+                /* makeDefault = */ false);
+        final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
+
+        mActivity.handleSafetyCenterRedirection();
+
+        verify(mActivity).startActivity(intentCaptor.capture());
+        assertThat(intentCaptor.getValue().getAction()).isEqualTo(Intent.ACTION_SAFETY_CENTER);
+    }
+
+    @Test
+    public void onCreate_whenSafetyCenterDisabled_doesntRedirectToSafetyCenter() {
+        DeviceConfig.setProperty(
+                DeviceConfig.NAMESPACE_PRIVACY,
+                SafetyCenterStatus.SAFETY_CENTER_IS_ENABLED,
+                /* value = */ Boolean.toString(false),
+                /* makeDefault = */ false);
+
+        mActivity.handleSafetyCenterRedirection();
+
+        verify(mActivity, times(0)).startActivity(any());
+    }
+}
diff --git a/tests/unit/src/com/android/settings/security/SecurityDashboardActivityTest.java b/tests/unit/src/com/android/settings/security/SecurityDashboardActivityTest.java
index 3bda96e..0406616 100644
--- a/tests/unit/src/com/android/settings/security/SecurityDashboardActivityTest.java
+++ b/tests/unit/src/com/android/settings/security/SecurityDashboardActivityTest.java
@@ -18,20 +18,29 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import android.content.Intent;
+import android.provider.DeviceConfig;
 
 import androidx.test.ext.junit.runners.AndroidJUnit4;
 import androidx.test.platform.app.InstrumentationRegistry;
 
 import com.android.settings.Settings;
 import com.android.settings.SettingsActivity;
+import com.android.settings.safetycenter.SafetyCenterStatus;
 import com.android.settings.testutils.FakeFeatureFactory;
 
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
 import org.mockito.MockitoAnnotations;
 
 @RunWith(AndroidJUnit4.class)
@@ -48,6 +57,8 @@
         MockitoAnnotations.initMocks(this);
         FakeFeatureFactory mFeatureFactory = FakeFeatureFactory.setupForTest();
         mSecuritySettingsFeatureProvider = mFeatureFactory.getSecuritySettingsFeatureProvider();
+        DeviceConfig.resetToDefaults(android.provider.Settings.RESET_MODE_PACKAGE_DEFAULTS,
+                DeviceConfig.NAMESPACE_PRIVACY);
         mDefaultIntent = new Intent();
         mDefaultIntent.setAction(android.provider.Settings.ACTION_SECURITY_SETTINGS);
         mDefaultIntent.setClass(InstrumentationRegistry.getInstrumentation().getTargetContext(),
@@ -56,15 +67,22 @@
         InstrumentationRegistry.getInstrumentation().runOnMainSync(() -> {
             try {
                 mActivity =
-                        (Settings.SecurityDashboardActivity) InstrumentationRegistry
+                        spy((Settings.SecurityDashboardActivity) InstrumentationRegistry
                                 .getInstrumentation().newActivity(
                                         getClass().getClassLoader(),
                                         Settings.SecurityDashboardActivity.class.getName(),
-                                        mDefaultIntent);
+                                        mDefaultIntent));
             } catch (Exception e) {
                 throw new RuntimeException(e); // nothing to do
             }
         });
+        doNothing().when(mActivity).startActivity(any(Intent.class));
+    }
+
+    @After
+    public void tearDown() {
+        DeviceConfig.resetToDefaults(android.provider.Settings.RESET_MODE_PACKAGE_DEFAULTS,
+                DeviceConfig.NAMESPACE_PRIVACY);
     }
 
     @Test
@@ -104,4 +122,32 @@
 
         assertThat(mActivity.isValidFragment(ALTERNATIVE_FRAGMENT_CLASSNAME)).isTrue();
     }
+
+    @Test
+    public void onCreate_whenSafetyCenterEnabled_redirectsToSafetyCenter() {
+        DeviceConfig.setProperty(
+                DeviceConfig.NAMESPACE_PRIVACY,
+                SafetyCenterStatus.SAFETY_CENTER_IS_ENABLED,
+                /* value = */ Boolean.toString(true),
+                /* makeDefault = */ false);
+        final ArgumentCaptor<Intent> intentCaptor = ArgumentCaptor.forClass(Intent.class);
+
+        mActivity.handleSafetyCenterRedirection();
+
+        verify(mActivity).startActivity(intentCaptor.capture());
+        assertThat(intentCaptor.getValue().getAction()).isEqualTo(Intent.ACTION_SAFETY_CENTER);
+    }
+
+    @Test
+    public void onCreate_whenSafetyCenterDisabled_doesntRedirectToSafetyCenter() {
+        DeviceConfig.setProperty(
+                DeviceConfig.NAMESPACE_PRIVACY,
+                SafetyCenterStatus.SAFETY_CENTER_IS_ENABLED,
+                /* value = */ Boolean.toString(false),
+                /* makeDefault = */ false);
+
+        mActivity.handleSafetyCenterRedirection();
+
+        verify(mActivity, times(0)).startActivity(any());
+    }
 }