Merge "Really resolve merge conflicts of 903d641 to nyc-mr2-dev-plus-aosp" into nyc-mr2-dev-plus-aosp

This commit is contained in:
TreeHugger Robot
2016-12-13 20:29:59 +00:00
committed by Android (Google) Code Review

View File

@@ -35,6 +35,7 @@ import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter; import android.content.IntentFilter;
import android.content.ServiceConnection; import android.content.ServiceConnection;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.pm.UserInfo; import android.content.pm.UserInfo;
import android.database.ContentObserver; import android.database.ContentObserver;
@@ -155,6 +156,8 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
private final Map <Integer, ProfileServiceConnections> mProfileServices = private final Map <Integer, ProfileServiceConnections> mProfileServices =
new HashMap <Integer, ProfileServiceConnections>(); new HashMap <Integer, ProfileServiceConnections>();
private final boolean mPermissionReviewRequired;
private void registerForAirplaneMode(IntentFilter filter) { private void registerForAirplaneMode(IntentFilter filter) {
final ContentResolver resolver = mContext.getContentResolver(); final ContentResolver resolver = mContext.getContentResolver();
final String airplaneModeRadios = Settings.Global.getString(resolver, final String airplaneModeRadios = Settings.Global.getString(resolver,
@@ -263,6 +266,11 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
mHandler = new BluetoothHandler(IoThread.get().getLooper()); mHandler = new BluetoothHandler(IoThread.get().getLooper());
mContext = context; mContext = context;
mPermissionReviewRequired = Build.PERMISSIONS_REVIEW_REQUIRED
|| context.getResources().getBoolean(
com.android.internal.R.bool.config_permissionReviewRequired);
mBluetooth = null; mBluetooth = null;
mBluetoothBinder = null; mBluetoothBinder = null;
mBluetoothGatt = null; mBluetoothGatt = null;
@@ -717,16 +725,26 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
return true; return true;
} }
public boolean disable(boolean persist) { public boolean disable(String packageName, boolean persist) throws RemoteException {
mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, final int callingUid = Binder.getCallingUid();
"Need BLUETOOTH ADMIN permissicacheNameAndAddresson"); final boolean callerSystem = UserHandle.getAppId(callingUid) == Process.SYSTEM_UID;
if ((Binder.getCallingUid() != Process.SYSTEM_UID) && if (!callerSystem) {
(!checkIfCallerIsForegroundUser())) { if (!checkIfCallerIsForegroundUser()) {
Slog.w(TAG, "disable(): not allowed for non-active and non system user"); Slog.w(TAG, "disable(): not allowed for non-active and non system user");
return false; return false;
} }
mContext.enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM,
"Need BLUETOOTH ADMIN permission");
if (isEnabled() && mPermissionReviewRequired
&& startConsentUiIfNeeded(packageName, callingUid,
BluetoothAdapter.ACTION_REQUEST_DISABLE)) {
return false;
}
}
if (DBG) { if (DBG) {
Slog.d(TAG,"disable(): mBluetooth = " + mBluetooth + Slog.d(TAG,"disable(): mBluetooth = " + mBluetooth +
" mBinding = " + mBinding); " mBinding = " + mBinding);
@@ -745,6 +763,31 @@ class BluetoothManagerService extends IBluetoothManager.Stub {
return true; return true;
} }
private boolean startConsentUiIfNeeded(String packageName,
int callingUid, String intentAction) throws RemoteException {
try {
// Validate the package only if we are going to use it
ApplicationInfo applicationInfo = mContext.getPackageManager()
.getApplicationInfoAsUser(packageName,
PackageManager.MATCH_DEBUG_TRIAGED_MISSING,
UserHandle.getUserId(callingUid));
if (applicationInfo.uid != callingUid) {
throw new SecurityException("Package " + callingUid
+ " not in uid " + callingUid);
}
// Legacy apps in permission review mode trigger a user prompt
if (applicationInfo.targetSdkVersion < Build.VERSION_CODES.M) {
Intent intent = new Intent(intentAction);
mContext.startActivity(intent);
return true;
}
} catch (PackageManager.NameNotFoundException e) {
throw new RemoteException(e.getMessage());
}
return false;
}
public void unbindAndFinish() { public void unbindAndFinish() {
if (DBG) { if (DBG) {
Slog.d(TAG,"unbindAndFinish(): " + mBluetooth + Slog.d(TAG,"unbindAndFinish(): " + mBluetooth +