Merge "Issues with messaging apps on non-primary user account" into lmp-mr1-dev

This commit is contained in:
Tom Taylor
2014-11-24 23:14:40 +00:00
committed by Android (Google) Code Review

View File

@@ -20,6 +20,7 @@ import android.Manifest;
import android.app.AppOpsManager; import android.app.AppOpsManager;
import android.app.PendingIntent; import android.app.PendingIntent;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.ContentProvider;
import android.content.ContentValues; import android.content.ContentValues;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
@@ -33,11 +34,15 @@ import android.os.IBinder;
import android.os.Message; import android.os.Message;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.SystemClock; import android.os.SystemClock;
import android.os.UserHandle;
import android.provider.Telephony;
import android.telephony.TelephonyManager; import android.telephony.TelephonyManager;
import android.util.Slog; import android.util.Slog;
import com.android.internal.telephony.IMms; import com.android.internal.telephony.IMms;
import java.util.List;
/** /**
* This class is a proxy for MmsService APIs. We need this because MmsService runs * This class is a proxy for MmsService APIs. We need this because MmsService runs
* in phone process and may crash anytime. This manages a connection to the actual * in phone process and may crash anytime. This manages a connection to the actual
@@ -226,6 +231,8 @@ public class MmsServiceBroker extends SystemService {
// Service API calls implementation, proxied to the real MmsService in "com.android.mms.service" // Service API calls implementation, proxied to the real MmsService in "com.android.mms.service"
private final class BinderService extends IMms.Stub { private final class BinderService extends IMms.Stub {
private static final String PHONE_PACKAGE_NAME = "com.android.phone";
@Override @Override
public void sendMessage(int subId, String callingPkg, Uri contentUri, public void sendMessage(int subId, String callingPkg, Uri contentUri,
String locationUrl, Bundle configOverrides, PendingIntent sentIntent) String locationUrl, Bundle configOverrides, PendingIntent sentIntent)
@@ -236,6 +243,9 @@ public class MmsServiceBroker extends SystemService {
callingPkg) != AppOpsManager.MODE_ALLOWED) { callingPkg) != AppOpsManager.MODE_ALLOWED) {
return; return;
} }
contentUri = adjustUriForUserAndGrantPermission(contentUri,
Telephony.Mms.Intents.MMS_SEND_ACTION,
Intent.FLAG_GRANT_READ_URI_PERMISSION);
getServiceGuarded().sendMessage(subId, callingPkg, contentUri, locationUrl, getServiceGuarded().sendMessage(subId, callingPkg, contentUri, locationUrl,
configOverrides, sentIntent); configOverrides, sentIntent);
} }
@@ -251,6 +261,10 @@ public class MmsServiceBroker extends SystemService {
callingPkg) != AppOpsManager.MODE_ALLOWED) { callingPkg) != AppOpsManager.MODE_ALLOWED) {
return; return;
} }
contentUri = adjustUriForUserAndGrantPermission(contentUri,
Telephony.Mms.Intents.MMS_DOWNLOAD_ACTION,
Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
getServiceGuarded().downloadMessage(subId, callingPkg, locationUrl, contentUri, getServiceGuarded().downloadMessage(subId, callingPkg, locationUrl, contentUri,
configOverrides, downloadedIntent); configOverrides, downloadedIntent);
} }
@@ -397,5 +411,40 @@ public class MmsServiceBroker extends SystemService {
public boolean getAutoPersisting() throws RemoteException { public boolean getAutoPersisting() throws RemoteException {
return getServiceGuarded().getAutoPersisting(); return getServiceGuarded().getAutoPersisting();
} }
/**
* Modifies the Uri to contain the caller's userId, if necessary.
* Grants the phone package on primary user permission to access the contentUri,
* even if the caller is not in the primary user.
*
* @param contentUri The Uri to adjust
* @param action The intent action used to find the associated carrier app
* @param permission The permission to add
* @return The adjusted Uri containing the calling userId.
*/
private Uri adjustUriForUserAndGrantPermission(Uri contentUri, String action,
int permission) {
final int callingUserId = UserHandle.getCallingUserId();
if (callingUserId != UserHandle.USER_OWNER) {
contentUri = ContentProvider.maybeAddUserId(contentUri, callingUserId);
}
long token = Binder.clearCallingIdentity();
try {
mContext.grantUriPermission(PHONE_PACKAGE_NAME, contentUri, permission);
// Grant permission for the carrier app.
Intent intent = new Intent(action);
TelephonyManager telephonyManager =
(TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE);
List<String> carrierPackages = telephonyManager.getCarrierPackageNamesForIntent(
intent);
if (carrierPackages != null && carrierPackages.size() == 1) {
mContext.grantUriPermission(carrierPackages.get(0), contentUri, permission);
}
} finally {
Binder.restoreCallingIdentity(token);
}
return contentUri;
}
} }
} }