Merge "Issues with messaging apps on non-primary user account" into lmp-mr1-dev
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user