diff options
author | Danesh M <daneshm90@gmail.com> | 2016-03-07 15:17:59 -0800 |
---|---|---|
committer | Danesh M <daneshm90@gmail.com> | 2016-03-21 11:44:50 -0700 |
commit | a3549a2715e47ce07297315586ea9c5798da2997 (patch) | |
tree | 895cfd77ae3684f4e3d1c44410d33826246875a0 /src | |
parent | f5dea70443a1c0643be50cf8058ddbfff477712f (diff) | |
download | packages_apps_Settings-a3549a2715e47ce07297315586ea9c5798da2997.zip packages_apps_Settings-a3549a2715e47ce07297315586ea9c5798da2997.tar.gz packages_apps_Settings-a3549a2715e47ce07297315586ea9c5798da2997.tar.bz2 |
Settings : Add per app internet/data control
CYAN-3976
CRACKLING-834
Change-Id: I13192df837c057b5cadde8f31532e12daaf3c1b0
Diffstat (limited to 'src')
3 files changed, 75 insertions, 2 deletions
diff --git a/src/com/android/settings/applications/AppOpsDetails.java b/src/com/android/settings/applications/AppOpsDetails.java index 12da8b8..af80367 100644 --- a/src/com/android/settings/applications/AppOpsDetails.java +++ b/src/com/android/settings/applications/AppOpsDetails.java @@ -16,6 +16,7 @@ package com.android.settings.applications; +import android.Manifest; import android.app.Activity; import android.app.AppOpsManager; import android.app.Fragment; @@ -28,6 +29,7 @@ import android.content.pm.PermissionGroupInfo; import android.content.pm.PermissionInfo; import android.content.res.Resources; import android.graphics.drawable.Drawable; +import android.net.NetworkPolicyManager; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; @@ -49,6 +51,9 @@ import com.android.settings.Utils; import java.util.List; +import static android.net.NetworkPolicyManager.POLICY_REJECT_ON_DATA; +import static android.net.NetworkPolicyManager.POLICY_REJECT_ON_WLAN; + public class AppOpsDetails extends InstrumentedFragment { static final String TAG = "AppOpsDetails"; @@ -61,6 +66,7 @@ public class AppOpsDetails extends InstrumentedFragment { private LayoutInflater mInflater; private View mRootView; private LinearLayout mOperationsSection; + private NetworkPolicyManager mPolicyManager; private final int MODE_ALLOWED = 0; private final int MODE_IGNORED = 1; @@ -178,9 +184,9 @@ public class AppOpsDetails extends InstrumentedFragment { entry.getTimeText(res, true)); Spinner sp = (Spinner) view.findViewById(R.id.spinnerWidget); - sp.setVisibility(View.INVISIBLE); + sp.setVisibility(View.GONE); Switch sw = (Switch) view.findViewById(R.id.switchWidget); - sw.setVisibility(View.INVISIBLE); + sw.setVisibility(View.GONE); final int switchOp = AppOpsManager.opToSwitch(firstOp.getOp()); int mode = mAppOps.checkOp(switchOp, entry.getPackageOps().getUid(), @@ -226,9 +232,52 @@ public class AppOpsDetails extends InstrumentedFragment { } } + if (mPm.checkPermission(Manifest.permission.INTERNET, mPackageInfo.packageName) + == PackageManager.PERMISSION_GRANTED) { + TextView internetCategory = (TextView) mInflater.inflate( + R.layout.preference_category_material, null); + internetCategory.setText(R.string.privacy_guard_internet_category); + mOperationsSection.addView(internetCategory); + + addInternetSwitch(POLICY_REJECT_ON_WLAN); + addInternetSwitch(POLICY_REJECT_ON_DATA); + } + return true; } + private void addInternetSwitch(final int policy) { + // Add internet category permissions + final View view = mInflater.inflate(R.layout.app_ops_details_item, + mOperationsSection, false); + mOperationsSection.addView(view); + + ((TextView)view.findViewById(R.id.op_name)).setText( + policy == POLICY_REJECT_ON_DATA ? R.string.restrict_app_cellular_title : + R.string.restrict_app_wlan_title); + view.findViewById(R.id.op_counts).setVisibility(View.INVISIBLE); + view.findViewById(R.id.op_time).setVisibility(View.INVISIBLE); + view.findViewById(R.id.spinnerWidget).setVisibility(View.GONE); + + Switch sw = (Switch) view.findViewById(R.id.switchWidget); + sw.setChecked((mPolicyManager.getUidPolicy( + mPackageInfo.applicationInfo.uid) & policy) != 0); + sw.setTag(policy); + sw.setVisibility(View.VISIBLE); + sw.setOnCheckedChangeListener(new Switch.OnCheckedChangeListener() { + public void onCheckedChanged(CompoundButton buttonView, + boolean isChecked) { + if (isChecked) { + mPolicyManager.addUidPolicy(mPackageInfo.applicationInfo.uid, + policy); + } else { + mPolicyManager.removeUidPolicy(mPackageInfo.applicationInfo.uid, + policy); + } + } + }); + } + private void setIntentAndFinish(boolean finish, boolean appChanged) { Intent intent = new Intent(); intent.putExtra(ManageApplications.APP_CHG, appChanged); @@ -245,6 +294,7 @@ public class AppOpsDetails extends InstrumentedFragment { mPm = getActivity().getPackageManager(); mInflater = (LayoutInflater)getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE); mAppOps = (AppOpsManager)getActivity().getSystemService(Context.APP_OPS_SERVICE); + mPolicyManager = NetworkPolicyManager.from(getActivity()); retrieveAppEntry(); diff --git a/src/com/android/settings/privacyguard/AppInfoLoader.java b/src/com/android/settings/privacyguard/AppInfoLoader.java index 6efd7a5..520bd20 100644 --- a/src/com/android/settings/privacyguard/AppInfoLoader.java +++ b/src/com/android/settings/privacyguard/AppInfoLoader.java @@ -15,6 +15,7 @@ */ package com.android.settings.privacyguard; +import android.Manifest; import android.app.AppOpsManager; import android.content.AsyncTaskLoader; import android.content.Context; @@ -104,6 +105,8 @@ import java.util.List; app.uid = info.applicationInfo.uid; app.privacyGuardEnabled = mAppOps.getPrivacyGuardSettingForPackage( app.uid, app.packageName); + app.hasInternetPermission = mPm.checkPermission(Manifest.permission.INTERNET, + app.packageName) == PackageManager.PERMISSION_GRANTED; apps.add(app); } diff --git a/src/com/android/settings/privacyguard/PrivacyGuardManager.java b/src/com/android/settings/privacyguard/PrivacyGuardManager.java index adbe8cc..4cc8214 100644 --- a/src/com/android/settings/privacyguard/PrivacyGuardManager.java +++ b/src/com/android/settings/privacyguard/PrivacyGuardManager.java @@ -16,7 +16,10 @@ package com.android.settings.privacyguard; +import android.Manifest; import android.app.FragmentTransaction; +import android.content.pm.PackageManager; +import android.net.NetworkPolicyManager; import android.view.animation.AnimationUtils; import android.app.Activity; import android.app.AlertDialog; @@ -87,6 +90,7 @@ public class PrivacyGuardManager extends Fragment // Privacy Guard Fragment private final static String PRIVACY_GUARD_FRAGMENT_TAG = "privacy_guard_fragment"; + private NetworkPolicyManager mPolicyManager; // holder for package data passed into the adapter public static final class AppInfo { @@ -95,6 +99,13 @@ public class PrivacyGuardManager extends Fragment boolean enabled; boolean privacyGuardEnabled; int uid; + boolean hasInternetPermission; + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + mPolicyManager = NetworkPolicyManager.from(getActivity()); } @Override @@ -280,6 +291,15 @@ public class PrivacyGuardManager extends Fragment app.privacyGuardEnabled = !app.privacyGuardEnabled; mAppOps.setPrivacyGuardSettingForPackage(app.uid, app.packageName, app.privacyGuardEnabled); + if (app.hasInternetPermission) { + if (app.privacyGuardEnabled) { + mPolicyManager.addUidPolicy(app.uid, NetworkPolicyManager.POLICY_REJECT_ON_DATA); + mPolicyManager.addUidPolicy(app.uid, NetworkPolicyManager.POLICY_REJECT_ON_WLAN); + } else { + mPolicyManager.removeUidPolicy(app.uid, NetworkPolicyManager.POLICY_REJECT_ON_DATA); + mPolicyManager.removeUidPolicy(app.uid, NetworkPolicyManager.POLICY_REJECT_ON_WLAN); + } + } mAdapter.notifyDataSetChanged(); } |