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

Commit 387a2d01 authored by Soonil Nagarkar's avatar Soonil Nagarkar
Browse files

Reduce amount of appop work location does

Only react to app op changes if necessary.

Bug: 146204659
Test: presubmits
Change-Id: I2d0a79381c34d4a054a3d0a8aa2dbb37d05ae7e0
parent 7ba51f4f
Loading
Loading
Loading
Loading
+21 −12
Original line number Diff line number Diff line
@@ -305,11 +305,7 @@ public class LocationManagerService extends ILocationManager.Stub {
                        public void onOpChanged(int op, String packageName) {
                            // onOpChanged invoked on ui thread, move to our thread to reduce risk
                            // of blocking ui thread
                            mHandler.post(() -> {
                                synchronized (mLock) {
                                    onAppOpChangedLocked();
                                }
                            });
                            mHandler.post(() -> onAppOpChanged(packageName));
                        }
                    });
            mPackageManager.addOnPermissionsChangeListener(
@@ -392,13 +388,26 @@ public class LocationManagerService extends ILocationManager.Stub {
        }
    }

    @GuardedBy("mLock")
    private void onAppOpChangedLocked() {
    private void onAppOpChanged(String packageName) {
        synchronized (mLock) {
            for (Receiver receiver : mReceivers.values()) {
                if (receiver.mCallerIdentity.mPackageName.equals(packageName)) {
                    receiver.updateMonitoring(true);
                }
        for (LocationProviderManager manager : mProviderManagers) {
            applyRequirementsLocked(manager);
            }

            HashSet<String> affectedProviders = new HashSet<>(mRecordsByProvider.size());
            for (Entry<String, ArrayList<UpdateRecord>> entry : mRecordsByProvider.entrySet()) {
                String provider = entry.getKey();
                for (UpdateRecord record : entry.getValue()) {
                    if (record.mReceiver.mCallerIdentity.mPackageName.equals(packageName)) {
                        affectedProviders.add(provider);
                    }
                }
            }
            for (String provider : affectedProviders) {
                applyRequirementsLocked(provider);
            }
        }
    }