Add some null annotation for data usage code

Also do some clean up.

Bug: 296357959
Test: manual - on DataUsageList page
Change-Id: Id7548e1d58d946810c844b9559bb00d65306f441
This commit is contained in:
Chaohui Wang
2023-08-28 17:00:47 +08:00
parent 6c2d713226
commit 6ef678f19d
2 changed files with 144 additions and 137 deletions

View File

@@ -34,6 +34,8 @@ import android.util.Log;
import android.view.View; import android.view.View;
import android.widget.AdapterView; import android.widget.AdapterView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.loader.app.LoaderManager; import androidx.loader.app.LoaderManager;
import androidx.loader.content.Loader; import androidx.loader.content.Loader;
@@ -57,6 +59,7 @@ import com.android.settingslib.net.UidDetail;
import com.android.settingslib.net.UidDetailProvider; import com.android.settingslib.net.UidDetailProvider;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.List; import java.util.List;
public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceChangeListener, public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceChangeListener,
@@ -97,6 +100,7 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC
String mPackageName; String mPackageName;
private CycleAdapter mCycleAdapter; private CycleAdapter mCycleAdapter;
@Nullable
private List<NetworkCycleDataForUid> mUsageData; private List<NetworkCycleDataForUid> mUsageData;
@VisibleForTesting @VisibleForTesting
NetworkTemplate mTemplate; NetworkTemplate mTemplate;
@@ -261,7 +265,7 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC
} }
@Override @Override
public boolean onPreferenceChange(Preference preference, Object newValue) { public boolean onPreferenceChange(@NonNull Preference preference, Object newValue) {
if (preference == mRestrictBackground) { if (preference == mRestrictBackground) {
mDataSaverBackend.setIsDenylisted(mAppItem.key, mPackageName, !(Boolean) newValue); mDataSaverBackend.setIsDenylisted(mAppItem.key, mPackageName, !(Boolean) newValue);
updatePrefs(); updatePrefs();
@@ -361,9 +365,7 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC
} }
String[] packages = mPackageManager.getPackagesForUid(uid); String[] packages = mPackageManager.getPackagesForUid(uid);
if (packages != null) { if (packages != null) {
for (int i = 0; i < packages.length; i++) { Collections.addAll(mPackages, packages);
mPackages.add(packages[i]);
}
} }
} }
@@ -448,73 +450,75 @@ public class AppDataUsage extends DataUsageBaseFragment implements OnPreferenceC
@VisibleForTesting @VisibleForTesting
final LoaderManager.LoaderCallbacks<List<NetworkCycleDataForUid>> mUidDataCallbacks = final LoaderManager.LoaderCallbacks<List<NetworkCycleDataForUid>> mUidDataCallbacks =
new LoaderManager.LoaderCallbacks<List<NetworkCycleDataForUid>>() { new LoaderManager.LoaderCallbacks<>() {
@Override @Override
public Loader<List<NetworkCycleDataForUid>> onCreateLoader(int id, Bundle args) { @NonNull
final NetworkCycleDataForUidLoader.Builder builder public Loader<List<NetworkCycleDataForUid>> onCreateLoader(int id, Bundle args) {
= NetworkCycleDataForUidLoader.builder(mContext); final NetworkCycleDataForUidLoader.Builder<?> builder =
builder.setRetrieveDetail(true) NetworkCycleDataForUidLoader.builder(mContext);
.setNetworkTemplate(mTemplate); builder.setRetrieveDetail(true)
for (int i = 0; i < mAppItem.uids.size(); i++) { .setNetworkTemplate(mTemplate);
builder.addUid(mAppItem.uids.keyAt(i)); 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 @Override
public void onLoadFinished(Loader<List<NetworkCycleDataForUid>> loader, public void onLoadFinished(@NonNull Loader<List<NetworkCycleDataForUid>> loader,
List<NetworkCycleDataForUid> data) { List<NetworkCycleDataForUid> data) {
mUsageData = data; mUsageData = data;
mCycleAdapter.updateCycleList(data); mCycleAdapter.updateCycleList(data);
if (mSelectedCycle > 0L) { if (mSelectedCycle > 0L) {
final int numCycles = data.size(); final int numCycles = data.size();
int position = 0; int position = 0;
for (int i = 0; i < numCycles; i++) { for (int i = 0; i < numCycles; i++) {
final NetworkCycleDataForUid cycleData = data.get(i); final NetworkCycleDataForUid cycleData = data.get(i);
if (cycleData.getEndTime() == mSelectedCycle) { if (cycleData.getEndTime() == mSelectedCycle) {
position = i; position = i;
break; break;
}
} }
if (position > 0) {
mCycle.setSelection(position);
}
bindData(position);
} else {
bindData(0 /* position */);
} }
if (position > 0) { mIsLoading = false;
mCycle.setSelection(position);
}
bindData(position);
} else {
bindData(0 /* position */);
} }
mIsLoading = false;
}
@Override @Override
public void onLoaderReset(Loader<List<NetworkCycleDataForUid>> loader) { public void onLoaderReset(@NonNull Loader<List<NetworkCycleDataForUid>> loader) {
} }
}; };
private final LoaderManager.LoaderCallbacks<ArraySet<Preference>> mAppPrefCallbacks = private final LoaderManager.LoaderCallbacks<ArraySet<Preference>> mAppPrefCallbacks =
new LoaderManager.LoaderCallbacks<ArraySet<Preference>>() { new LoaderManager.LoaderCallbacks<>() {
@Override @Override
public Loader<ArraySet<Preference>> onCreateLoader(int i, Bundle bundle) { @NonNull
return new AppPrefLoader(getPrefContext(), mPackages, getPackageManager()); public Loader<ArraySet<Preference>> onCreateLoader(int i, Bundle bundle) {
} return new AppPrefLoader(getPrefContext(), mPackages, getPackageManager());
}
@Override @Override
public void onLoadFinished(Loader<ArraySet<Preference>> loader, public void onLoadFinished(@NonNull Loader<ArraySet<Preference>> loader,
ArraySet<Preference> preferences) { ArraySet<Preference> preferences) {
if (preferences != null && mAppList != null) { if (preferences != null && mAppList != null) {
for (Preference preference : preferences) { for (Preference preference : preferences) {
mAppList.addPreference(preference); mAppList.addPreference(preference);
}
} }
} }
}
@Override @Override
public void onLoaderReset(Loader<ArraySet<Preference>> loader) { public void onLoaderReset(@NonNull Loader<ArraySet<Preference>> loader) {
} }
}; };
@Override @Override
public void onDataSaverChanged(boolean isDataSaving) { public void onDataSaverChanged(boolean isDataSaving) {

View File

@@ -48,6 +48,8 @@ import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.Spinner; import android.widget.Spinner;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting; import androidx.annotation.VisibleForTesting;
import androidx.lifecycle.Lifecycle; import androidx.lifecycle.Lifecycle;
import androidx.loader.app.LoaderManager.LoaderCallbacks; import androidx.loader.app.LoaderManager.LoaderCallbacks;
@@ -118,7 +120,10 @@ public class DataUsageList extends DataUsageBaseFragment
LoadingViewController mLoadingViewController; LoadingViewController mLoadingViewController;
private ChartDataUsagePreference mChart; private ChartDataUsagePreference mChart;
@Nullable
private List<NetworkCycleChartData> mCycleData; private List<NetworkCycleChartData> mCycleData;
// Caches the cycles for startAppDataUsage usage, which need be cleared when resumed. // Caches the cycles for startAppDataUsage usage, which need be cleared when resumed.
private ArrayList<Long> mCycles; private ArrayList<Long> mCycles;
// Spinner will keep the selected cycle even after paused, this only keeps the displayed cycle, // Spinner will keep the selected cycle even after paused, this only keeps the displayed cycle,
@@ -165,7 +170,7 @@ public class DataUsageList extends DataUsageBaseFragment
} }
@Override @Override
public void onViewCreated(View v, Bundle savedInstanceState) { public void onViewCreated(@NonNull View v, Bundle savedInstanceState) {
super.onViewCreated(v, savedInstanceState); super.onViewCreated(v, savedInstanceState);
mHeader = setPinnedHeaderView(R.layout.apps_filter_spinner); mHeader = setPinnedHeaderView(R.layout.apps_filter_spinner);
@@ -355,7 +360,9 @@ public class DataUsageList extends DataUsageBaseFragment
} }
// generate cycle list based on policy and available history // generate cycle list based on policy and available history
mCycleAdapter.updateCycleList(mCycleData); if (mCycleData != null) {
mCycleAdapter.updateCycleList(mCycleData);
}
updateSelectedCycle(); updateSelectedCycle();
} }
@@ -481,11 +488,9 @@ public class DataUsageList extends DataUsageBaseFragment
} }
stats.close(); stats.close();
final int restrictedUidsMax = restrictedUids.length; for (final int uid : restrictedUids) {
for (int i = 0; i < restrictedUidsMax; ++i) {
final int uid = restrictedUids[i];
// Only splice in restricted state for current user or managed users // 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; continue;
} }
@@ -505,14 +510,13 @@ public class DataUsageList extends DataUsageBaseFragment
R.array.datausage_hiding_carrier_service_package_names)); R.array.datausage_hiding_carrier_service_package_names));
// When there is no specified SubscriptionInfo, Wi-Fi data usage will be displayed. // 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. // In this case, the carrier service package also needs to be hidden.
boolean shouldHidePackageName = mSubscriptionInfoEntity != null boolean shouldHidePackageName = mSubscriptionInfoEntity == null
? Arrays.stream(getContext().getResources().getIntArray( || Arrays.stream(getContext().getResources().getIntArray(
R.array.datausage_hiding_carrier_service_carrier_id)) R.array.datausage_hiding_carrier_service_carrier_id))
.anyMatch(carrierId -> (carrierId == mSubscriptionInfoEntity.carrierId)) .anyMatch(carrierId -> (carrierId == mSubscriptionInfoEntity.carrierId));
: true;
for (int i = 0; i < items.size(); i++) { for (var item : items) {
UidDetail detail = mUidDetailProvider.getUidDetail(items.get(i).key, true); UidDetail detail = mUidDetailProvider.getUidDetail(item.key, true);
// Do not show carrier service package in data usage list if it should be hidden for // Do not show carrier service package in data usage list if it should be hidden for
// the carrier. // the carrier.
if (detail != null && shouldHidePackageName && packageNames.contains( if (detail != null && shouldHidePackageName && packageNames.contains(
@@ -520,17 +524,13 @@ public class DataUsageList extends DataUsageBaseFragment
continue; 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(), final AppDataUsagePreference preference = new AppDataUsagePreference(getContext(),
items.get(i), percentTotal, mUidDetailProvider); item, percentTotal, mUidDetailProvider);
preference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { preference.setOnPreferenceClickListener(p -> {
@Override AppDataUsagePreference pref = (AppDataUsagePreference) p;
public boolean onPreferenceClick(Preference preference) { startAppDataUsage(pref.getItem());
AppDataUsagePreference pref = (AppDataUsagePreference) preference; return true;
AppItem item = pref.getItem();
startAppDataUsage(item);
return true;
}
}); });
mApps.addPreference(preference); mApps.addPreference(preference);
} }
@@ -603,67 +603,70 @@ public class DataUsageList extends DataUsageBaseFragment
@VisibleForTesting @VisibleForTesting
final LoaderCallbacks<List<NetworkCycleChartData>> mNetworkCycleDataCallbacks = final LoaderCallbacks<List<NetworkCycleChartData>> mNetworkCycleDataCallbacks =
new LoaderCallbacks<List<NetworkCycleChartData>>() { new LoaderCallbacks<>() {
@Override @Override
public Loader<List<NetworkCycleChartData>> onCreateLoader(int id, Bundle args) { @NonNull
return NetworkCycleChartDataLoader.builder(getContext()) public Loader<List<NetworkCycleChartData>> onCreateLoader(int id, Bundle args) {
.setNetworkTemplate(mTemplate) return NetworkCycleChartDataLoader.builder(getContext())
.build(); .setNetworkTemplate(mTemplate)
} .build();
}
@Override @Override
public void onLoadFinished(Loader<List<NetworkCycleChartData>> loader, public void onLoadFinished(@NonNull Loader<List<NetworkCycleChartData>> loader,
List<NetworkCycleChartData> data) { List<NetworkCycleChartData> data) {
mLoadingViewController.showContent(false /* animate */); mLoadingViewController.showContent(false /* animate */);
mCycleData = data; mCycleData = data;
// calculate policy cycles based on available data // calculate policy cycles based on available data
updatePolicy(); updatePolicy();
mCycleSpinner.setVisibility(View.VISIBLE); mCycleSpinner.setVisibility(View.VISIBLE);
} }
@Override @Override
public void onLoaderReset(Loader<List<NetworkCycleChartData>> loader) { public void onLoaderReset(@NonNull Loader<List<NetworkCycleChartData>> loader) {
mCycleData = null; mCycleData = null;
} }
}; };
private final LoaderCallbacks<NetworkStats> mNetworkStatsDetailCallbacks = private final LoaderCallbacks<NetworkStats> mNetworkStatsDetailCallbacks =
new LoaderCallbacks<NetworkStats>() { new LoaderCallbacks<>() {
@Override @Override
public Loader<NetworkStats> onCreateLoader(int id, Bundle args) { @NonNull
return new NetworkStatsSummaryLoader.Builder(getContext()) public Loader<NetworkStats> onCreateLoader(int id, Bundle args) {
.setStartTime(mChart.getInspectStart()) return new NetworkStatsSummaryLoader.Builder(getContext())
.setEndTime(mChart.getInspectEnd()) .setStartTime(mChart.getInspectStart())
.setNetworkTemplate(mTemplate) .setEndTime(mChart.getInspectEnd())
.build(); .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();
} }
}
} @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) { private static boolean isGuestUser(Context context) {
if (context == null) return false; if (context == null) return false;