Merge "Fix NPE of AccessibilityShortcutPreferenceFragmentTest."
diff --git a/packages/apps/Settings/src/com/android/settings/dream/OWNERS b/packages/apps/Settings/src/com/android/settings/dream/OWNERS
new file mode 100644
index 0000000..56e1b39
--- /dev/null
+++ b/packages/apps/Settings/src/com/android/settings/dream/OWNERS
@@ -0,0 +1 @@
+lusilva@google.com
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 77d12d7..0107358 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -5502,7 +5502,7 @@
     <!-- Used in the accessibility service settings to open the activity. [CHAR LIMIT=NONE] -->
     <string name="accessibility_service_primary_open_title">Open <xliff:g id="accessibility_app_name" example="TalkBack">%1$s</xliff:g></string>
     <!-- Used in the accessibility service settings to show quick settings tooltips. [CHAR LIMIT=NONE] -->
-    <string name="accessibility_service_quick_settings_tooltips_content">Swipe down to quickly turn <xliff:g id="accessibility_app_name" example="TalkBack">%1$s</xliff:g> on or off in quick settings</string>
+    <string name="accessibility_service_quick_settings_tooltips_content"><xliff:g id="accessibility_app_name" example="TalkBack">%1$s</xliff:g> added to Quick Settings. Swipe down to turn it on or off anytime.</string>
     <!-- Used in the accessibility action for accessibility quick settings tooltips to dismiss. [CHAR LIMIT=NONE] -->
     <string name="accessibility_quick_settings_tooltips_dismiss">Dismiss</string>
     <!-- Used in the Color correction settings screen to control turning on/off the feature entirely [CHAR LIMIT=60] -->
diff --git a/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java b/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java
index 1b3b47a..fe20a01 100644
--- a/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java
+++ b/src/com/android/settings/datausage/DataUsageSummaryPreferenceController.java
@@ -123,13 +123,13 @@
         mDataUsageController = null;
     }
 
-    private void updateConfiguration(Context context,
+    protected void updateConfiguration(Context context,
             int subscriptionId, SubscriptionInfo subInfo) {
         final NetworkPolicyManager policyManager =
                 context.getSystemService(NetworkPolicyManager.class);
         mPolicyEditor = new NetworkPolicyEditor(policyManager);
 
-        mDataUsageController = new DataUsageController(context);
+        mDataUsageController = createDataUsageController(context);
         mDataUsageController.setSubscriptionId(subscriptionId);
         mDataInfoController = new DataUsageInfoController();
 
@@ -146,6 +146,11 @@
     }
 
     @VisibleForTesting
+    DataUsageController createDataUsageController(Context context) {
+        return new DataUsageController(context);
+    }
+
+    @VisibleForTesting
     DataUsageSummaryPreferenceController(
             DataUsageController dataUsageController,
             DataUsageInfoController dataInfoController,
@@ -186,8 +191,7 @@
                 .getSubscriptionPlans(subscriptionId);
     }
 
-    @VisibleForTesting
-    SubscriptionInfo getSubscriptionInfo(int subscriptionId) {
+    protected SubscriptionInfo getSubscriptionInfo(int subscriptionId) {
         if (!mHasMobileData) {
             return null;
         }
diff --git a/src/com/android/settings/datausage/WifiDataUsageSummaryPreferenceController.java b/src/com/android/settings/datausage/WifiDataUsageSummaryPreferenceController.java
index 9d3054e..4d2dd00 100644
--- a/src/com/android/settings/datausage/WifiDataUsageSummaryPreferenceController.java
+++ b/src/com/android/settings/datausage/WifiDataUsageSummaryPreferenceController.java
@@ -26,23 +26,19 @@
 import com.android.settingslib.core.lifecycle.Lifecycle;
 import com.android.settingslib.net.DataUsageController;
 
+import java.util.HashSet;
 import java.util.Set;
 
 /**
  * The controller displays a data usage chart for the specified Wi-Fi network.
  */
 public class WifiDataUsageSummaryPreferenceController extends DataUsageSummaryPreferenceController {
-    final String mNetworkId;
+    final Set<String> mAllNetworkKeys;
 
-    public WifiDataUsageSummaryPreferenceController(Activity activity,
-            Lifecycle lifecycle, PreferenceFragmentCompat fragment, CharSequence networkId) {
+    public WifiDataUsageSummaryPreferenceController(Activity activity, Lifecycle lifecycle,
+            PreferenceFragmentCompat fragment, Set<String> allNetworkKeys) {
         super(activity, lifecycle, fragment, SubscriptionManager.INVALID_SUBSCRIPTION_ID);
-
-        if (networkId == null) {
-            mNetworkId = null;
-        } else {
-            mNetworkId = String.valueOf(networkId);
-        }
+        mAllNetworkKeys = new HashSet<>(allNetworkKeys);
     }
 
     @Override
@@ -52,10 +48,11 @@
         }
 
         final DataUsageSummaryPreference mPreference = (DataUsageSummaryPreference) preference;
-        // TODO(b/126299427): Currently gets data usage of whole Wi-Fi networks, but should get
-        //  specified one.
         final NetworkTemplate template = new NetworkTemplate.Builder(NetworkTemplate.MATCH_WIFI)
-                .setWifiNetworkKeys(Set.of(mNetworkId)).build();
+                .setWifiNetworkKeys(mAllNetworkKeys).build();
+        if (mDataUsageController == null) {
+            updateConfiguration(mContext, mSubId, getSubscriptionInfo(mSubId));
+        }
         final DataUsageController.DataUsageInfo info = mDataUsageController.getDataUsageInfo(
                 template);
         mDataInfoController.updateDataLimit(info, mPolicyEditor.getPolicy(template));
diff --git a/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java b/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java
index 8bef708..a7b4b00 100644
--- a/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java
+++ b/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragment.java
@@ -68,16 +68,35 @@
     public void onAttach(Context context) {
         super.onAttach(context);
         final int profileType = getArguments().getInt(ProfileSelectFragment.EXTRA_PROFILE);
-        if (profileType == ProfileSelectFragment.ProfileType.WORK) {
-            final UserManager userManager = UserManager.get(context);
-            final UserHandle workUser = Utils.getManagedProfile(userManager);
-            // get work userId
-            mUserId = Utils.getManagedProfileId(userManager, UserHandle.myUserId());
-            mUserAwareContext = context.createContextAsUser(workUser, 0);
-        } else {
-            mUserId = UserHandle.myUserId();
-            mUserAwareContext = context;
+        final UserManager userManager = context.getSystemService(UserManager.class);
+        final int currentUserId = UserHandle.myUserId();
+        final int newUserId;
+        final Context newUserAwareContext;
+        switch (profileType) {
+            case ProfileSelectFragment.ProfileType.WORK: {
+                final UserHandle workUser;
+                if (currentUserId == UserHandle.MIN_SECONDARY_USER_ID) {
+                    newUserId = currentUserId;
+                    workUser = UserHandle.of(currentUserId);
+                } else {
+                    newUserId = Utils.getManagedProfileId(userManager, currentUserId);
+                    workUser = Utils.getManagedProfile(userManager);
+                }
+                newUserAwareContext = context.createContextAsUser(workUser, 0);
+                break;
+            }
+            case ProfileSelectFragment.ProfileType.PERSONAL: {
+                final UserHandle primaryUser = userManager.getPrimaryUser().getUserHandle();
+                newUserId = primaryUser.getIdentifier();
+                newUserAwareContext = context.createContextAsUser(primaryUser, 0);
+                break;
+            }
+            default:
+                newUserId = currentUserId;
+                newUserAwareContext = context;
         }
+        mUserId = newUserId;
+        mUserAwareContext = newUserAwareContext;
     }
 
     @Override
diff --git a/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java b/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java
index f9d0db0..e3181e3 100644
--- a/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java
+++ b/src/com/android/settings/wifi/details2/WifiDetailPreferenceController2.java
@@ -435,9 +435,9 @@
             mDataUsageSummaryPref = screen.findPreference(KEY_DATA_USAGE_HEADER);
             mDataUsageSummaryPref.setVisible(true);
             mSummaryHeaderController =
-                new WifiDataUsageSummaryPreferenceController(mFragment.getActivity(),
-                        mLifecycle, (PreferenceFragmentCompat) mFragment,
-                        mWifiEntry.getTitle());
+                    new WifiDataUsageSummaryPreferenceController(mFragment.getActivity(),
+                            mLifecycle, (PreferenceFragmentCompat) mFragment,
+                            mWifiEntry.getWifiConfiguration().getAllNetworkKeys());
             return;
         }
 
diff --git a/tests/robotests/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragmentTest.java
index 0c656b3..c44352f 100644
--- a/tests/robotests/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/LaunchAccessibilityActivityPreferenceFragmentTest.java
@@ -83,9 +83,8 @@
     }
 
     @Test
-    public void getTileName_noTileServiceAssigned_noMatchString() {
-        final CharSequence tileName = mFragment.getTileName();
-        assertThat(tileName.toString()).isEqualTo("");
+    public void getTileName_noTileServiceAssigned_returnNull() {
+        assertThat(mFragment.getTileName()).isNull();
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java b/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java
index db5b83c..236f9f2 100644
--- a/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/accessibility/ToggleAccessibilityServicePreferenceFragmentTest.java
@@ -83,9 +83,8 @@
     }
 
     @Test
-    public void getTileName_noTileServiceAssigned_noMatchString() {
-        final CharSequence tileName = mFragment.getTileName();
-        assertThat(tileName.toString()).isEqualTo("");
+    public void getTileName_noTileServiceAssigned_returnNull() {
+        assertThat(mFragment.getTileName()).isNull();
     }
 
     @Test
diff --git a/tests/robotests/src/com/android/settings/datausage/WifiDataUsageSummaryPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/datausage/WifiDataUsageSummaryPreferenceControllerTest.java
new file mode 100644
index 0000000..711f6d7
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/datausage/WifiDataUsageSummaryPreferenceControllerTest.java
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2022 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.datausage;
+
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.ArgumentMatchers.anyString;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.spy;
+
+import android.content.Context;
+import android.net.NetworkPolicyManager;
+import android.telephony.TelephonyManager;
+
+import androidx.fragment.app.FragmentActivity;
+import androidx.test.core.app.ApplicationProvider;
+
+import com.android.settingslib.core.lifecycle.Lifecycle;
+import com.android.settingslib.net.DataUsageController;
+
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.Spy;
+import org.mockito.junit.MockitoJUnit;
+import org.mockito.junit.MockitoRule;
+import org.robolectric.RobolectricTestRunner;
+
+import java.util.HashSet;
+import java.util.Set;
+
+@RunWith(RobolectricTestRunner.class)
+public class WifiDataUsageSummaryPreferenceControllerTest {
+
+    @Rule
+    public final MockitoRule mMockitoRule = MockitoJUnit.rule();
+    @Spy
+    Context mContext = ApplicationProvider.getApplicationContext();
+    @Mock
+    FragmentActivity mActivity;
+    @Mock
+    Lifecycle mLifecycle;
+    @Mock
+    TelephonyManager mTelephonyManager;
+    @Mock
+    NetworkPolicyManager mNetworkPolicyManager;
+    @Mock
+    DataUsageSummaryPreference mSummaryPreference;
+    @Mock
+    DataUsageController mDataUsageController;
+    @Mock
+    DataUsageController.DataUsageInfo mDataUsageInfo;
+
+    WifiDataUsageSummaryPreferenceController mController;
+    Set<String> mAllNetworkKeys = new HashSet<>();
+
+    @Before
+    public void setUp() {
+        doReturn(mContext.getResources()).when(mActivity).getResources();
+        doReturn(mTelephonyManager).when(mActivity).getSystemService(TelephonyManager.class);
+        doReturn(mNetworkPolicyManager).when(mActivity)
+                .getSystemService(NetworkPolicyManager.class);
+        doNothing().when(mSummaryPreference).setWifiMode(anyBoolean(), anyString(), anyBoolean());
+        doReturn(mDataUsageInfo).when(mDataUsageController).getDataUsageInfo(any());
+
+        mController = spy(new WifiDataUsageSummaryPreferenceController(mActivity, mLifecycle, null,
+                mAllNetworkKeys));
+        doReturn(mDataUsageController).when(mController).createDataUsageController(any());
+    }
+
+    @Test
+    public void updateState_nullOfDataUsageController_shouldNotCrash() {
+        mController.mDataUsageController = null;
+
+        mController.updateState(mSummaryPreference);
+    }
+}
diff --git a/tests/robotests/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragmentTest.java b/tests/robotests/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragmentTest.java
index c6c6a66..c6e7a97 100644
--- a/tests/robotests/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/inputmethod/AvailableVirtualKeyboardFragmentTest.java
@@ -20,7 +20,9 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -31,6 +33,7 @@
 import android.content.pm.ResolveInfo;
 import android.content.pm.ServiceInfo;
 import android.os.Bundle;
+import android.os.UserHandle;
 import android.provider.SearchIndexableResource;
 import android.view.inputmethod.InputMethodInfo;
 import android.view.inputmethod.InputMethodManager;
@@ -43,6 +46,7 @@
 import com.android.settings.dashboard.profileselector.ProfileSelectFragment;
 import com.android.settings.testutils.shadow.ShadowInputMethodManagerWithMethodList;
 import com.android.settings.testutils.shadow.ShadowSecureSettings;
+import com.android.settings.testutils.shadow.ShadowUserManager;
 import com.android.settingslib.inputmethod.InputMethodPreference;
 import com.android.settingslib.inputmethod.InputMethodSettingValuesWrapper;
 
@@ -62,7 +66,8 @@
 @RunWith(RobolectricTestRunner.class)
 @Config(shadows = {
         ShadowSecureSettings.class,
-        ShadowInputMethodManagerWithMethodList.class
+        ShadowInputMethodManagerWithMethodList.class,
+        ShadowUserManager.class
 })
 public class AvailableVirtualKeyboardFragmentTest {
 
@@ -170,6 +175,7 @@
         when(mFragment.getPreferenceScreen()).thenReturn(mPreferenceScreen);
         when(mPreferenceManager.getContext()).thenReturn(mContext);
         when(mContext.getSystemService(InputMethodManager.class)).thenReturn(mInputMethodManager);
+        doReturn(mContext).when(mContext).createContextAsUser(any(UserHandle.class), anyInt());
     }
 
     private List<InputMethodInfo> createFakeInputMethodInfoList(final String name, int num) {
diff --git a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java
index dc42515..ea51370 100644
--- a/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java
+++ b/tests/robotests/src/com/android/settings/testutils/shadow/ShadowUserManager.java
@@ -44,6 +44,8 @@
 
     private static boolean sIsSupportsMultipleUsers;
 
+    private static final int PRIMARY_USER_ID = 0;
+
     private final List<String> mBaseRestrictions = new ArrayList<>();
     private final List<String> mGuestRestrictions = new ArrayList<>();
     private final Map<String, List<EnforcingUser>> mRestrictionSources = new HashMap<>();
@@ -218,4 +220,10 @@
             mEnabledTypes.remove(type);
         }
     }
+
+    @Implementation
+    protected UserInfo getPrimaryUser() {
+        return new UserInfo(PRIMARY_USER_ID, null, null,
+                UserInfo.FLAG_INITIALIZED | UserInfo.FLAG_ADMIN | UserInfo.FLAG_PRIMARY);
+    }
 }