diff options
author | Benjamin Franz <bfranz@google.com> | 2014-10-28 16:14:08 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2014-10-28 16:14:09 +0000 |
commit | eebaf6f543d8b8983b2b0dce29812d2d2329424f (patch) | |
tree | d6f453d0175b0b7b8d8ea30df496c881a35ea62e | |
parent | 03754119f6920b3016175f1e0bd3b4d9a7b51108 (diff) | |
parent | b708f80d56ba6d6ed110b9b7d1008563689821a4 (diff) | |
download | android_packages_apps_Nfc-eebaf6f543d8b8983b2b0dce29812d2d2329424f.tar.gz android_packages_apps_Nfc-eebaf6f543d8b8983b2b0dce29812d2d2329424f.tar.bz2 android_packages_apps_Nfc-eebaf6f543d8b8983b2b0dce29812d2d2329424f.zip |
Merge "Deactivate Beam when DISALLOW_OUTGOING_BEAM is set." into lmp-mr1-dev
-rw-r--r-- | src/com/android/nfc/BeamShareActivity.java | 3 | ||||
-rwxr-xr-x | src/com/android/nfc/NfcService.java | 54 |
2 files changed, 51 insertions, 6 deletions
diff --git a/src/com/android/nfc/BeamShareActivity.java b/src/com/android/nfc/BeamShareActivity.java index 84a658a8..c22c184f 100644 --- a/src/com/android/nfc/BeamShareActivity.java +++ b/src/com/android/nfc/BeamShareActivity.java @@ -32,6 +32,7 @@ import android.nfc.NdefMessage; import android.nfc.NdefRecord; import android.nfc.NfcAdapter; import android.os.Bundle; +import android.os.UserHandle; import android.util.Log; import android.webkit.URLUtil; @@ -78,7 +79,7 @@ public class BeamShareActivity extends Activity { private void showNfcDialogAndExit(int msgId) { IntentFilter filter = new IntentFilter(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED); - registerReceiver(mReceiver, filter); + registerReceiverAsUser(mReceiver, UserHandle.ALL, filter, null, null); AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(this, AlertDialog.THEME_DEVICE_DEFAULT_LIGHT); diff --git a/src/com/android/nfc/NfcService.java b/src/com/android/nfc/NfcService.java index 6c2af257..86531bdf 100755 --- a/src/com/android/nfc/NfcService.java +++ b/src/com/android/nfc/NfcService.java @@ -20,6 +20,7 @@ import android.app.ActivityManager; import android.app.Application; import android.app.KeyguardManager; import android.app.PendingIntent; +import android.app.admin.DevicePolicyManager; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.ContentResolver; @@ -27,6 +28,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; +import android.content.pm.IPackageManager; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.UserInfo; @@ -372,6 +374,9 @@ public class NfcService implements DeviceHostListener { ownerFilter.addDataScheme("package"); mContext.registerReceiver(mOwnerReceiver, ownerFilter); + IntentFilter policyFilter = new IntentFilter(DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED); + mContext.registerReceiverAsUser(mPolicyReceiver, UserHandle.ALL, policyFilter, null, null); + updatePackageCache(); PackageManager pm = mContext.getPackageManager(); @@ -647,11 +652,39 @@ public class NfcService implements DeviceHostListener { } void setBeamShareActivityState(boolean enabled) { - mContext.getPackageManager().setComponentEnabledSetting( - new ComponentName("com.android.nfc","com.android.nfc.BeamShareActivity"), - enabled ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED : - PackageManager.COMPONENT_ENABLED_STATE_DISABLED, - PackageManager.DONT_KILL_APP); + UserManager um = (UserManager) mContext.getSystemService(Context.USER_SERVICE); + // Propagate the state change to all user profiles related to the current + // user. Note that the list returned by getUserProfiles contains the + // current user. + List <UserHandle> luh = um.getUserProfiles(); + for (UserHandle uh : luh){ + enforceBeamShareActivityPolicy(mContext, uh, enabled); + } + } + + void enforceBeamShareActivityPolicy(Context context, UserHandle uh, + boolean isGlobalEnabled){ + UserManager um = (UserManager) context.getSystemService(Context.USER_SERVICE); + IPackageManager mIpm = IPackageManager.Stub.asInterface(ServiceManager.getService("package")); + boolean isActiveForUser = + (!um.hasUserRestriction(UserManager.DISALLOW_OUTGOING_BEAM, uh)) && + isGlobalEnabled; + if (DBG){ + Log.d(TAG, "Enforcing a policy change on user: " + uh + + ", isActiveForUser = " + isActiveForUser); + } + try { + mIpm.setComponentEnabledSetting(new ComponentName( + BeamShareActivity.class.getPackageName$(), + BeamShareActivity.class.getName()), + isActiveForUser ? + PackageManager.COMPONENT_ENABLED_STATE_ENABLED : + PackageManager.COMPONENT_ENABLED_STATE_DISABLED, + PackageManager.DONT_KILL_APP, + uh.getIdentifier()); + } catch (RemoteException e) { + Log.w(TAG, "Unable to change Beam status for user " + uh); + } } final class NfcAdapterService extends INfcAdapter.Stub { @@ -1967,6 +2000,17 @@ public class NfcService implements DeviceHostListener { } }; + private final BroadcastReceiver mPolicyReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent){ + String action = intent.getAction(); + if (DevicePolicyManager.ACTION_DEVICE_POLICY_MANAGER_STATE_CHANGED + .equals(action)) { + enforceBeamShareActivityPolicy(context, + new UserHandle(getSendingUserId()), mIsNdefPushEnabled); + } + } + }; /** * Returns true if airplane mode is currently on |