Merge "resolve merge conflicts of 61444e09ff to pi-dev-plus-aosp" into pi-dev-plus-aosp

This commit is contained in:
Shuo Qian
2018-11-08 01:41:15 +00:00
committed by Android (Google) Code Review
5 changed files with 89 additions and 5 deletions

View File

@@ -604,6 +604,8 @@
<protected-broadcast android:name="android.intent.action.DOCK_IDLE" />
<protected-broadcast android:name="android.intent.action.DOCK_ACTIVE" />
<protected-broadcast android:name="android.provider.action.DEFAULT_SMS_PACKAGE_CHANGED_INTERNAL" />
<!-- ====================================================================== -->
<!-- RUNTIME PERMISSIONS -->
<!-- ====================================================================== -->
@@ -3996,6 +3998,12 @@
<permission android:name="android.permission.DISABLE_HIDDEN_API_CHECKS"
android:protectionLevel="signature" />
<!-- @hide Permission that protects the
{@link android.provider.Telephony.Intents#ACTION_DEFAULT_SMS_PACKAGE_CHANGED_INTERNAL}
broadcast -->
<permission android:name="android.permission.MONITOR_DEFAULT_SMS_PACKAGE"
android:protectionLevel="signature" />
<application android:process="system"
android:persistent="true"
android:hasCode="false"

View File

@@ -1169,6 +1169,17 @@ public final class Telephony {
public static final String ACTION_EXTERNAL_PROVIDER_CHANGE =
"android.provider.action.EXTERNAL_PROVIDER_CHANGE";
/**
* Same as {@link #ACTION_DEFAULT_SMS_PACKAGE_CHANGED} but it's implicit (e.g. sent to
* all apps) and requires
* {@link android.Manifest.permission#MONITOR_DEFAULT_SMS_PACKAGE} to receive.
*
* @hide
*/
@SdkConstant(SdkConstantType.BROADCAST_INTENT_ACTION)
public static final String ACTION_DEFAULT_SMS_PACKAGE_CHANGED_INTERNAL =
"android.provider.action.DEFAULT_SMS_PACKAGE_CHANGED_INTERNAL";
/**
* Broadcast action: When SMS-MMS db is being created. If file-based encryption is
* supported, this broadcast indicates creation of the db in credential-encrypted
@@ -1196,6 +1207,7 @@ public final class Telephony {
*/
public static final String EXTRA_IS_INITIAL_CREATE =
"android.provider.extra.IS_INITIAL_CREATE";
/**
* Read the PDUs out of an {@link #SMS_RECEIVED_ACTION} or a
* {@link #DATA_SMS_RECEIVED_ACTION} intent.

View File

@@ -1499,6 +1499,21 @@ interface ITelephony {
*/
int getNetworkSelectionMode(int subId);
/**
* Get a list of SMS apps on a user.
*/
String[] getSmsApps(int userId);
/**
* Get the default SMS app on a given user.
*/
String getDefaultSmsApp(int userId);
/**
* Set the default SMS app to a given package on a given user.
*/
void setDefaultSmsApp(int userId, String packageName);
/**
* Return the modem radio power state for slot index.
*

View File

@@ -209,7 +209,14 @@ public final class SmsApplication {
* Support smsto Uri scheme.
*/
public static Collection<SmsApplicationData> getApplicationCollection(Context context) {
int userId = getIncomingUserId(context);
return getApplicationCollectionAsUser(context, getIncomingUserId(context));
}
/**
* Same as {@link #getApplicationCollection} but it takes a target user ID.
*/
public static Collection<SmsApplicationData> getApplicationCollectionAsUser(Context context,
int userId) {
final long token = Binder.clearCallingIdentity();
try {
return getApplicationCollectionInternal(context, userId);
@@ -535,13 +542,20 @@ public final class SmsApplication {
* needs to have permission to set AppOps and write to secure settings.
*/
public static void setDefaultApplication(String packageName, Context context) {
setDefaultApplicationAsUser(packageName, context, getIncomingUserId(context));
}
/**
* Same as {@link #setDefaultApplication} but takes a target user id.
*/
public static void setDefaultApplicationAsUser(String packageName, Context context,
int userId) {
TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
if (!tm.isSmsCapable()) {
// No phone, no SMS
return;
}
final int userId = getIncomingUserId(context);
final long token = Binder.clearCallingIdentity();
try {
setDefaultApplicationInternal(packageName, context, userId);
@@ -552,6 +566,8 @@ public final class SmsApplication {
private static void setDefaultApplicationInternal(String packageName, Context context,
int userId) {
final UserHandle userHandle = UserHandle.of(userId);
// Get old package name
String oldPackageName = Settings.Secure.getStringForUser(context.getContentResolver(),
Settings.Secure.SMS_DEFAULT_APPLICATION, userId);
@@ -628,7 +644,7 @@ public final class SmsApplication {
if (DEBUG_MULTIUSER) {
Log.i(LOG_TAG, "setDefaultApplicationInternal old=" + oldAppData.mPackageName);
}
context.sendBroadcast(oldAppIntent);
context.sendBroadcastAsUser(oldAppIntent, userHandle);
}
// Notify the new sms app that it's now the default (if the new sms app has a receiver
// to handle the changed default sms intent).
@@ -646,8 +662,16 @@ public final class SmsApplication {
if (DEBUG_MULTIUSER) {
Log.i(LOG_TAG, "setDefaultApplicationInternal new=" + packageName);
}
context.sendBroadcast(intent);
context.sendBroadcastAsUser(intent, userHandle);
}
// Send an implicit broadcast for the system server.
// (or anyone with MONITOR_DEFAULT_SMS_PACKAGE, really.)
final Intent intent =
new Intent(Telephony.Sms.Intents.ACTION_DEFAULT_SMS_PACKAGE_CHANGED_INTERNAL);
context.sendBroadcastAsUser(intent, userHandle,
permission.MONITOR_DEFAULT_SMS_PACKAGE);
MetricsLogger.action(context, MetricsEvent.ACTION_DEFAULT_SMS_APP_CHANGED,
applicationData.mPackageName);
}
@@ -799,7 +823,18 @@ public final class SmsApplication {
* @return component name of the app and class to deliver SMS messages to
*/
public static ComponentName getDefaultSmsApplication(Context context, boolean updateIfNeeded) {
int userId = getIncomingUserId(context);
return getDefaultSmsApplicationAsUser(context, updateIfNeeded, getIncomingUserId(context));
}
/**
* Gets the default SMS application on a given user
* @param context context from the calling app
* @param updateIfNeeded update the default app if there is no valid default app configured.
* @param userId target user ID.
* @return component name of the app and class to deliver SMS messages to
*/
public static ComponentName getDefaultSmsApplicationAsUser(Context context,
boolean updateIfNeeded, int userId) {
final long token = Binder.clearCallingIdentity();
try {
ComponentName component = null;

View File

@@ -21,6 +21,7 @@ import android.Manifest;
import android.app.AppOpsManager;
import android.content.Context;
import android.os.Binder;
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.telephony.Rlog;
@@ -328,4 +329,17 @@ public final class TelephonyPermissions {
Rlog.e(LOG_TAG, "Phone process is down, cannot check carrier privileges");
return TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS;
}
/**
* Throws if the caller is not of a shell (or root) UID.
*
* @param callingUid pass Binder.callingUid().
*/
public static void enforceShellOnly(int callingUid, String message) {
if (callingUid == Process.SHELL_UID || callingUid == Process.ROOT_UID) {
return; // okay
}
throw new SecurityException(message + ": Only shell user can call it");
}
}