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

Commit cd10c2f3 authored by Junyu Lai's avatar Junyu Lai Committed by Automerger Merge Worker
Browse files

Merge "Fix crash when incrementing data usage request" into tm-dev am:...

Merge "Fix crash when incrementing data usage request" into tm-dev am: 5b73f4be am: 00816b15 am: 62424636

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/18583185



Change-Id: I4200e2a3e14b50c2bbf7695121814df6e06c4349
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 45812b51 62424636
Loading
Loading
Loading
Loading
+21 −12
Original line number Diff line number Diff line
@@ -192,10 +192,13 @@ public class MultipathPolicyTracker {
        private final int mSubId;

        private long mQuota;
        /** Current multipath budget. Nonzero iff we have budget and a UsageCallback is armed. */
        private long mMultipathBudget;
        /** Current multipath budget. Nonzero iff we have budget. */
        // The budget could be accessed by multiple threads, make it volatile to ensure the callers
        // on a different thread will not see the stale value.
        private volatile long mMultipathBudget;
        private final NetworkTemplate mNetworkTemplate;
        private final UsageCallback mUsageCallback;
        private boolean mUsageCallbackRegistered = false;
        private NetworkCapabilities mNetworkCapabilities;
        private final NetworkStatsManager mStatsManager;

@@ -234,7 +237,6 @@ public class MultipathPolicyTracker {
                @Override
                public void onThresholdReached(int networkType, String subscriberId) {
                    if (DBG) Log.d(TAG, "onThresholdReached for network " + network);
                    mMultipathBudget = 0;
                    updateMultipathBudget();
                }
            };
@@ -376,9 +378,9 @@ public class MultipathPolicyTracker {
                if (DBG) {
                    Log.d(TAG, "Setting callback for " + budget + " bytes on network " + network);
                }
                registerUsageCallback(budget);
                setMultipathBudget(budget);
            } else {
                maybeUnregisterUsageCallback();
                clearMultipathBudget();
            }
        }

@@ -403,23 +405,30 @@ public class MultipathPolicyTracker {
            return mMultipathBudget > 0;
        }

        private void registerUsageCallback(long budget) {
        // Sets the budget and registers a usage callback for it.
        private void setMultipathBudget(long budget) {
            maybeUnregisterUsageCallback();
            if (DBG) Log.d(TAG, "Registering callback, budget is " + mMultipathBudget);
            mStatsManager.registerUsageCallback(mNetworkTemplate, budget,
                    (command) -> mHandler.post(command), mUsageCallback);
            mUsageCallbackRegistered = true;
            mMultipathBudget = budget;
        }

        private void maybeUnregisterUsageCallback() {
            if (haveMultipathBudget()) {
            if (!mUsageCallbackRegistered) return;
            if (DBG) Log.d(TAG, "Unregistering callback, budget was " + mMultipathBudget);
            mStatsManager.unregisterUsageCallback(mUsageCallback);
                mMultipathBudget = 0;
            mUsageCallbackRegistered = false;
        }

        private void clearMultipathBudget() {
            maybeUnregisterUsageCallback();
            mMultipathBudget = 0;
        }

        void shutdown() {
            maybeUnregisterUsageCallback();
            clearMultipathBudget();
        }
    }