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

Commit 80112c15 authored by Chaohui Wang's avatar Chaohui Wang Committed by Automerger Merge Worker
Browse files

Merge changes I50fb79aa,I5a84a9b1,Iea61c06d into udc-dev am: 0fa23e97

parents 00906998 0fa23e97
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -17,7 +17,8 @@
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">


    <PreferenceCategory
    <PreferenceCategory
        android:key="usage_amount">
        android:key="usage_amount"
        android:title="@string/summary_placeholder">


        <com.android.settings.datausage.ChartDataUsagePreference
        <com.android.settings.datausage.ChartDataUsagePreference
            android:key="chart_data" />
            android:key="chart_data" />
+17 −40
Original line number Original line Diff line number Diff line
@@ -48,8 +48,8 @@ public class ChartDataUsagePreference extends Preference {
    // Set to half a meg for now.
    // Set to half a meg for now.
    private static final long RESOLUTION = DataUnit.MEBIBYTES.toBytes(1) / 2;
    private static final long RESOLUTION = DataUnit.MEBIBYTES.toBytes(1) / 2;


    private int mWarningColor;
    private final int mWarningColor;
    private int mLimitColor;
    private final int mLimitColor;


    private Resources mResources;
    private Resources mResources;
    private NetworkPolicy mPolicy;
    private NetworkPolicy mPolicy;
@@ -58,35 +58,35 @@ public class ChartDataUsagePreference extends Preference {
    private NetworkCycleChartData mNetworkCycleChartData;
    private NetworkCycleChartData mNetworkCycleChartData;
    private int mSecondaryColor;
    private int mSecondaryColor;
    private int mSeriesColor;
    private int mSeriesColor;
    private UsageView mUsageView;
    private boolean mSuspendUiUpdate;  // Suppress UI updates to save some CPU time.


    public ChartDataUsagePreference(Context context, AttributeSet attrs) {
    public ChartDataUsagePreference(Context context, AttributeSet attrs) {
        super(context, attrs);
        super(context, attrs);
        mResources = context.getResources();
        setSelectable(false);
        setSelectable(false);
        mLimitColor = Utils.getColorAttrDefaultColor(context, android.R.attr.colorError);
        mWarningColor = Utils.getColorAttrDefaultColor(context, android.R.attr.textColorSecondary);
        setLayoutResource(R.layout.data_usage_graph);
    }
    }


    @Override
    @Override
    public void onBindViewHolder(PreferenceViewHolder holder) {
    public void onBindViewHolder(PreferenceViewHolder holder) {
        super.onBindViewHolder(holder);
        super.onBindViewHolder(holder);
        mUsageView = (UsageView) holder.findViewById(R.id.data_usage);
        final UsageView chart = (UsageView) holder.findViewById(R.id.data_usage);
    }
        if (mNetworkCycleChartData == null) {

    private void onUpdateView() {
        if ((mUsageView == null) || (mNetworkCycleChartData == null)) {
            return;
            return;
        }
        }

        final int top = getTop();
        final int top = getTop();
        mUsageView.clearPaths();
        chart.clearPaths();
        mUsageView.configureGraph(toInt(mEnd - mStart), top);
        chart.configureGraph(toInt(mEnd - mStart), top);
        calcPoints(mUsageView, mNetworkCycleChartData.getUsageBuckets());
        calcPoints(chart, mNetworkCycleChartData.getUsageBuckets());
        setupContentDescription(mUsageView, mNetworkCycleChartData.getUsageBuckets());
        setupContentDescription(chart, mNetworkCycleChartData.getUsageBuckets());
        mUsageView.setBottomLabels(new CharSequence[] {
        chart.setBottomLabels(new CharSequence[] {
                Utils.formatDateRange(getContext(), mStart, mStart),
                Utils.formatDateRange(getContext(), mStart, mStart),
                Utils.formatDateRange(getContext(), mEnd, mEnd),
                Utils.formatDateRange(getContext(), mEnd, mEnd),
        });
        });


        bindNetworkPolicy(mUsageView, mPolicy, top);
        bindNetworkPolicy(chart, mPolicy, top);
    }
    }


    public int getTop() {
    public int getTop() {
@@ -291,17 +291,10 @@ public class ChartDataUsagePreference extends Preference {
        return new SpannableStringBuilder().append(label, new ForegroundColorSpan(mLimitColor), 0);
        return new SpannableStringBuilder().append(label, new ForegroundColorSpan(mLimitColor), 0);
    }
    }


    public void onPreparingChartData() {
        mSuspendUiUpdate = true;
    }

    public void setNetworkPolicy(NetworkPolicy policy) {
    public void setNetworkPolicy(NetworkPolicy policy) {
        mPolicy = policy;
        mPolicy = policy;
        if ((!mSuspendUiUpdate) && (mResources != null)) {
            onUpdateView();
        notifyChanged();
        notifyChanged();
    }
    }
    }


    public long getInspectStart() {
    public long getInspectStart() {
        return mStart;
        return mStart;
@@ -312,31 +305,15 @@ public class ChartDataUsagePreference extends Preference {
    }
    }


    public void setNetworkCycleData(NetworkCycleChartData data) {
    public void setNetworkCycleData(NetworkCycleChartData data) {
        if (data == null) {
            return;
        }
        mNetworkCycleChartData = data;
        mNetworkCycleChartData = data;
        mStart = data.getStartTime();
        mStart = data.getStartTime();
        mEnd = data.getEndTime();
        mEnd = data.getEndTime();
        if (mResources == null) {
            Context context = getContext();
            mResources = context.getResources();
            mLimitColor = Utils.getColorAttrDefaultColor(context, android.R.attr.colorError);
            mWarningColor = Utils.getColorAttrDefaultColor(context,
                    android.R.attr.textColorSecondary);
            setLayoutResource(R.layout.data_usage_graph);
        }
        onUpdateView();
        notifyChanged();
        notifyChanged();
        mSuspendUiUpdate = false;
    }
    }


    public void setColors(int seriesColor, int secondaryColor) {
    public void setColors(int seriesColor, int secondaryColor) {
        mSeriesColor = seriesColor;
        mSeriesColor = seriesColor;
        mSecondaryColor = secondaryColor;
        mSecondaryColor = secondaryColor;
        if ((!mSuspendUiUpdate) && (mResources != null)) {
            onUpdateView();
        notifyChanged();
        notifyChanged();
    }
    }
}
}
}
+1 −11
Original line number Original line Diff line number Diff line
@@ -21,7 +21,6 @@ import com.android.settingslib.net.NetworkCycleData;
import com.android.settingslib.widget.SettingsSpinnerAdapter;
import com.android.settingslib.widget.SettingsSpinnerAdapter;


import java.util.List;
import java.util.List;
import java.util.Objects;


public class CycleAdapter extends SettingsSpinnerAdapter<CycleAdapter.CycleItem> {
public class CycleAdapter extends SettingsSpinnerAdapter<CycleAdapter.CycleItem> {


@@ -67,7 +66,7 @@ public class CycleAdapter extends SettingsSpinnerAdapter<CycleAdapter.CycleItem>
     * Rebuild list based on network data. Always selects the newest item,
     * Rebuild list based on network data. Always selects the newest item,
     * updating the inspection range on chartData.
     * updating the inspection range on chartData.
     */
     */
    public boolean updateCycleList(List<? extends NetworkCycleData> cycleData) {
    public void updateCycleList(List<? extends NetworkCycleData> cycleData) {
        mSpinner.setOnItemSelectedListener(mListener);
        mSpinner.setOnItemSelectedListener(mListener);
        // stash away currently selected cycle to try restoring below
        // stash away currently selected cycle to try restoring below
        final CycleAdapter.CycleItem previousItem = (CycleAdapter.CycleItem)
        final CycleAdapter.CycleItem previousItem = (CycleAdapter.CycleItem)
@@ -83,16 +82,7 @@ public class CycleAdapter extends SettingsSpinnerAdapter<CycleAdapter.CycleItem>
        if (getCount() > 0) {
        if (getCount() > 0) {
            final int position = findNearestPosition(previousItem);
            final int position = findNearestPosition(previousItem);
            mSpinner.setSelection(position);
            mSpinner.setSelection(position);

            // only force-update cycle when changed; skipping preserves any
            // user-defined inspection region.
            final CycleAdapter.CycleItem selectedItem = getItem(position);
            if (!Objects.equals(selectedItem, previousItem)) {
                mListener.onItemSelected(null, null, position, 0);
                return false;
            }
        }
        }
        return true;
    }
    }


    /**
    /**
+56 −51
Original line number Original line Diff line number Diff line
@@ -75,6 +75,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Arrays;
import java.util.Collections;
import java.util.Collections;
import java.util.List;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Optional;


/**
/**
@@ -118,7 +119,11 @@ public class DataUsageList extends DataUsageBaseFragment


    private ChartDataUsagePreference mChart;
    private ChartDataUsagePreference mChart;
    private List<NetworkCycleChartData> mCycleData;
    private List<NetworkCycleChartData> mCycleData;
    // 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,
    // which need be cleared when resumed.
    private CycleAdapter.CycleItem mLastDisplayedCycle;
    private UidDetailProvider mUidDetailProvider;
    private UidDetailProvider mUidDetailProvider;
    private CycleAdapter mCycleAdapter;
    private CycleAdapter mCycleAdapter;
    private Preference mUsageAmount;
    private Preference mUsageAmount;
@@ -172,20 +177,7 @@ public class DataUsageList extends DataUsageBaseFragment
    public void onViewCreated(View v, Bundle savedInstanceState) {
    public void onViewCreated(View v, Bundle savedInstanceState) {
        super.onViewCreated(v, savedInstanceState);
        super.onViewCreated(v, savedInstanceState);


        // Show loading
        mLoadingViewController = new LoadingViewController(
                v.findViewById(R.id.loading_container), getListView());
        mLoadingViewController.showLoadingViewDelayed();
    }

    private void onEndOfLoading() {
        if (mHeader != null) {
            return;
        }
        mHeader = setPinnedHeaderView(R.layout.apps_filter_spinner);
        mHeader = setPinnedHeaderView(R.layout.apps_filter_spinner);

        mCycleSpinner = mHeader.findViewById(R.id.filter_spinner);

        mHeader.findViewById(R.id.filter_settings).setOnClickListener(btn -> {
        mHeader.findViewById(R.id.filter_settings).setOnClickListener(btn -> {
            final Bundle args = new Bundle();
            final Bundle args = new Bundle();
            args.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, mTemplate);
            args.putParcelable(DataUsageList.EXTRA_NETWORK_TEMPLATE, mTemplate);
@@ -196,6 +188,8 @@ public class DataUsageList extends DataUsageBaseFragment
                    .setArguments(args)
                    .setArguments(args)
                    .launch();
                    .launch();
        });
        });
        mCycleSpinner = mHeader.findViewById(R.id.filter_spinner);
        mCycleSpinner.setVisibility(View.GONE);
        mCycleAdapter = new CycleAdapter(mCycleSpinner.getContext(), new SpinnerInterface() {
        mCycleAdapter = new CycleAdapter(mCycleSpinner.getContext(), new SpinnerInterface() {
            @Override
            @Override
            public void setAdapter(CycleAdapter cycleAdapter) {
            public void setAdapter(CycleAdapter cycleAdapter) {
@@ -227,16 +221,18 @@ public class DataUsageList extends DataUsageBaseFragment
                super.sendAccessibilityEvent(host, eventType);
                super.sendAccessibilityEvent(host, eventType);
            }
            }
        });
        });

        mLoadingViewController = new LoadingViewController(
                getView().findViewById(R.id.loading_container), getListView());
    }
    }


    @Override
    @Override
    public void onResume() {
    public void onResume() {
        super.onResume();
        super.onResume();
        mLoadingViewController.showLoadingViewDelayed();
        mDataStateListener.start(mSubId);
        mDataStateListener.start(mSubId);

        mCycles = null;
        if (mChart != null) {
        mLastDisplayedCycle = null;
            mChart.onPreparingChartData();
        }


        // kick off loader for network history
        // kick off loader for network history
        // TODO: consider chaining two loaders together instead of reloading
        // TODO: consider chaining two loaders together instead of reloading
@@ -345,9 +341,6 @@ public class DataUsageList extends DataUsageBaseFragment
     */
     */
    @VisibleForTesting
    @VisibleForTesting
    void updatePolicy() {
    void updatePolicy() {
        if (mHeader == null) {
            return;
        }
        final NetworkPolicy policy = services.mPolicyEditor.getPolicy(mTemplate);
        final NetworkPolicy policy = services.mPolicyEditor.getPolicy(mTemplate);
        final View configureButton = mHeader.findViewById(R.id.filter_settings);
        final View configureButton = mHeader.findViewById(R.id.filter_settings);
        //SUB SELECT
        //SUB SELECT
@@ -362,9 +355,46 @@ public class DataUsageList extends DataUsageBaseFragment
        }
        }


        // generate cycle list based on policy and available history
        // generate cycle list based on policy and available history
        if (mCycleAdapter.updateCycleList(mCycleData)) {
        mCycleAdapter.updateCycleList(mCycleData);
            updateDetailData();
        updateSelectedCycle();
    }

    /**
     * Updates the chart and detail data when initial loaded or selected cycle changed.
     */
    private void updateSelectedCycle() {
        // Avoid from updating UI after #onStop.
        if (!getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
            return;
        }

        // Avoid from updating UI when async query still on-going.
        // This could happen when a request from #onMobileDataEnabledChange.
        if (mCycleData == null) {
            return;
        }

        final int position = mCycleSpinner.getSelectedItemPosition();
        if (mCycleAdapter.getCount() == 0 || position < 0) {
            return;
        }
        }
        final CycleAdapter.CycleItem cycle = mCycleAdapter.getItem(position);
        if (Objects.equals(cycle, mLastDisplayedCycle)) {
            // Avoid duplicate update to avoid page flash.
            return;
        }
        mLastDisplayedCycle = cycle;

        if (LOGD) {
            Log.d(TAG, "showing cycle " + cycle + ", [start=" + cycle.start + ", end="
                    + cycle.end + "]");
        }

        // update chart to show selected cycle, and update detail data
        // to match updated sweep bounds.
        mChart.setNetworkCycleData(mCycleData.get(position));

        updateDetailData();
    }
    }


    /**
    /**
@@ -554,33 +584,10 @@ public class DataUsageList extends DataUsageBaseFragment
        return Math.max(largest, item.total);
        return Math.max(largest, item.total);
    }
    }


    private OnItemSelectedListener mCycleListener = new OnItemSelectedListener() {
    private final OnItemSelectedListener mCycleListener = new OnItemSelectedListener() {
        @Override
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            final CycleAdapter.CycleItem cycle = (CycleAdapter.CycleItem)
            updateSelectedCycle();
                    mCycleSpinner.getSelectedItem();

            if (LOGD) {
                Log.d(TAG, "showing cycle " + cycle + ", start=" + cycle.start + ", end="
                        + cycle.end + "]");
            }

            // Avoid from updating UI after #onStop.
            if (!getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
                return;
            }

            // Avoid from updating UI when async query still on-going.
            // This could happen when a request from #onMobileDataEnabledChange.
            if (mCycleData == null) {
                return;
            }

            // update chart to show selected cycle, and update detail data
            // to match updated sweep bounds.
            mChart.setNetworkCycleData(mCycleData.get(position));

            updateDetailData();
        }
        }


        @Override
        @Override
@@ -602,13 +609,11 @@ public class DataUsageList extends DataUsageBaseFragment
        @Override
        @Override
        public void onLoadFinished(Loader<List<NetworkCycleChartData>> loader,
        public void onLoadFinished(Loader<List<NetworkCycleChartData>> loader,
                List<NetworkCycleChartData> data) {
                List<NetworkCycleChartData> data) {
            onEndOfLoading();
            if (mLoadingViewController != null) {
            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);
        }
        }


        @Override
        @Override
+22 −15
Original line number Original line Diff line number Diff line
@@ -14,6 +14,7 @@


package com.android.settings.datausage;
package com.android.settings.datausage;


import android.annotation.Nullable;
import android.content.Context;
import android.content.Context;
import android.util.AttributeSet;
import android.util.AttributeSet;
import android.view.View;
import android.view.View;
@@ -28,6 +29,7 @@ import com.android.settings.R;
public class SpinnerPreference extends Preference implements CycleAdapter.SpinnerInterface {
public class SpinnerPreference extends Preference implements CycleAdapter.SpinnerInterface {


    private CycleAdapter mAdapter;
    private CycleAdapter mAdapter;
    @Nullable
    private AdapterView.OnItemSelectedListener mListener;
    private AdapterView.OnItemSelectedListener mListener;
    private Object mCurrentObject;
    private Object mCurrentObject;
    private int mPosition;
    private int mPosition;
@@ -88,19 +90,24 @@ public class SpinnerPreference extends Preference implements CycleAdapter.Spinne
        view.findViewById(R.id.cycles_spinner).performClick();
        view.findViewById(R.id.cycles_spinner).performClick();
    }
    }


    private final AdapterView.OnItemSelectedListener mOnSelectedListener
    private final AdapterView.OnItemSelectedListener mOnSelectedListener =
            = new AdapterView.OnItemSelectedListener() {
            new AdapterView.OnItemSelectedListener() {
                @Override
                @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                public void onItemSelected(
                        AdapterView<?> parent, View view, int position, long id) {
                    if (mPosition == position) return;
                    if (mPosition == position) return;
                    mPosition = position;
                    mPosition = position;
                    mCurrentObject = mAdapter.getItem(position);
                    mCurrentObject = mAdapter.getItem(position);
                    if (mListener != null) {
                        mListener.onItemSelected(parent, view, position, id);
                        mListener.onItemSelected(parent, view, position, id);
                    }
                    }
                }


                @Override
                @Override
                public void onNothingSelected(AdapterView<?> parent) {
                public void onNothingSelected(AdapterView<?> parent) {
                    if (mListener != null) {
                        mListener.onNothingSelected(parent);
                        mListener.onNothingSelected(parent);
                    }
                    }
                }
            };
            };
}
}
Loading