Loading src/java/com/android/internal/telephony/SMSDispatcher.java +16 −8 Original line number Original line Diff line number Diff line Loading @@ -25,6 +25,7 @@ import static android.telephony.SmsManager.RESULT_ERROR_NULL_PDU; import static android.telephony.SmsManager.RESULT_ERROR_RADIO_OFF; import static android.telephony.SmsManager.RESULT_ERROR_RADIO_OFF; import android.annotation.Nullable; import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.Activity; import android.app.Activity; import android.app.AlertDialog; import android.app.AlertDialog; import android.app.PendingIntent; import android.app.PendingIntent; Loading Loading @@ -980,7 +981,8 @@ public abstract class SMSDispatcher extends Handler { PackageInfo appInfo; PackageInfo appInfo; try { try { // XXX this is lossy- apps can share a UID // XXX this is lossy- apps can share a UID appInfo = pm.getPackageInfo(packageNames[0], PackageManager.GET_SIGNATURES); appInfo = pm.getPackageInfoAsUser( packageNames[0], PackageManager.GET_SIGNATURES, tracker.mUserId); } catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) { Rlog.e(TAG, "Can't get calling app package info: refusing to send SMS"); Rlog.e(TAG, "Can't get calling app package info: refusing to send SMS"); tracker.onFailed(mContext, RESULT_ERROR_GENERIC_FAILURE, 0/*errorCode*/); tracker.onFailed(mContext, RESULT_ERROR_GENERIC_FAILURE, 0/*errorCode*/); Loading Loading @@ -1105,10 +1107,10 @@ public abstract class SMSDispatcher extends Handler { * @param appPackage the package name of the app requesting to send an SMS * @param appPackage the package name of the app requesting to send an SMS * @return the label for the specified app, or the package name if getApplicationInfo() fails * @return the label for the specified app, or the package name if getApplicationInfo() fails */ */ private CharSequence getAppLabel(String appPackage) { private CharSequence getAppLabel(String appPackage, @UserIdInt int userId) { PackageManager pm = mContext.getPackageManager(); PackageManager pm = mContext.getPackageManager(); try { try { ApplicationInfo appInfo = pm.getApplicationInfo(appPackage, 0); ApplicationInfo appInfo = pm.getApplicationInfoAsUser(appPackage, 0, userId); return appInfo.loadSafeLabel(pm); return appInfo.loadSafeLabel(pm); } catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) { Rlog.e(TAG, "PackageManager Name Not Found for package " + appPackage); Rlog.e(TAG, "PackageManager Name Not Found for package " + appPackage); Loading @@ -1125,7 +1127,7 @@ public abstract class SMSDispatcher extends Handler { return; // queue limit reached; error was returned to caller return; // queue limit reached; error was returned to caller } } CharSequence appLabel = getAppLabel(tracker.mAppInfo.packageName); CharSequence appLabel = getAppLabel(tracker.mAppInfo.packageName, tracker.mUserId); Resources r = Resources.getSystem(); Resources r = Resources.getSystem(); Spanned messageText = Html.fromHtml(r.getString(R.string.sms_control_message, appLabel)); Spanned messageText = Html.fromHtml(r.getString(R.string.sms_control_message, appLabel)); Loading Loading @@ -1161,7 +1163,7 @@ public abstract class SMSDispatcher extends Handler { detailsId = R.string.sms_short_code_details; detailsId = R.string.sms_short_code_details; } } CharSequence appLabel = getAppLabel(tracker.mAppInfo.packageName); CharSequence appLabel = getAppLabel(tracker.mAppInfo.packageName, tracker.mUserId); Resources r = Resources.getSystem(); Resources r = Resources.getSystem(); Spanned messageText = Html.fromHtml(r.getString(R.string.sms_short_code_confirm_message, Spanned messageText = Html.fromHtml(r.getString(R.string.sms_short_code_confirm_message, appLabel, tracker.mDestAddress)); appLabel, tracker.mDestAddress)); Loading Loading @@ -1330,11 +1332,14 @@ public abstract class SMSDispatcher extends Handler { private boolean mPersistMessage; private boolean mPersistMessage; // User who sends the SMS. private final @UserIdInt int mUserId; private SmsTracker(HashMap<String, Object> data, PendingIntent sentIntent, private SmsTracker(HashMap<String, Object> data, PendingIntent sentIntent, PendingIntent deliveryIntent, PackageInfo appInfo, String destAddr, String format, PendingIntent deliveryIntent, PackageInfo appInfo, String destAddr, String format, AtomicInteger unsentPartCount, AtomicBoolean anyPartFailed, Uri messageUri, AtomicInteger unsentPartCount, AtomicBoolean anyPartFailed, Uri messageUri, SmsHeader smsHeader, boolean isExpectMore, String fullMessageText, int subId, SmsHeader smsHeader, boolean isExpectMore, String fullMessageText, int subId, boolean isText, boolean persistMessage) { boolean isText, boolean persistMessage, int userId) { mData = data; mData = data; mSentIntent = sentIntent; mSentIntent = sentIntent; mDeliveryIntent = deliveryIntent; mDeliveryIntent = deliveryIntent; Loading @@ -1353,6 +1358,7 @@ public abstract class SMSDispatcher extends Handler { mSubId = subId; mSubId = subId; mIsText = isText; mIsText = isText; mPersistMessage = persistMessage; mPersistMessage = persistMessage; mUserId = userId; } } /** /** Loading Loading @@ -1566,11 +1572,13 @@ public abstract class SMSDispatcher extends Handler { String[] packageNames = pm.getPackagesForUid(Binder.getCallingUid()); String[] packageNames = pm.getPackagesForUid(Binder.getCallingUid()); // Get package info via packagemanager // Get package info via packagemanager final int userId = UserHandle.getCallingUserId(); PackageInfo appInfo = null; PackageInfo appInfo = null; if (packageNames != null && packageNames.length > 0) { if (packageNames != null && packageNames.length > 0) { try { try { // XXX this is lossy- apps can share a UID // XXX this is lossy- apps can share a UID appInfo = pm.getPackageInfo(packageNames[0], PackageManager.GET_SIGNATURES); appInfo = pm.getPackageInfoAsUser( packageNames[0], PackageManager.GET_SIGNATURES, userId); } catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) { // error will be logged in sendRawPdu // error will be logged in sendRawPdu } } Loading @@ -1580,7 +1588,7 @@ public abstract class SMSDispatcher extends Handler { String destAddr = PhoneNumberUtils.extractNetworkPortion((String) data.get("destAddr")); String destAddr = PhoneNumberUtils.extractNetworkPortion((String) data.get("destAddr")); return new SmsTracker(data, sentIntent, deliveryIntent, appInfo, destAddr, format, return new SmsTracker(data, sentIntent, deliveryIntent, appInfo, destAddr, format, unsentPartCount, anyPartFailed, messageUri, smsHeader, isExpectMore, unsentPartCount, anyPartFailed, messageUri, smsHeader, isExpectMore, fullMessageText, getSubId(), isText, persistMessage); fullMessageText, getSubId(), isText, persistMessage, userId); } } protected SmsTracker getSmsTracker(HashMap<String, Object> data, PendingIntent sentIntent, protected SmsTracker getSmsTracker(HashMap<String, Object> data, PendingIntent sentIntent, Loading tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java +2 −0 Original line number Original line Diff line number Diff line Loading @@ -470,5 +470,7 @@ public abstract class TelephonyTest { protected void setupMockPackagePermissionChecks() throws Exception { protected void setupMockPackagePermissionChecks() throws Exception { doReturn(new String[]{TAG}).when(mPackageManager).getPackagesForUid(anyInt()); doReturn(new String[]{TAG}).when(mPackageManager).getPackagesForUid(anyInt()); doReturn(mPackageInfo).when(mPackageManager).getPackageInfo(eq(TAG), anyInt()); doReturn(mPackageInfo).when(mPackageManager).getPackageInfo(eq(TAG), anyInt()); doReturn(mPackageInfo).when(mPackageManager).getPackageInfoAsUser( eq(TAG), anyInt(), anyInt()); } } } } Loading
src/java/com/android/internal/telephony/SMSDispatcher.java +16 −8 Original line number Original line Diff line number Diff line Loading @@ -25,6 +25,7 @@ import static android.telephony.SmsManager.RESULT_ERROR_NULL_PDU; import static android.telephony.SmsManager.RESULT_ERROR_RADIO_OFF; import static android.telephony.SmsManager.RESULT_ERROR_RADIO_OFF; import android.annotation.Nullable; import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.Activity; import android.app.Activity; import android.app.AlertDialog; import android.app.AlertDialog; import android.app.PendingIntent; import android.app.PendingIntent; Loading Loading @@ -980,7 +981,8 @@ public abstract class SMSDispatcher extends Handler { PackageInfo appInfo; PackageInfo appInfo; try { try { // XXX this is lossy- apps can share a UID // XXX this is lossy- apps can share a UID appInfo = pm.getPackageInfo(packageNames[0], PackageManager.GET_SIGNATURES); appInfo = pm.getPackageInfoAsUser( packageNames[0], PackageManager.GET_SIGNATURES, tracker.mUserId); } catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) { Rlog.e(TAG, "Can't get calling app package info: refusing to send SMS"); Rlog.e(TAG, "Can't get calling app package info: refusing to send SMS"); tracker.onFailed(mContext, RESULT_ERROR_GENERIC_FAILURE, 0/*errorCode*/); tracker.onFailed(mContext, RESULT_ERROR_GENERIC_FAILURE, 0/*errorCode*/); Loading Loading @@ -1105,10 +1107,10 @@ public abstract class SMSDispatcher extends Handler { * @param appPackage the package name of the app requesting to send an SMS * @param appPackage the package name of the app requesting to send an SMS * @return the label for the specified app, or the package name if getApplicationInfo() fails * @return the label for the specified app, or the package name if getApplicationInfo() fails */ */ private CharSequence getAppLabel(String appPackage) { private CharSequence getAppLabel(String appPackage, @UserIdInt int userId) { PackageManager pm = mContext.getPackageManager(); PackageManager pm = mContext.getPackageManager(); try { try { ApplicationInfo appInfo = pm.getApplicationInfo(appPackage, 0); ApplicationInfo appInfo = pm.getApplicationInfoAsUser(appPackage, 0, userId); return appInfo.loadSafeLabel(pm); return appInfo.loadSafeLabel(pm); } catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) { Rlog.e(TAG, "PackageManager Name Not Found for package " + appPackage); Rlog.e(TAG, "PackageManager Name Not Found for package " + appPackage); Loading @@ -1125,7 +1127,7 @@ public abstract class SMSDispatcher extends Handler { return; // queue limit reached; error was returned to caller return; // queue limit reached; error was returned to caller } } CharSequence appLabel = getAppLabel(tracker.mAppInfo.packageName); CharSequence appLabel = getAppLabel(tracker.mAppInfo.packageName, tracker.mUserId); Resources r = Resources.getSystem(); Resources r = Resources.getSystem(); Spanned messageText = Html.fromHtml(r.getString(R.string.sms_control_message, appLabel)); Spanned messageText = Html.fromHtml(r.getString(R.string.sms_control_message, appLabel)); Loading Loading @@ -1161,7 +1163,7 @@ public abstract class SMSDispatcher extends Handler { detailsId = R.string.sms_short_code_details; detailsId = R.string.sms_short_code_details; } } CharSequence appLabel = getAppLabel(tracker.mAppInfo.packageName); CharSequence appLabel = getAppLabel(tracker.mAppInfo.packageName, tracker.mUserId); Resources r = Resources.getSystem(); Resources r = Resources.getSystem(); Spanned messageText = Html.fromHtml(r.getString(R.string.sms_short_code_confirm_message, Spanned messageText = Html.fromHtml(r.getString(R.string.sms_short_code_confirm_message, appLabel, tracker.mDestAddress)); appLabel, tracker.mDestAddress)); Loading Loading @@ -1330,11 +1332,14 @@ public abstract class SMSDispatcher extends Handler { private boolean mPersistMessage; private boolean mPersistMessage; // User who sends the SMS. private final @UserIdInt int mUserId; private SmsTracker(HashMap<String, Object> data, PendingIntent sentIntent, private SmsTracker(HashMap<String, Object> data, PendingIntent sentIntent, PendingIntent deliveryIntent, PackageInfo appInfo, String destAddr, String format, PendingIntent deliveryIntent, PackageInfo appInfo, String destAddr, String format, AtomicInteger unsentPartCount, AtomicBoolean anyPartFailed, Uri messageUri, AtomicInteger unsentPartCount, AtomicBoolean anyPartFailed, Uri messageUri, SmsHeader smsHeader, boolean isExpectMore, String fullMessageText, int subId, SmsHeader smsHeader, boolean isExpectMore, String fullMessageText, int subId, boolean isText, boolean persistMessage) { boolean isText, boolean persistMessage, int userId) { mData = data; mData = data; mSentIntent = sentIntent; mSentIntent = sentIntent; mDeliveryIntent = deliveryIntent; mDeliveryIntent = deliveryIntent; Loading @@ -1353,6 +1358,7 @@ public abstract class SMSDispatcher extends Handler { mSubId = subId; mSubId = subId; mIsText = isText; mIsText = isText; mPersistMessage = persistMessage; mPersistMessage = persistMessage; mUserId = userId; } } /** /** Loading Loading @@ -1566,11 +1572,13 @@ public abstract class SMSDispatcher extends Handler { String[] packageNames = pm.getPackagesForUid(Binder.getCallingUid()); String[] packageNames = pm.getPackagesForUid(Binder.getCallingUid()); // Get package info via packagemanager // Get package info via packagemanager final int userId = UserHandle.getCallingUserId(); PackageInfo appInfo = null; PackageInfo appInfo = null; if (packageNames != null && packageNames.length > 0) { if (packageNames != null && packageNames.length > 0) { try { try { // XXX this is lossy- apps can share a UID // XXX this is lossy- apps can share a UID appInfo = pm.getPackageInfo(packageNames[0], PackageManager.GET_SIGNATURES); appInfo = pm.getPackageInfoAsUser( packageNames[0], PackageManager.GET_SIGNATURES, userId); } catch (PackageManager.NameNotFoundException e) { } catch (PackageManager.NameNotFoundException e) { // error will be logged in sendRawPdu // error will be logged in sendRawPdu } } Loading @@ -1580,7 +1588,7 @@ public abstract class SMSDispatcher extends Handler { String destAddr = PhoneNumberUtils.extractNetworkPortion((String) data.get("destAddr")); String destAddr = PhoneNumberUtils.extractNetworkPortion((String) data.get("destAddr")); return new SmsTracker(data, sentIntent, deliveryIntent, appInfo, destAddr, format, return new SmsTracker(data, sentIntent, deliveryIntent, appInfo, destAddr, format, unsentPartCount, anyPartFailed, messageUri, smsHeader, isExpectMore, unsentPartCount, anyPartFailed, messageUri, smsHeader, isExpectMore, fullMessageText, getSubId(), isText, persistMessage); fullMessageText, getSubId(), isText, persistMessage, userId); } } protected SmsTracker getSmsTracker(HashMap<String, Object> data, PendingIntent sentIntent, protected SmsTracker getSmsTracker(HashMap<String, Object> data, PendingIntent sentIntent, Loading
tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java +2 −0 Original line number Original line Diff line number Diff line Loading @@ -470,5 +470,7 @@ public abstract class TelephonyTest { protected void setupMockPackagePermissionChecks() throws Exception { protected void setupMockPackagePermissionChecks() throws Exception { doReturn(new String[]{TAG}).when(mPackageManager).getPackagesForUid(anyInt()); doReturn(new String[]{TAG}).when(mPackageManager).getPackagesForUid(anyInt()); doReturn(mPackageInfo).when(mPackageManager).getPackageInfo(eq(TAG), anyInt()); doReturn(mPackageInfo).when(mPackageManager).getPackageInfo(eq(TAG), anyInt()); doReturn(mPackageInfo).when(mPackageManager).getPackageInfoAsUser( eq(TAG), anyInt(), anyInt()); } } } }