Merge "[Terms of Address] Create a feature flag for it" into main
diff --git a/src/com/android/settings/datausage/AppDataUsage.java b/src/com/android/settings/datausage/AppDataUsage.java
index c14c01b..1645586 100644
--- a/src/com/android/settings/datausage/AppDataUsage.java
+++ b/src/com/android/settings/datausage/AppDataUsage.java
@@ -34,6 +34,8 @@
 import android.view.View;
 import android.widget.AdapterView;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 import androidx.loader.app.LoaderManager;
 import androidx.loader.content.Loader;
@@ -57,6 +59,7 @@
 import com.android.settingslib.net.UidDetailProvider;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceChangeListener,
@@ -97,6 +100,7 @@
     String mPackageName;
     private CycleAdapter mCycleAdapter;
 
+    @Nullable
     private List<NetworkCycleDataForUid> mUsageData;
     @VisibleForTesting
     NetworkTemplate mTemplate;
@@ -261,7 +265,7 @@
     }
 
     @Override
-    public boolean onPreferenceChange(Preference preference, Object newValue) {
+    public boolean onPreferenceChange(@NonNull Preference preference, Object newValue) {
         if (preference == mRestrictBackground) {
             mDataSaverBackend.setIsDenylisted(mAppItem.key, mPackageName, !(Boolean) newValue);
             updatePrefs();
@@ -361,9 +365,7 @@
         }
         String[] packages = mPackageManager.getPackagesForUid(uid);
         if (packages != null) {
-            for (int i = 0; i < packages.length; i++) {
-                mPackages.add(packages[i]);
-            }
+            Collections.addAll(mPackages, packages);
         }
     }
 
@@ -448,73 +450,75 @@
 
     @VisibleForTesting
     final LoaderManager.LoaderCallbacks<List<NetworkCycleDataForUid>> mUidDataCallbacks =
-        new LoaderManager.LoaderCallbacks<List<NetworkCycleDataForUid>>() {
-            @Override
-            public Loader<List<NetworkCycleDataForUid>> onCreateLoader(int id, Bundle args) {
-                final NetworkCycleDataForUidLoader.Builder builder
-                    = NetworkCycleDataForUidLoader.builder(mContext);
-                builder.setRetrieveDetail(true)
-                    .setNetworkTemplate(mTemplate);
-                for (int i = 0; i < mAppItem.uids.size(); i++) {
-                    builder.addUid(mAppItem.uids.keyAt(i));
+            new LoaderManager.LoaderCallbacks<>() {
+                @Override
+                @NonNull
+                public Loader<List<NetworkCycleDataForUid>> onCreateLoader(int id, Bundle args) {
+                    final NetworkCycleDataForUidLoader.Builder<?> builder =
+                            NetworkCycleDataForUidLoader.builder(mContext);
+                    builder.setRetrieveDetail(true)
+                            .setNetworkTemplate(mTemplate);
+                    for (int i = 0; i < mAppItem.uids.size(); i++) {
+                        builder.addUid(mAppItem.uids.keyAt(i));
+                    }
+                    if (mCycles != null) {
+                        builder.setCycles(mCycles);
+                    }
+                    return builder.build();
                 }
-                if (mCycles != null) {
-                    builder.setCycles(mCycles);
-                }
-                return builder.build();
-            }
 
-            @Override
-            public void onLoadFinished(Loader<List<NetworkCycleDataForUid>> loader,
-                    List<NetworkCycleDataForUid> data) {
-                mUsageData = data;
-                mCycleAdapter.updateCycleList(data);
-                if (mSelectedCycle > 0L) {
-                    final int numCycles = data.size();
-                    int position = 0;
-                    for (int i = 0; i < numCycles; i++) {
-                        final NetworkCycleDataForUid cycleData = data.get(i);
-                        if (cycleData.getEndTime() == mSelectedCycle) {
-                            position = i;
-                            break;
+                @Override
+                public void onLoadFinished(@NonNull Loader<List<NetworkCycleDataForUid>> loader,
+                        List<NetworkCycleDataForUid> data) {
+                    mUsageData = data;
+                    mCycleAdapter.updateCycleList(data);
+                    if (mSelectedCycle > 0L) {
+                        final int numCycles = data.size();
+                        int position = 0;
+                        for (int i = 0; i < numCycles; i++) {
+                            final NetworkCycleDataForUid cycleData = data.get(i);
+                            if (cycleData.getEndTime() == mSelectedCycle) {
+                                position = i;
+                                break;
+                            }
                         }
+                        if (position > 0) {
+                            mCycle.setSelection(position);
+                        }
+                        bindData(position);
+                    } else {
+                        bindData(0 /* position */);
                     }
-                    if (position > 0) {
-                        mCycle.setSelection(position);
-                    }
-                    bindData(position);
-                } else {
-                    bindData(0 /* position */);
+                    mIsLoading = false;
                 }
-                mIsLoading = false;
-            }
 
-            @Override
-            public void onLoaderReset(Loader<List<NetworkCycleDataForUid>> loader) {
-            }
-        };
+                @Override
+                public void onLoaderReset(@NonNull Loader<List<NetworkCycleDataForUid>> loader) {
+                }
+            };
 
     private final LoaderManager.LoaderCallbacks<ArraySet<Preference>> mAppPrefCallbacks =
-        new LoaderManager.LoaderCallbacks<ArraySet<Preference>>() {
-            @Override
-            public Loader<ArraySet<Preference>> onCreateLoader(int i, Bundle bundle) {
-                return new AppPrefLoader(getPrefContext(), mPackages, getPackageManager());
-            }
+            new LoaderManager.LoaderCallbacks<>() {
+                @Override
+                @NonNull
+                public Loader<ArraySet<Preference>> onCreateLoader(int i, Bundle bundle) {
+                    return new AppPrefLoader(getPrefContext(), mPackages, getPackageManager());
+                }
 
-            @Override
-            public void onLoadFinished(Loader<ArraySet<Preference>> loader,
-                    ArraySet<Preference> preferences) {
-                if (preferences != null && mAppList != null) {
-                    for (Preference preference : preferences) {
-                        mAppList.addPreference(preference);
+                @Override
+                public void onLoadFinished(@NonNull Loader<ArraySet<Preference>> loader,
+                        ArraySet<Preference> preferences) {
+                    if (preferences != null && mAppList != null) {
+                        for (Preference preference : preferences) {
+                            mAppList.addPreference(preference);
+                        }
                     }
                 }
-            }
 
-            @Override
-            public void onLoaderReset(Loader<ArraySet<Preference>> loader) {
-            }
-        };
+                @Override
+                public void onLoaderReset(@NonNull Loader<ArraySet<Preference>> loader) {
+                }
+            };
 
     @Override
     public void onDataSaverChanged(boolean isDataSaving) {
diff --git a/src/com/android/settings/datausage/DataUsageList.java b/src/com/android/settings/datausage/DataUsageList.java
index ee2a1ad..5c52797 100644
--- a/src/com/android/settings/datausage/DataUsageList.java
+++ b/src/com/android/settings/datausage/DataUsageList.java
@@ -48,6 +48,8 @@
 import android.widget.ImageView;
 import android.widget.Spinner;
 
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 import androidx.lifecycle.Lifecycle;
 import androidx.loader.app.LoaderManager.LoaderCallbacks;
@@ -118,7 +120,10 @@
     LoadingViewController mLoadingViewController;
 
     private ChartDataUsagePreference mChart;
+
+    @Nullable
     private List<NetworkCycleChartData> mCycleData;
+
     // Caches the cycles for startAppDataUsage usage, which need be cleared when resumed.
     private ArrayList<Long> mCycles;
     // Spinner will keep the selected cycle even after paused, this only keeps the displayed cycle,
@@ -165,7 +170,7 @@
     }
 
     @Override
-    public void onViewCreated(View v, Bundle savedInstanceState) {
+    public void onViewCreated(@NonNull View v, Bundle savedInstanceState) {
         super.onViewCreated(v, savedInstanceState);
 
         mHeader = setPinnedHeaderView(R.layout.apps_filter_spinner);
@@ -355,7 +360,9 @@
         }
 
         // generate cycle list based on policy and available history
-        mCycleAdapter.updateCycleList(mCycleData);
+        if (mCycleData != null) {
+            mCycleAdapter.updateCycleList(mCycleData);
+        }
         updateSelectedCycle();
     }
 
@@ -481,11 +488,9 @@
         }
         stats.close();
 
-        final int restrictedUidsMax = restrictedUids.length;
-        for (int i = 0; i < restrictedUidsMax; ++i) {
-            final int uid = restrictedUids[i];
+        for (final int uid : restrictedUids) {
             // Only splice in restricted state for current user or managed users
-            if (!profiles.contains(new UserHandle(UserHandle.getUserId(uid)))) {
+            if (!profiles.contains(UserHandle.getUserHandleForUid(uid))) {
                 continue;
             }
 
@@ -505,14 +510,13 @@
                 R.array.datausage_hiding_carrier_service_package_names));
         // When there is no specified SubscriptionInfo, Wi-Fi data usage will be displayed.
         // In this case, the carrier service package also needs to be hidden.
-        boolean shouldHidePackageName = mSubscriptionInfoEntity != null
-                ? Arrays.stream(getContext().getResources().getIntArray(
+        boolean shouldHidePackageName = mSubscriptionInfoEntity == null
+                || Arrays.stream(getContext().getResources().getIntArray(
                         R.array.datausage_hiding_carrier_service_carrier_id))
-                .anyMatch(carrierId -> (carrierId == mSubscriptionInfoEntity.carrierId))
-                : true;
+                .anyMatch(carrierId -> (carrierId == mSubscriptionInfoEntity.carrierId));
 
-        for (int i = 0; i < items.size(); i++) {
-            UidDetail detail = mUidDetailProvider.getUidDetail(items.get(i).key, true);
+        for (var item : items) {
+            UidDetail detail = mUidDetailProvider.getUidDetail(item.key, true);
             // Do not show carrier service package in data usage list if it should be hidden for
             // the carrier.
             if (detail != null && shouldHidePackageName && packageNames.contains(
@@ -520,17 +524,13 @@
                 continue;
             }
 
-            final int percentTotal = largest != 0 ? (int) (items.get(i).total * 100 / largest) : 0;
+            final int percentTotal = largest != 0 ? (int) (item.total * 100 / largest) : 0;
             final AppDataUsagePreference preference = new AppDataUsagePreference(getContext(),
-                    items.get(i), percentTotal, mUidDetailProvider);
-            preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() {
-                @Override
-                public boolean onPreferenceClick(Preference preference) {
-                    AppDataUsagePreference pref = (AppDataUsagePreference) preference;
-                    AppItem item = pref.getItem();
-                    startAppDataUsage(item);
-                    return true;
-                }
+                    item, percentTotal, mUidDetailProvider);
+            preference.setOnPreferenceClickListener(p -> {
+                AppDataUsagePreference pref = (AppDataUsagePreference) p;
+                startAppDataUsage(pref.getItem());
+                return true;
             });
             mApps.addPreference(preference);
         }
@@ -538,6 +538,9 @@
 
     @VisibleForTesting
     void startAppDataUsage(AppItem item) {
+        if (mCycleData == null) {
+            return;
+        }
         final Bundle args = new Bundle();
         args.putParcelable(AppDataUsage.ARG_APP_ITEM, item);
         args.putParcelable(AppDataUsage.ARG_NETWORK_TEMPLATE, mTemplate);
@@ -600,67 +603,70 @@
 
     @VisibleForTesting
     final LoaderCallbacks<List<NetworkCycleChartData>> mNetworkCycleDataCallbacks =
-            new LoaderCallbacks<List<NetworkCycleChartData>>() {
-        @Override
-        public Loader<List<NetworkCycleChartData>> onCreateLoader(int id, Bundle args) {
-            return NetworkCycleChartDataLoader.builder(getContext())
-                    .setNetworkTemplate(mTemplate)
-                    .build();
-        }
+            new LoaderCallbacks<>() {
+                @Override
+                @NonNull
+                public Loader<List<NetworkCycleChartData>> onCreateLoader(int id, Bundle args) {
+                    return NetworkCycleChartDataLoader.builder(getContext())
+                            .setNetworkTemplate(mTemplate)
+                            .build();
+                }
 
-        @Override
-        public void onLoadFinished(Loader<List<NetworkCycleChartData>> loader,
-                List<NetworkCycleChartData> data) {
-            mLoadingViewController.showContent(false /* animate */);
-            mCycleData = data;
-            // calculate policy cycles based on available data
-            updatePolicy();
-            mCycleSpinner.setVisibility(View.VISIBLE);
-        }
+                @Override
+                public void onLoadFinished(@NonNull Loader<List<NetworkCycleChartData>> loader,
+                        List<NetworkCycleChartData> data) {
+                    mLoadingViewController.showContent(false /* animate */);
+                    mCycleData = data;
+                    // calculate policy cycles based on available data
+                    updatePolicy();
+                    mCycleSpinner.setVisibility(View.VISIBLE);
+                }
 
-        @Override
-        public void onLoaderReset(Loader<List<NetworkCycleChartData>> loader) {
-            mCycleData = null;
-        }
-    };
+                @Override
+                public void onLoaderReset(@NonNull Loader<List<NetworkCycleChartData>> loader) {
+                    mCycleData = null;
+                }
+            };
 
     private final LoaderCallbacks<NetworkStats> mNetworkStatsDetailCallbacks =
-            new LoaderCallbacks<NetworkStats>() {
-        @Override
-        public Loader<NetworkStats> onCreateLoader(int id, Bundle args) {
-            return new NetworkStatsSummaryLoader.Builder(getContext())
-                    .setStartTime(mChart.getInspectStart())
-                    .setEndTime(mChart.getInspectEnd())
-                    .setNetworkTemplate(mTemplate)
-                    .build();
-        }
-
-        @Override
-        public void onLoadFinished(Loader<NetworkStats> loader, NetworkStats data) {
-            final int[] restrictedUids = services.mPolicyManager.getUidsWithPolicy(
-                    POLICY_REJECT_METERED_BACKGROUND);
-            bindStats(data, restrictedUids);
-            updateEmptyVisible();
-        }
-
-        @Override
-        public void onLoaderReset(Loader<NetworkStats> loader) {
-            bindStats(null, new int[0]);
-            updateEmptyVisible();
-        }
-
-        private void updateEmptyVisible() {
-            if ((mApps.getPreferenceCount() != 0) !=
-                    (getPreferenceScreen().getPreferenceCount() != 0)) {
-                if (mApps.getPreferenceCount() != 0) {
-                    getPreferenceScreen().addPreference(mUsageAmount);
-                    getPreferenceScreen().addPreference(mApps);
-                } else {
-                    getPreferenceScreen().removeAll();
+            new LoaderCallbacks<>() {
+                @Override
+                @NonNull
+                public Loader<NetworkStats> onCreateLoader(int id, Bundle args) {
+                    return new NetworkStatsSummaryLoader.Builder(getContext())
+                            .setStartTime(mChart.getInspectStart())
+                            .setEndTime(mChart.getInspectEnd())
+                            .setNetworkTemplate(mTemplate)
+                            .build();
                 }
-            }
-        }
-    };
+
+                @Override
+                public void onLoadFinished(
+                        @NonNull Loader<NetworkStats> loader, NetworkStats data) {
+                    final int[] restrictedUids = services.mPolicyManager.getUidsWithPolicy(
+                            POLICY_REJECT_METERED_BACKGROUND);
+                    bindStats(data, restrictedUids);
+                    updateEmptyVisible();
+                }
+
+                @Override
+                public void onLoaderReset(@NonNull Loader<NetworkStats> loader) {
+                    bindStats(null, new int[0]);
+                    updateEmptyVisible();
+                }
+
+                private void updateEmptyVisible() {
+                    if ((mApps.getPreferenceCount() != 0)
+                            != (getPreferenceScreen().getPreferenceCount() != 0)) {
+                        if (mApps.getPreferenceCount() != 0) {
+                            getPreferenceScreen().addPreference(mUsageAmount);
+                            getPreferenceScreen().addPreference(mApps);
+                        } else {
+                            getPreferenceScreen().removeAll();
+                        }
+                    }
+                }
+            };
 
     private static boolean isGuestUser(Context context) {
         if (context == null) return false;