diff --git a/res/xml/app_info_settings.xml b/res/xml/app_info_settings.xml index 684d0325417..81afc1a11e3 100644 --- a/res/xml/app_info_settings.xml +++ b/res/xml/app_info_settings.xml @@ -67,6 +67,12 @@ android:summary="@string/summary_placeholder" settings:controller="com.android.settings.applications.appinfo.AppDataUsagePreferenceController" /> + + , LifecycleObserver, OnResume, OnPause { + implements LoaderManager.LoaderCallbacks>, LifecycleObserver, + OnResume, OnPause { - private ChartData mChartData; - private INetworkStatsSession mStatsSession; + private List mAppUsageData; - public AppDataUsagePreferenceControllerV2(Context context,String key) { + public AppDataUsagePreferenceControllerV2(Context context, String key) { super(context, key); } @Override public int getAvailabilityStatus() { + if (!FeatureFlagUtils.isEnabled(mContext, FeatureFlags.DATA_USAGE_V2)) { + return UNSUPPORTED_ON_DEVICE; + } return isBandwidthControlEnabled() ? AVAILABLE : CONDITIONALLY_UNAVAILABLE; } @Override public void displayPreference(PreferenceScreen screen) { super.displayPreference(screen); - if (isAvailable()) { - final INetworkStatsService statsService = INetworkStatsService.Stub.asInterface( - ServiceManager.getService(Context.NETWORK_STATS_SERVICE)); - try { - mStatsSession = statsService.openSession(); - } catch (RemoteException e) { - throw new RuntimeException(e); - } - } } @Override @@ -81,51 +74,67 @@ public class AppDataUsagePreferenceControllerV2 extends AppInfoPreferenceControl @Override public void onResume() { - if (mStatsSession != null) { + if (isAvailable()) { final int uid = mParent.getAppEntry().info.uid; final AppItem app = new AppItem(uid); app.addUid(uid); - mParent.getLoaderManager().restartLoader(mParent.LOADER_CHART_DATA, - ChartDataLoaderCompat.buildArgs(getTemplate(mContext), app), + mParent.getLoaderManager().restartLoader(mParent.LOADER_CHART_DATA, null /* args */, this); } } @Override public void onPause() { - mParent.getLoaderManager().destroyLoader(mParent.LOADER_CHART_DATA); + if (isAvailable()) { + mParent.getLoaderManager().destroyLoader(mParent.LOADER_CHART_DATA); + } } @Override - public Loader onCreateLoader(int id, Bundle args) { - return new ChartDataLoaderCompat(mContext, mStatsSession, args); + public Loader> onCreateLoader(int id, Bundle args) { + final NetworkTemplate template = getTemplate(mContext); + return NetworkCycleDataForUidLoader.builder(mContext) + .setUid(mParent.getAppEntry().info.uid) + .setRetrieveDetail(false) + .setNetworkTemplate(template) + .setSubscriberId(template.getSubscriberId()) + .build(); } @Override - public void onLoadFinished(Loader loader, ChartData data) { - mChartData = data; + public void onLoadFinished(Loader> loader, + List data) { + mAppUsageData = data; updateState(mPreference); } @Override - public void onLoaderReset(Loader loader) { + public void onLoaderReset(Loader> loader) { // Leave last result. } @Override protected Class getDetailFragmentClass() { - return AppDataUsage.class; + return AppDataUsageV2.class; } private CharSequence getDataSummary() { - if (mChartData != null) { - final long totalBytes = mChartData.detail.getTotalBytes(); + if (mAppUsageData != null) { + long totalBytes = 0; + long startTime = System.currentTimeMillis(); + for (NetworkCycleDataForUid data : mAppUsageData) { + totalBytes += data.getTotalUsage(); + final long cycleStart = data.getStartTime(); + if (cycleStart < startTime) { + startTime = cycleStart; + } + } if (totalBytes == 0) { return mContext.getString(R.string.no_data_usage); } return mContext.getString(R.string.data_summary_format, Formatter.formatFileSize(mContext, totalBytes), - DateUtils.formatDateTime(mContext, mChartData.detail.getStart(), + DateUtils.formatDateTime(mContext, startTime, DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_MONTH)); } return mContext.getString(R.string.computing_size); diff --git a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java index 7b9cc796ab0..64fd36d2450 100755 --- a/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java +++ b/src/com/android/settings/applications/appinfo/AppInfoDashboardFragment.java @@ -34,6 +34,7 @@ import android.os.Bundle; import android.os.UserHandle; import android.os.UserManager; import android.text.TextUtils; +import android.util.FeatureFlagUtils; import android.util.Log; import android.view.Menu; import android.view.MenuInflater; @@ -48,6 +49,7 @@ import com.android.settings.SettingsPreferenceFragment; import com.android.settings.applications.manageapplications.ManageApplications; import com.android.settings.applications.specialaccess.pictureinpicture .PictureInPictureDetailPreferenceController; +import com.android.settings.core.FeatureFlags; import com.android.settings.core.SubSettingLauncher; import com.android.settings.dashboard.DashboardFragment; import com.android.settingslib.RestrictedLockUtilsInternal; @@ -139,7 +141,11 @@ public class AppInfoDashboardFragment extends DashboardFragment final String packageName = getPackageName(); use(TimeSpentInAppPreferenceController.class).setPackageName(packageName); - use(AppDataUsagePreferenceController.class).setParentFragment(this); + if (FeatureFlagUtils.isEnabled(context, FeatureFlags.DATA_USAGE_V2)) { + use(AppDataUsagePreferenceControllerV2.class).setParentFragment(this); + } else { + use(AppDataUsagePreferenceController.class).setParentFragment(this); + } final AppInstallerInfoPreferenceController installer = use(AppInstallerInfoPreferenceController.class); installer.setPackageName(packageName); diff --git a/src/com/android/settings/datausage/DataUsageListV2.java b/src/com/android/settings/datausage/DataUsageListV2.java index ea652b3138a..c6d3b4d23c3 100644 --- a/src/com/android/settings/datausage/DataUsageListV2.java +++ b/src/com/android/settings/datausage/DataUsageListV2.java @@ -426,11 +426,11 @@ public class DataUsageListV2 extends DataUsageBaseFragment { private void startAppDataUsage(AppItem item) { final Bundle args = new Bundle(); - args.putParcelable(AppDataUsage.ARG_APP_ITEM, item); - args.putParcelable(AppDataUsage.ARG_NETWORK_TEMPLATE, mTemplate); + args.putParcelable(AppDataUsageV2.ARG_APP_ITEM, item); + args.putParcelable(AppDataUsageV2.ARG_NETWORK_TEMPLATE, mTemplate); new SubSettingLauncher(getContext()) - .setDestination(AppDataUsage.class.getName()) + .setDestination(AppDataUsageV2.class.getName()) .setTitleRes(R.string.app_data_usage) .setArguments(args) .setSourceMetricsCategory(getMetricsCategory()) @@ -490,8 +490,6 @@ public class DataUsageListV2 extends DataUsageBaseFragment { @Override public Loader> onCreateLoader(int id, Bundle args) { return NetworkCycleChartDataLoader.builder(getContext()) - .setNetworkPolicy(services.mPolicyEditor.getPolicy(mTemplate)) - .setNetworkType(mNetworkType) .setNetworkTemplate(mTemplate) .setSubscriberId(mTelephonyManager.getSubscriberId(mSubId)) .build(); diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceControllerTest.java index 74966a2a958..e77106d2a01 100644 --- a/tests/robotests/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceControllerTest.java @@ -115,6 +115,7 @@ public class AppDataUsagePreferenceControllerTest { @Test public void onPause_shouldDestroyDataLoader() { + ReflectionHelpers.setField(mController, "mStatsSession", mock(INetworkStatsSession.class)); doReturn(mLoaderManager).when(mFragment).getLoaderManager(); mController.onPause(); diff --git a/tests/robotests/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceControllerV2Test.java b/tests/robotests/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceControllerV2Test.java index 0023250849b..5e9179f0fb6 100644 --- a/tests/robotests/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceControllerV2Test.java +++ b/tests/robotests/src/com/android/settings/applications/appinfo/AppDataUsagePreferenceControllerV2Test.java @@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.nullable; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; @@ -31,18 +32,20 @@ import static org.mockito.Mockito.when; import android.content.Context; import android.content.pm.ApplicationInfo; import android.net.ConnectivityManager; -import android.net.INetworkStatsSession; import android.os.Bundle; import com.android.settings.core.BasePreferenceController; -import com.android.settings.datausage.AppDataUsage; +import com.android.settings.core.FeatureFlags; +import com.android.settings.datausage.AppDataUsageV2; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settingslib.applications.ApplicationsState.AppEntry; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.Mock; +import org.mockito.Mock;import android.net.INetworkStatsSession; +import android.util.FeatureFlagUtils; + import org.mockito.MockitoAnnotations; import org.robolectric.RuntimeEnvironment; import org.robolectric.util.ReflectionHelpers; @@ -67,6 +70,7 @@ public class AppDataUsagePreferenceControllerV2Test { mContext = spy(RuntimeEnvironment.application.getApplicationContext()); mController = spy(new AppDataUsagePreferenceControllerV2(mContext, "test_key")); mController.setParentFragment(mFragment); + FeatureFlagUtils.setEnabled(mContext, FeatureFlags.DATA_USAGE_V2, true); } @Test @@ -86,7 +90,8 @@ public class AppDataUsagePreferenceControllerV2Test { } @Test - public void onResume_noSession_shouldNotRestartDataLoader() { + public void onResume_notAvailable_shouldNotRestartDataLoader() { + FeatureFlagUtils.setEnabled(mContext, FeatureFlags.DATA_USAGE_V2, false); doReturn(mLoaderManager).when(mFragment).getLoaderManager(); mController.onResume(); @@ -96,25 +101,26 @@ public class AppDataUsagePreferenceControllerV2Test { } @Test - public void onResume_hasSession_shouldRestartDataLoader() { + public void onResume_isAvailable_shouldRestartDataLoader() { final ConnectivityManager connectivityManager = mock(ConnectivityManager.class); when(mContext.getSystemService(Context.CONNECTIVITY_SERVICE)) .thenReturn(connectivityManager); when(connectivityManager.isNetworkSupported(anyInt())).thenReturn(true); doReturn(mLoaderManager).when(mFragment).getLoaderManager(); - ReflectionHelpers.setField(mController, "mStatsSession", mock(INetworkStatsSession.class)); + doReturn(BasePreferenceController.AVAILABLE).when(mController).getAvailabilityStatus(); final AppEntry appEntry = mock(AppEntry.class); appEntry.info = new ApplicationInfo(); when(mFragment.getAppEntry()).thenReturn(appEntry); mController.onResume(); - verify(mLoaderManager).restartLoader( - eq(AppInfoDashboardFragment.LOADER_CHART_DATA), any(Bundle.class), eq(mController)); + verify(mLoaderManager).restartLoader(eq(AppInfoDashboardFragment.LOADER_CHART_DATA), + nullable(Bundle.class), eq(mController)); } @Test public void onPause_shouldDestroyDataLoader() { + doReturn(BasePreferenceController.AVAILABLE).when(mController).getAvailabilityStatus(); doReturn(mLoaderManager).when(mFragment).getLoaderManager(); mController.onPause(); @@ -124,7 +130,7 @@ public class AppDataUsagePreferenceControllerV2Test { @Test public void getDetailFragmentClass_shouldReturnAppDataUsage() { - assertThat(mController.getDetailFragmentClass()).isEqualTo(AppDataUsage.class); + assertThat(mController.getDetailFragmentClass()).isEqualTo(AppDataUsageV2.class); } @Test