App ops: track system windows, monitoring changes.

Change-Id: I273e82bdad66ada3bf0f7ec9176bc304b9ee1ee8
diff --git a/services/java/com/android/server/LocationManagerService.java b/services/java/com/android/server/LocationManagerService.java
index 62f9965..78699fb 100644
--- a/services/java/com/android/server/LocationManagerService.java
+++ b/services/java/com/android/server/LocationManagerService.java
@@ -221,6 +221,16 @@
             mBlacklist.init();
             mGeofenceManager = new GeofenceManager(mContext, mBlacklist);
 
+            // Monitor for app ops mode changes.
+            AppOpsManager.Callback callback = new AppOpsManager.Callback() {
+                public void opChanged(int op, String packageName) {
+                    synchronized (mLock) {
+                        applyAllProviderRequirementsLocked();
+                    }
+                }
+            };
+            mAppOps.startWatchingMode(AppOpsManager.OP_COARSE_LOCATION, null, callback);
+
             // prepare providers
             loadProvidersLocked();
             updateProvidersLocked();
@@ -1335,6 +1345,17 @@
         }
     }
 
+    private void applyAllProviderRequirementsLocked() {
+        for (LocationProviderInterface p : mProviders) {
+            // If provider is already disabled, don't need to do anything
+            if (!isAllowedBySettingsLocked(p.getName(), UserHandle.getUid(mCurrentUserId, 0))) {
+                continue;
+            }
+
+            applyRequirementsLocked(p.getName());
+        }
+    }
+
     @Override
     public Location getLastLocation(LocationRequest request, String packageName) {
         if (D) Log.d(TAG, "getLastLocation: " + request);