diff options
| author | 2011-07-27 22:08:02 -0700 | |
|---|---|---|
| committer | 2011-07-27 22:08:02 -0700 | |
| commit | 2043b01b207aae3458da395bc6d501d76e59425c (patch) | |
| tree | 8b8660a6dd748c3cd03462e812e70afa54a23d75 | |
| parent | 35a9c52791882bc58d3a6716e0fd8544889d90c3 (diff) | |
| parent | 4664500de0c1b270bce4991a400ab439ff2ef77b (diff) | |
Merge "Maintain separate "restrict background data" flag."
| -rw-r--r-- | core/java/android/net/INetworkPolicyManager.aidl | 3 | ||||
| -rw-r--r-- | services/java/com/android/server/net/NetworkPolicyManagerService.java | 145 | 
2 files changed, 84 insertions, 64 deletions
diff --git a/core/java/android/net/INetworkPolicyManager.aidl b/core/java/android/net/INetworkPolicyManager.aidl index 6fde746a556d..3e07b0a0a8f9 100644 --- a/core/java/android/net/INetworkPolicyManager.aidl +++ b/core/java/android/net/INetworkPolicyManager.aidl @@ -40,4 +40,7 @@ interface INetworkPolicyManager {      void snoozePolicy(in NetworkTemplate template); +    void setRestrictBackground(boolean restrictBackground); +    boolean getRestrictBackground(); +  } diff --git a/services/java/com/android/server/net/NetworkPolicyManagerService.java b/services/java/com/android/server/net/NetworkPolicyManagerService.java index 2e1e69bdead1..756cd004e4ff 100644 --- a/services/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/java/com/android/server/net/NetworkPolicyManagerService.java @@ -25,7 +25,6 @@ import static android.Manifest.permission.READ_PHONE_STATE;  import static android.content.Intent.ACTION_PACKAGE_ADDED;  import static android.content.Intent.ACTION_UID_REMOVED;  import static android.content.Intent.EXTRA_UID; -import static android.net.ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED;  import static android.net.ConnectivityManager.CONNECTIVITY_ACTION;  import static android.net.ConnectivityManager.TYPE_MOBILE;  import static android.net.NetworkPolicy.LIMIT_DISABLED; @@ -45,6 +44,12 @@ import static android.net.NetworkTemplate.MATCH_MOBILE_4G;  import static android.net.NetworkTemplate.buildTemplateMobileAll;  import static android.text.format.DateUtils.DAY_IN_MILLIS;  import static com.android.internal.util.Preconditions.checkNotNull; +import static com.android.server.net.NetworkPolicyManagerService.XmlUtils.readBooleanAttribute; +import static com.android.server.net.NetworkPolicyManagerService.XmlUtils.readIntAttribute; +import static com.android.server.net.NetworkPolicyManagerService.XmlUtils.readLongAttribute; +import static com.android.server.net.NetworkPolicyManagerService.XmlUtils.writeBooleanAttribute; +import static com.android.server.net.NetworkPolicyManagerService.XmlUtils.writeIntAttribute; +import static com.android.server.net.NetworkPolicyManagerService.XmlUtils.writeLongAttribute;  import static com.android.server.net.NetworkStatsService.ACTION_NETWORK_STATS_UPDATED;  import static org.xmlpull.v1.XmlPullParser.END_DOCUMENT;  import static org.xmlpull.v1.XmlPullParser.START_TAG; @@ -134,6 +139,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {      private static final int VERSION_INIT = 1;      private static final int VERSION_ADDED_SNOOZE = 2; +    private static final int VERSION_ADDED_RESTRICT_BACKGROUND = 3;      private static final long KB_IN_BYTES = 1024;      private static final long MB_IN_BYTES = KB_IN_BYTES * 1024; @@ -149,6 +155,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {      private static final String TAG_UID_POLICY = "uid-policy";      private static final String ATTR_VERSION = "version"; +    private static final String ATTR_RESTRICT_BACKGROUND = "restrictBackground";      private static final String ATTR_NETWORK_TEMPLATE = "networkTemplate";      private static final String ATTR_SUBSCRIBER_ID = "subscriberId";      private static final String ATTR_CYCLE_DAY = "cycleDay"; @@ -176,7 +183,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {      private final Object mRulesLock = new Object();      private boolean mScreenOn; -    private boolean mBackgroundData; +    private boolean mRestrictBackground;      /** Defined network policies. */      private HashMap<NetworkTemplate, NetworkPolicy> mNetworkPolicy = Maps.newHashMap(); @@ -252,10 +259,13 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {          synchronized (mRulesLock) {              // read policy from disk              readPolicyLocked(); + +            if (mRestrictBackground) { +                updateRulesForRestrictBackgroundLocked(); +            }          }          updateScreenOn(); -        updateBackgroundData(true);          try {              mActivityManager.registerProcessObserver(mProcessObserver); @@ -296,10 +306,6 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {          mContext.registerReceiver(                  mStatsReceiver, statsFilter, READ_NETWORK_USAGE_HISTORY, mHandler); -        // listen for changes to background data flag -        final IntentFilter bgFilter = new IntentFilter(ACTION_BACKGROUND_DATA_SETTING_CHANGED); -        mContext.registerReceiver(mBgReceiver, bgFilter, CONNECTIVITY_INTERNAL, mHandler); -      }      private IProcessObserver mProcessObserver = new IProcessObserver.Stub() { @@ -393,22 +399,6 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {      };      /** -     * Receiver that watches for -     * {@link #ACTION_BACKGROUND_DATA_SETTING_CHANGED}. -     */ -    private BroadcastReceiver mBgReceiver = new BroadcastReceiver() { -        @Override -        public void onReceive(Context context, Intent intent) { -            // on background handler thread, and verified CONNECTIVITY_INTERNAL -            // permission above. - -            synchronized (mRulesLock) { -                updateBackgroundData(false); -            } -        } -    }; - -    /**       * Observer that watches for {@link INetworkManagementService} alerts.       */      private INetworkManagementEventObserver mAlertObserver = new NetworkAlertObserver() { @@ -842,6 +832,16 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {                  if (type == START_TAG) {                      if (TAG_POLICY_LIST.equals(tag)) {                          version = readIntAttribute(in, ATTR_VERSION); +                        if (version >= VERSION_ADDED_RESTRICT_BACKGROUND) { +                            mRestrictBackground = readBooleanAttribute( +                                    in, ATTR_RESTRICT_BACKGROUND); +                        } else { +                            try { +                                mRestrictBackground = !mConnManager.getBackgroundDataSetting(); +                            } catch (RemoteException e) { +                                mRestrictBackground = false; +                            } +                        }                      } else if (TAG_NETWORK_POLICY.equals(tag)) {                          final int networkTemplate = readIntAttribute(in, ATTR_NETWORK_TEMPLATE); @@ -897,7 +897,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {              out.startDocument(null, true);              out.startTag(null, TAG_POLICY_LIST); -            writeIntAttribute(out, ATTR_VERSION, VERSION_ADDED_SNOOZE); +            writeIntAttribute(out, ATTR_VERSION, VERSION_ADDED_RESTRICT_BACKGROUND); +            writeBooleanAttribute(out, ATTR_RESTRICT_BACKGROUND, mRestrictBackground);              // write all known network policies              for (NetworkPolicy policy : mNetworkPolicy.values()) { @@ -1047,6 +1048,25 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {      }      @Override +    public void setRestrictBackground(boolean restrictBackground) { +        mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG); + +        synchronized (mRulesLock) { +            mRestrictBackground = restrictBackground; +            updateRulesForRestrictBackgroundLocked(); +        } +    } + +    @Override +    public boolean getRestrictBackground() { +        mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG); + +        synchronized (mRulesLock) { +            return mRestrictBackground; +        } +    } + +    @Override      protected void dump(FileDescriptor fd, PrintWriter fout, String[] args) {          mContext.enforceCallingOrSelfPermission(DUMP, TAG); @@ -1065,6 +1085,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {                  return;              } +            fout.print("Restrict background: "); fout.println(mRestrictBackground);              fout.println("Network policies:");              for (NetworkPolicy policy : mNetworkPolicy.values()) {                  fout.print("  "); fout.println(policy.toString()); @@ -1157,21 +1178,6 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {          }      } -    private void updateBackgroundData(boolean systemReady) { -        synchronized (mRulesLock) { -            try { -                mBackgroundData = mConnManager.getBackgroundDataSetting(); -            } catch (RemoteException e) { -            } -            if (systemReady && mBackgroundData) { -                // typical behavior of background enabled during systemReady; -                // no need to clear rules for all UIDs. -            } else { -                updateRulesForBackgroundDataLocked(); -            } -        } -    } -      /**       * Update rules that might be changed by {@link #mScreenOn} value.       */ @@ -1187,9 +1193,9 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {      }      /** -     * Update rules that might be changed by {@link #mBackgroundData} value. +     * Update rules that might be changed by {@link #mRestrictBackground} value.       */ -    private void updateRulesForBackgroundDataLocked() { +    private void updateRulesForRestrictBackgroundLocked() {          // update rules for all installed applications          final PackageManager pm = mContext.getPackageManager();          final List<ApplicationInfo> apps = pm.getInstalledApplications(0); @@ -1223,7 +1229,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {              // uid in background, and policy says to block metered data              uidRules = RULE_REJECT_METERED;          } -        if (!uidForeground && !mBackgroundData) { +        if (!uidForeground && mRestrictBackground) {              // uid in background, and global background disabled              uidRules = RULE_REJECT_METERED;          } @@ -1383,32 +1389,43 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {          fout.print("]");      } -    private static int readIntAttribute(XmlPullParser in, String name) throws IOException { -        final String value = in.getAttributeValue(null, name); -        try { -            return Integer.parseInt(value); -        } catch (NumberFormatException e) { -            throw new ProtocolException("problem parsing " + name + "=" + value + " as int"); +    public static class XmlUtils { +        public static int readIntAttribute(XmlPullParser in, String name) throws IOException { +            final String value = in.getAttributeValue(null, name); +            try { +                return Integer.parseInt(value); +            } catch (NumberFormatException e) { +                throw new ProtocolException("problem parsing " + name + "=" + value + " as int"); +            }          } -    } -    private static long readLongAttribute(XmlPullParser in, String name) throws IOException { -        final String value = in.getAttributeValue(null, name); -        try { -            return Long.parseLong(value); -        } catch (NumberFormatException e) { -            throw new ProtocolException("problem parsing " + name + "=" + value + " as long"); +        public static void writeIntAttribute(XmlSerializer out, String name, int value) +                throws IOException { +            out.attribute(null, name, Integer.toString(value));          } -    } -    private static void writeIntAttribute(XmlSerializer out, String name, int value) -            throws IOException { -        out.attribute(null, name, Integer.toString(value)); -    } +        public static long readLongAttribute(XmlPullParser in, String name) throws IOException { +            final String value = in.getAttributeValue(null, name); +            try { +                return Long.parseLong(value); +            } catch (NumberFormatException e) { +                throw new ProtocolException("problem parsing " + name + "=" + value + " as long"); +            } +        } -    private static void writeLongAttribute(XmlSerializer out, String name, long value) -            throws IOException { -        out.attribute(null, name, Long.toString(value)); -    } +        public static void writeLongAttribute(XmlSerializer out, String name, long value) +                throws IOException { +            out.attribute(null, name, Long.toString(value)); +        } +        public static boolean readBooleanAttribute(XmlPullParser in, String name) { +            final String value = in.getAttributeValue(null, name); +            return Boolean.parseBoolean(value); +        } + +        public static void writeBooleanAttribute(XmlSerializer out, String name, boolean value) +                throws IOException { +            out.attribute(null, name, Boolean.toString(value)); +        } +    }  }  |