diff options
author | Benjamin Franz <bfranz@google.com> | 2014-10-16 14:39:00 +0100 |
---|---|---|
committer | Benjamin Franz <bfranz@google.com> | 2014-10-22 17:49:34 +0100 |
commit | b708f80d56ba6d6ed110b9b7d1008563689821a4 (patch) | |
tree | c6848fe3a719966d0750148b7dc40923574a40b3 /src/com/android/nfc | |
parent | f6525245a348abb715233aa91994fd919f29e523 (diff) | |
download | android_packages_apps_Nfc-b708f80d56ba6d6ed110b9b7d1008563689821a4.tar.gz android_packages_apps_Nfc-b708f80d56ba6d6ed110b9b7d1008563689821a4.tar.bz2 android_packages_apps_Nfc-b708f80d56ba6d6ed110b9b7d1008563689821a4.zip |
Deactivate Beam when DISALLOW_OUTGOING_BEAM is set.
Bug: 18008824
Change-Id: I25b64f0de6e62a94ba59b3ff6ea40c14da25ca90
Diffstat (limited to 'src/com/android/nfc')
-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 d8278833..06bc06a3 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 { @@ -1968,6 +2001,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 |