Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b758e2b4 authored by Doris Ling's avatar Doris Ling
Browse files

Use the new loader to show app data usage summary.

- this is for getting the summary text for Apps & notifications ->
(select an app) -> Mobile data & Wi-Fi

Bug: 111751694
Test: make RunSettingsRoboTests
Change-Id: Ib4d8e7308ea8a782b9af3bbb99db2b1235e0aca2
parent 54e4100a
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -67,6 +67,12 @@
        android:summary="@string/summary_placeholder"
        settings:controller="com.android.settings.applications.appinfo.AppDataUsagePreferenceController" />

    <Preference
        android:key="data_settings_v2"
        android:title="@string/data_usage_app_summary_title"
        android:summary="@string/summary_placeholder"
        settings:controller="com.android.settings.applications.appinfo.AppDataUsagePreferenceControllerV2" />

    <Preference
        android:key="time_spent_in_app"
        android:title="@string/time_spent_in_app_pref_title"
+8 −1
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.os.RemoteException;
import android.os.ServiceManager;
import android.text.format.DateUtils;
import android.text.format.Formatter;
import android.util.FeatureFlagUtils;

import androidx.annotation.VisibleForTesting;
import androidx.loader.app.LoaderManager;
@@ -35,6 +36,7 @@ import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.Utils;
import com.android.settings.core.FeatureFlags;
import com.android.settings.datausage.AppDataUsage;
import com.android.settings.datausage.DataUsageList;
import com.android.settings.datausage.DataUsageUtils;
@@ -63,6 +65,9 @@ public class AppDataUsagePreferenceController extends AppInfoPreferenceControlle

    @Override
    public int getAvailabilityStatus() {
        if (FeatureFlagUtils.isEnabled(mContext, FeatureFlags.DATA_USAGE_V2)) {
            return UNSUPPORTED_ON_DEVICE;
        }
        return isBandwidthControlEnabled() ? AVAILABLE : CONDITIONALLY_UNAVAILABLE;
    }

@@ -99,8 +104,10 @@ public class AppDataUsagePreferenceController extends AppInfoPreferenceControlle

    @Override
    public void onPause() {
        if (mStatsSession != null) {
            mParent.getLoaderManager().destroyLoader(mParent.LOADER_CHART_DATA);
        }
    }

    @Override
    public Loader<ChartData> onCreateLoader(int id, Bundle args) {
+44 −35
Original line number Diff line number Diff line
/*
 * Copyright (C) 2017 The Android Open Source Project
 * Copyright (C) 2018 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.
@@ -17,14 +17,11 @@
package com.android.settings.applications.appinfo;

import android.content.Context;
import android.net.INetworkStatsService;
import android.net.INetworkStatsSession;
import android.net.NetworkTemplate;
import android.os.Bundle;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.text.format.DateUtils;
import android.text.format.Formatter;
import android.util.FeatureFlagUtils;

import androidx.annotation.VisibleForTesting;
import androidx.loader.app.LoaderManager;
@@ -35,21 +32,23 @@ import androidx.preference.PreferenceScreen;
import com.android.settings.R;
import com.android.settings.SettingsPreferenceFragment;
import com.android.settings.Utils;
import com.android.settings.datausage.AppDataUsage;
import com.android.settings.datausage.DataUsageList;
import com.android.settings.core.FeatureFlags;
import com.android.settings.datausage.AppDataUsageV2;
import com.android.settings.datausage.DataUsageUtils;
import com.android.settingslib.AppItem;
import com.android.settingslib.core.lifecycle.LifecycleObserver;
import com.android.settingslib.core.lifecycle.events.OnPause;
import com.android.settingslib.core.lifecycle.events.OnResume;
import com.android.settingslib.net.ChartData;
import com.android.settingslib.net.ChartDataLoaderCompat;
import com.android.settingslib.net.NetworkCycleDataForUid;
import com.android.settingslib.net.NetworkCycleDataForUidLoader;

import java.util.List;

public class AppDataUsagePreferenceControllerV2 extends AppInfoPreferenceControllerBase
        implements LoaderManager.LoaderCallbacks<ChartData>, LifecycleObserver, OnResume, OnPause {
        implements LoaderManager.LoaderCallbacks<List<NetworkCycleDataForUid>>, LifecycleObserver,
        OnResume, OnPause {

    private ChartData mChartData;
    private INetworkStatsSession mStatsSession;
    private List<NetworkCycleDataForUid> mAppUsageData;

    public AppDataUsagePreferenceControllerV2(Context context, String key) {
        super(context, key);
@@ -57,21 +56,15 @@ public class AppDataUsagePreferenceControllerV2 extends AppInfoPreferenceControl

    @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() {
        if (isAvailable()) {
            mParent.getLoaderManager().destroyLoader(mParent.LOADER_CHART_DATA);
        }
    }

    @Override
    public Loader<ChartData> onCreateLoader(int id, Bundle args) {
        return new ChartDataLoaderCompat(mContext, mStatsSession, args);
    public Loader<List<NetworkCycleDataForUid>> 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<ChartData> loader, ChartData data) {
        mChartData = data;
    public void onLoadFinished(Loader<List<NetworkCycleDataForUid>> loader,
            List<NetworkCycleDataForUid> data) {
        mAppUsageData = data;
        updateState(mPreference);
    }

    @Override
    public void onLoaderReset(Loader<ChartData> loader) {
    public void onLoaderReset(Loader<List<NetworkCycleDataForUid>> loader) {
        // Leave last result.
    }

    @Override
    protected Class<? extends SettingsPreferenceFragment> 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);
+7 −1
Original line number Diff line number Diff line
@@ -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);

        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);
+3 −5
Original line number Diff line number Diff line
@@ -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<List<NetworkCycleChartData>> onCreateLoader(int id, Bundle args) {
            return NetworkCycleChartDataLoader.builder(getContext())
                    .setNetworkPolicy(services.mPolicyEditor.getPolicy(mTemplate))
                    .setNetworkType(mNetworkType)
                    .setNetworkTemplate(mTemplate)
                    .setSubscriberId(mTelephonyManager.getSubscriberId(mSubId))
                    .build();
Loading