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

Commit 70c56f9b authored by Wu Ahan's avatar Wu Ahan
Browse files

Catch SecurityException within LatencyTracker

In case of running tests that the main thread passes the permission
check, but the background thread doesn't have necessary permissions.

Like ag/21806782, LatencyTracker swallows it since it's ok to ignore the
device config changes in this case.

Bug: 270682188
Test: abtd
Change-Id: I4e899974e5abb42f73de0a73a69ec73984cfaedf
parent e61670d5
Loading
Loading
Loading
Loading
+31 −17
Original line number Diff line number Diff line
@@ -367,28 +367,42 @@ public class LatencyTracker {
     * using a single static object.
     */
    @VisibleForTesting
    @RequiresPermission(Manifest.permission.READ_DEVICE_CONFIG)
    public void startListeningForLatencyTrackerConfigChanges() {
        final Context context = ActivityThread.currentApplication();
        if (context != null
                && context.checkCallingOrSelfPermission(READ_DEVICE_CONFIG) == PERMISSION_GRANTED) {
            // Post initialization to the background in case we're running on the main thread.
            BackgroundThread.getHandler().post(() -> this.updateProperties(
                    DeviceConfig.getProperties(NAMESPACE_LATENCY_TRACKER)));
            DeviceConfig.addOnPropertiesChangedListener(NAMESPACE_LATENCY_TRACKER,
                    BackgroundThread.getExecutor(), mOnPropertiesChangedListener);
        } else {
            if (DEBUG) {
        if (context == null) {
                    Log.d(TAG, "No application for " + ActivityThread.currentActivityThread());
                } else {
            if (DEBUG) {
                Log.d(TAG, "No application for package: " + ActivityThread.currentPackageName());
            }
            return;
        }
        if (context.checkCallingOrSelfPermission(READ_DEVICE_CONFIG) != PERMISSION_GRANTED) {
            if (DEBUG) {
                synchronized (mLock) {
                    Log.d(TAG, "Initialized the LatencyTracker."
                            + " (No READ_DEVICE_CONFIG permission to change configs)"
                            + " enabled=" + mEnabled + ", package=" + context.getPackageName());
                }
            }
            return;
        }
        }

        // Post initialization to the background in case we're running on the main thread.
        BackgroundThread.getHandler().post(() -> {
            try {
                this.updateProperties(
                        DeviceConfig.getProperties(NAMESPACE_LATENCY_TRACKER));
                DeviceConfig.addOnPropertiesChangedListener(NAMESPACE_LATENCY_TRACKER,
                        BackgroundThread.getExecutor(), mOnPropertiesChangedListener);
            } catch (SecurityException ex) {
                // In case of running tests that the main thread passes the check,
                // but the background thread doesn't have necessary permissions.
                // Swallow it since it's ok to ignore device config changes in the tests.
                Log.d(TAG, "Can't get properties: READ_DEVICE_CONFIG granted="
                        + context.checkCallingOrSelfPermission(READ_DEVICE_CONFIG)
                        + ", package=" + context.getPackageName());
            }
        });
    }

    /**