diff options
95 files changed, 1898 insertions, 1146 deletions
@@ -69,6 +69,7 @@ LOCAL_SRC_FILES += \ core/java/android/app/IActivityPendingResult.aidl \ core/java/android/app/IAlarmManager.aidl \ core/java/android/app/IAppTask.aidl \ + core/java/android/app/ITaskStackListener.aidl \ core/java/android/app/IBackupAgent.aidl \ core/java/android/app/IInstrumentationWatcher.aidl \ core/java/android/app/INotificationManager.aidl \ @@ -203,8 +204,8 @@ LOCAL_SRC_FILES += \ core/java/android/os/IUpdateLock.aidl \ core/java/android/os/IUserManager.aidl \ core/java/android/os/IVibratorService.aidl \ - core/java/android/service/carriermessaging/ICarrierMessagingCallback.aidl \ - core/java/android/service/carriermessaging/ICarrierMessagingService.aidl \ + core/java/android/service/carrier/ICarrierMessagingCallback.aidl \ + core/java/android/service/carrier/ICarrierMessagingService.aidl \ core/java/android/service/notification/INotificationListener.aidl \ core/java/android/service/notification/IStatusBarNotificationHolder.aidl \ core/java/android/service/notification/IConditionListener.aidl \ @@ -523,8 +524,7 @@ aidl_files := \ frameworks/base/core/java/android/view/textservice/SpellCheckerInfo.aidl \ frameworks/base/core/java/android/view/textservice/SentenceSuggestionsInfo.aidl \ frameworks/base/core/java/android/view/textservice/SuggestionsInfo.aidl \ - frameworks/base/core/java/android/service/carriermessaging/MessagePdu.aidl \ - frameworks/base/core/java/android/service/carriermessaging/CarrierMessagingService.aidl \ + frameworks/base/core/java/android/service/carrier/MessagePdu.aidl \ frameworks/base/core/java/android/service/notification/StatusBarNotification.aidl \ frameworks/base/core/java/android/speech/tts/Voice.aidl \ frameworks/base/core/java/android/app/usage/UsageEvents.aidl \ @@ -731,7 +731,8 @@ samples_dir := development/samples/browseable # Whitelist of valid groups, used for default TOC grouping. Each sample must # belong to one (and only one) group. Assign samples to groups by setting # a sample.group var to one of these groups in the sample's _index.jd. -sample_groups := -samplegroup Background \ +sample_groups := -samplegroup Admin \ + -samplegroup Background \ -samplegroup Connectivity \ -samplegroup Content \ -samplegroup Input \ diff --git a/api/current.txt b/api/current.txt index 53aa4a2..5a17f6f 100644 --- a/api/current.txt +++ b/api/current.txt @@ -8782,11 +8782,9 @@ package android.content.pm { field public static final java.lang.String FEATURE_CAMERA = "android.hardware.camera"; field public static final java.lang.String FEATURE_CAMERA_ANY = "android.hardware.camera.any"; field public static final java.lang.String FEATURE_CAMERA_AUTOFOCUS = "android.hardware.camera.autofocus"; - field public static final java.lang.String FEATURE_CAMERA_CAPABILITY_BURST_CAPTURE = "android.hardware.camera.capability.burst_capture"; field public static final java.lang.String FEATURE_CAMERA_CAPABILITY_MANUAL_POST_PROCESSING = "android.hardware.camera.capability.manual_post_processing"; field public static final java.lang.String FEATURE_CAMERA_CAPABILITY_MANUAL_SENSOR = "android.hardware.camera.capability.manual_sensor"; field public static final java.lang.String FEATURE_CAMERA_CAPABILITY_RAW = "android.hardware.camera.capability.raw"; - field public static final java.lang.String FEATURE_CAMERA_CAPABILITY_READ_SENSOR_SETTINGS = "android.hardware.camera.capability.read_sensor_settings"; field public static final java.lang.String FEATURE_CAMERA_EXTERNAL = "android.hardware.camera.external"; field public static final java.lang.String FEATURE_CAMERA_FLASH = "android.hardware.camera.flash"; field public static final java.lang.String FEATURE_CAMERA_FRONT = "android.hardware.camera.front"; @@ -26914,71 +26912,46 @@ package android.security { } -package android.service.carriermessaging { +package android.service.carrier { public abstract class CarrierMessagingService extends android.app.Service { ctor public CarrierMessagingService(); method public android.os.IBinder onBind(android.content.Intent); - method public int onDownloadMms(android.net.Uri, java.lang.String); - method public boolean onFilterSms(android.service.carriermessaging.MessagePdu, java.lang.String, int); - method public android.service.carriermessaging.CarrierMessagingService.SendSmsResponse onSendDataSms(byte[], java.lang.String, java.lang.String, int); - method public android.service.carriermessaging.CarrierMessagingService.SendMmsResult onSendMms(android.net.Uri, java.lang.String); - method public java.util.List<android.service.carriermessaging.CarrierMessagingService.SendSmsResponse> onSendMultipartTextSms(java.util.List<java.lang.String>, java.lang.String, java.lang.String); - method public android.service.carriermessaging.CarrierMessagingService.SendSmsResponse onSendTextSms(java.lang.String, java.lang.String, java.lang.String); + method public void onDownloadMms(android.net.Uri, int, android.net.Uri, android.service.carrier.CarrierMessagingService.ResultCallback<java.lang.Integer>); + method public void onFilterSms(android.service.carrier.MessagePdu, java.lang.String, int, int, android.service.carrier.CarrierMessagingService.ResultCallback<java.lang.Boolean>); + method public void onSendDataSms(byte[], int, java.lang.String, int, android.service.carrier.CarrierMessagingService.ResultCallback<android.service.carrier.CarrierMessagingService.SendSmsResult>); + method public void onSendMms(android.net.Uri, int, android.net.Uri, android.service.carrier.CarrierMessagingService.ResultCallback<android.service.carrier.CarrierMessagingService.SendMmsResult>); + method public void onSendMultipartTextSms(java.util.List<java.lang.String>, int, java.lang.String, android.service.carrier.CarrierMessagingService.ResultCallback<android.service.carrier.CarrierMessagingService.SendMultipartSmsResult>); + method public void onSendTextSms(java.lang.String, int, java.lang.String, android.service.carrier.CarrierMessagingService.ResultCallback<android.service.carrier.CarrierMessagingService.SendSmsResult>); field public static final int DOWNLOAD_STATUS_ERROR = 2; // 0x2 field public static final int DOWNLOAD_STATUS_OK = 0; // 0x0 field public static final int DOWNLOAD_STATUS_RETRY_ON_CARRIER_NETWORK = 1; // 0x1 field public static final int SEND_STATUS_ERROR = 2; // 0x2 field public static final int SEND_STATUS_OK = 0; // 0x0 field public static final int SEND_STATUS_RETRY_ON_CARRIER_NETWORK = 1; // 0x1 - field public static final java.lang.String SERVICE_INTERFACE = "android.service.carriermessaging.CarrierMessagingService"; + field public static final java.lang.String SERVICE_INTERFACE = "android.service.carrier.CarrierMessagingService"; + } + + public static abstract interface CarrierMessagingService.ResultCallback { + method public abstract void onReceiveResult(T) throws android.os.RemoteException; } public static final class CarrierMessagingService.SendMmsResult { ctor public CarrierMessagingService.SendMmsResult(int, byte[]); - method public int getResult(); method public byte[] getSendConfPdu(); + method public int getSendStatus(); } - public static final class CarrierMessagingService.SendSmsResponse implements android.os.Parcelable { - ctor public CarrierMessagingService.SendSmsResponse(int, byte[], int); - method public int describeContents(); - method public byte[] getAckPdu(); - method public int getErrorCode(); - method public int getMessageRef(); - method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.service.carriermessaging.CarrierMessagingService.SendSmsResponse> CREATOR; + public static final class CarrierMessagingService.SendMultipartSmsResult { + ctor public CarrierMessagingService.SendMultipartSmsResult(int, int[]); + method public int[] getMessageRefs(); + method public int getSendStatus(); } - public abstract interface ICarrierMessagingCallback implements android.os.IInterface { - method public abstract void onDownloadMmsComplete(int) throws android.os.RemoteException; - method public abstract void onFilterComplete(boolean) throws android.os.RemoteException; - method public abstract void onSendMmsComplete(int, byte[]) throws android.os.RemoteException; - method public abstract void onSendMultipartSmsComplete(int, java.util.List<android.service.carriermessaging.CarrierMessagingService.SendSmsResponse>) throws android.os.RemoteException; - method public abstract void onSendSmsComplete(int, android.service.carriermessaging.CarrierMessagingService.SendSmsResponse) throws android.os.RemoteException; - } - - public static abstract class ICarrierMessagingCallback.Stub extends android.os.Binder implements android.service.carriermessaging.ICarrierMessagingCallback { - ctor public ICarrierMessagingCallback.Stub(); - method public android.os.IBinder asBinder(); - method public static android.service.carriermessaging.ICarrierMessagingCallback asInterface(android.os.IBinder); - method public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException; - } - - public abstract interface ICarrierMessagingService implements android.os.IInterface { - method public abstract void downloadMms(android.net.Uri, java.lang.String, android.service.carriermessaging.ICarrierMessagingCallback) throws android.os.RemoteException; - method public abstract void filterSms(android.service.carriermessaging.MessagePdu, java.lang.String, int, android.service.carriermessaging.ICarrierMessagingCallback) throws android.os.RemoteException; - method public abstract void sendDataSms(byte[], java.lang.String, java.lang.String, int, android.service.carriermessaging.ICarrierMessagingCallback) throws android.os.RemoteException; - method public abstract void sendMms(android.net.Uri, java.lang.String, android.service.carriermessaging.ICarrierMessagingCallback) throws android.os.RemoteException; - method public abstract void sendMultipartTextSms(java.util.List<java.lang.String>, java.lang.String, java.lang.String, android.service.carriermessaging.ICarrierMessagingCallback) throws android.os.RemoteException; - method public abstract void sendTextSms(java.lang.String, java.lang.String, java.lang.String, android.service.carriermessaging.ICarrierMessagingCallback) throws android.os.RemoteException; - } - - public static abstract class ICarrierMessagingService.Stub extends android.os.Binder implements android.service.carriermessaging.ICarrierMessagingService { - ctor public ICarrierMessagingService.Stub(); - method public android.os.IBinder asBinder(); - method public static android.service.carriermessaging.ICarrierMessagingService asInterface(android.os.IBinder); - method public boolean onTransact(int, android.os.Parcel, android.os.Parcel, int) throws android.os.RemoteException; + public static final class CarrierMessagingService.SendSmsResult { + ctor public CarrierMessagingService.SendSmsResult(int, int); + method public int getMessageRef(); + method public int getSendStatus(); } public final class MessagePdu implements android.os.Parcelable { @@ -26986,7 +26959,7 @@ package android.service.carriermessaging { method public int describeContents(); method public java.util.List<byte[]> getPdus(); method public void writeToParcel(android.os.Parcel, int); - field public static final android.os.Parcelable.Creator<android.service.carriermessaging.MessagePdu> CREATOR; + field public static final android.os.Parcelable.Creator<android.service.carrier.MessagePdu> CREATOR; } } diff --git a/cmds/appops/src/com/android/commands/appops/AppOpsCommand.java b/cmds/appops/src/com/android/commands/appops/AppOpsCommand.java index c414f58..3ec63b4 100644 --- a/cmds/appops/src/com/android/commands/appops/AppOpsCommand.java +++ b/cmds/appops/src/com/android/commands/appops/AppOpsCommand.java @@ -24,10 +24,12 @@ import android.content.pm.IPackageManager; import android.os.ServiceManager; import android.os.UserHandle; +import android.util.TimeUtils; import com.android.internal.app.IAppOpsService; import com.android.internal.os.BaseCommand; import java.io.PrintStream; +import java.util.List; /** * This class is a command line utility for manipulating AppOps permissions. @@ -40,15 +42,19 @@ public class AppOpsCommand extends BaseCommand { @Override public void onShowUsage(PrintStream out) { - out.println("usage: adb shell appops set <PACKAGE> <OP> " - + "<allow|ignore|deny|default> [--user <USER_ID>]\n" + out.println("usage: appops set [--user <USER_ID>] <PACKAGE> <OP> <MODE>\n" + + " appops get [--user <USER_ID>] <PACKAGE> [<OP>]\n" + + " appops reset [--user <USER_ID>] [<PACKAGE>]\n" + " <PACKAGE> an Android package name.\n" + " <OP> an AppOps operation.\n" + + " <MODE> one of allow, ignore, deny, or default\n" + " <USER_ID> the user id under which the package is installed. If --user is not\n" + " specified, the current user is assumed.\n"); } private static final String COMMAND_SET = "set"; + private static final String COMMAND_GET = "get"; + private static final String COMMAND_RESET = "reset"; @Override public void onRun() throws Exception { @@ -58,8 +64,17 @@ public class AppOpsCommand extends BaseCommand { runSet(); break; + case COMMAND_GET: + runGet(); + break; + + case COMMAND_RESET: + runReset(); + break; + default: - throw new IllegalArgumentException("Unknown command '" + command + "'."); + System.err.println("Error: Unknown command: '" + command + "'."); + break; } } @@ -71,6 +86,23 @@ public class AppOpsCommand extends BaseCommand { private static final String MODE_IGNORE = "ignore"; private static final String MODE_DEFAULT = "default"; + private int strOpToOp(String op) { + try { + return AppOpsManager.strOpToOp(op); + } catch (IllegalArgumentException e) { + } + try { + return Integer.parseInt(op); + } catch (NumberFormatException e) { + } + try { + return AppOpsManager.strDebugOpToOp(op); + } catch (IllegalArgumentException e) { + System.err.println("Error: " + e.getMessage()); + return -1; + } + } + private void runSet() throws Exception { String packageName = null; String op = null; @@ -87,20 +119,27 @@ public class AppOpsCommand extends BaseCommand { } else if (mode == null) { mode = argument; } else { - throw new IllegalArgumentException("Unsupported argument: " + argument); + System.err.println("Error: Unsupported argument: " + argument); + return; } } } if (packageName == null) { - throw new IllegalArgumentException("Package name not specified."); + System.err.println("Error: Package name not specified."); + return; } else if (op == null) { - throw new IllegalArgumentException("Operation not specified."); + System.err.println("Error: Operation not specified."); + return; } else if (mode == null) { - throw new IllegalArgumentException("Mode not specified."); + System.err.println("Error: Mode not specified."); + return; } - final int opInt = AppOpsManager.strOpToOp(op); + final int opInt = strOpToOp(op); + if (opInt < 0) { + return; + } final int modeInt; switch (mode) { case MODE_ALLOW: @@ -116,7 +155,8 @@ public class AppOpsCommand extends BaseCommand { modeInt = AppOpsManager.MODE_DEFAULT; break; default: - throw new IllegalArgumentException("Mode is invalid."); + System.err.println("Error: Mode " + mode + " is not valid,"); + return; } // Parsing complete, let's execute the command. @@ -130,8 +170,155 @@ public class AppOpsCommand extends BaseCommand { ServiceManager.getService(Context.APP_OPS_SERVICE)); final int uid = pm.getPackageUid(packageName, userId); if (uid < 0) { - throw new Exception("No UID for " + packageName + " for user " + userId); + System.err.println("Error: No UID for " + packageName + " in user " + userId); + return; } appOpsService.setMode(opInt, uid, packageName, modeInt); } + + private void runGet() throws Exception { + String packageName = null; + String op = null; + int userId = UserHandle.USER_CURRENT; + for (String argument; (argument = nextArg()) != null;) { + if (ARGUMENT_USER.equals(argument)) { + userId = Integer.parseInt(nextArgRequired()); + } else { + if (packageName == null) { + packageName = argument; + } else if (op == null) { + op = argument; + } else { + System.err.println("Error: Unsupported argument: " + argument); + return; + } + } + } + + if (packageName == null) { + System.err.println("Error: Package name not specified."); + return; + } + + final int opInt = op != null ? strOpToOp(op) : 0; + + // Parsing complete, let's execute the command. + + if (userId == UserHandle.USER_CURRENT) { + userId = ActivityManager.getCurrentUser(); + } + + final IPackageManager pm = ActivityThread.getPackageManager(); + final IAppOpsService appOpsService = IAppOpsService.Stub.asInterface( + ServiceManager.getService(Context.APP_OPS_SERVICE)); + final int uid = pm.getPackageUid(packageName, userId); + if (uid < 0) { + System.err.println("Error: No UID for " + packageName + " in user " + userId); + return; + } + List<AppOpsManager.PackageOps> ops = appOpsService.getOpsForPackage(uid, packageName, + op != null ? new int[] {opInt} : null); + if (ops == null || ops.size() <= 0) { + System.out.println("No operations."); + return; + } + final long now = System.currentTimeMillis(); + for (int i=0; i<ops.size(); i++) { + List<AppOpsManager.OpEntry> entries = ops.get(i).getOps(); + for (int j=0; j<entries.size(); j++) { + AppOpsManager.OpEntry ent = entries.get(j); + System.out.print(AppOpsManager.opToName(ent.getOp())); + System.out.print(": "); + switch (ent.getMode()) { + case AppOpsManager.MODE_ALLOWED: + System.out.print("allow"); + break; + case AppOpsManager.MODE_IGNORED: + System.out.print("ignore"); + break; + case AppOpsManager.MODE_ERRORED: + System.out.print("deny"); + break; + case AppOpsManager.MODE_DEFAULT: + System.out.print("default"); + break; + default: + System.out.print("mode="); + System.out.print(ent.getMode()); + break; + } + if (ent.getTime() != 0) { + System.out.print("; time="); + StringBuilder sb = new StringBuilder(); + TimeUtils.formatDuration(now - ent.getTime(), sb); + System.out.print(sb); + System.out.print(" ago"); + } + if (ent.getRejectTime() != 0) { + System.out.print("; rejectTime="); + StringBuilder sb = new StringBuilder(); + TimeUtils.formatDuration(now - ent.getRejectTime(), sb); + System.out.print(sb); + System.out.print(" ago"); + } + if (ent.getDuration() == -1) { + System.out.print(" (running)"); + } else if (ent.getDuration() != 0) { + System.out.print("; duration="); + StringBuilder sb = new StringBuilder(); + TimeUtils.formatDuration(ent.getDuration(), sb); + System.out.print(sb); + } + System.out.println(); + } + } + } + + private void runReset() throws Exception { + String packageName = null; + int userId = UserHandle.USER_CURRENT; + for (String argument; (argument = nextArg()) != null;) { + if (ARGUMENT_USER.equals(argument)) { + String userStr = nextArgRequired(); + if ("all".equals(userStr)) { + userId = UserHandle.USER_ALL; + } else if ("current".equals(userStr)) { + userId = UserHandle.USER_CURRENT; + } else if ("owner".equals(userStr)) { + userId = UserHandle.USER_OWNER; + } else { + userId = Integer.parseInt(nextArgRequired()); + } + } else { + if (packageName == null) { + packageName = argument; + } else { + System.err.println("Error: Unsupported argument: " + argument); + return; + } + } + } + + // Parsing complete, let's execute the command. + + if (userId == UserHandle.USER_CURRENT) { + userId = ActivityManager.getCurrentUser(); + } + + final IAppOpsService appOpsService = IAppOpsService.Stub.asInterface( + ServiceManager.getService(Context.APP_OPS_SERVICE)); + appOpsService.resetAllModes(userId, packageName); + System.out.print("Reset all modes for: "); + if (userId == UserHandle.USER_ALL) { + System.out.print("all users"); + } else { + System.out.print("user "); System.out.print(userId); + } + System.out.print(", "); + if (packageName == null) { + System.out.println("all packages"); + } else { + System.out.print("package "); System.out.println(packageName); + } + } } diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index 6ec48e5..06a26ec 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -774,6 +774,14 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM return true; } + case REGISTER_TASK_STACK_LISTENER_TRANSACTION: { + data.enforceInterface(IActivityManager.descriptor); + IBinder token = data.readStrongBinder(); + registerTaskStackListener(ITaskStackListener.Stub.asInterface(token)); + reply.writeNoException(); + return true; + } + case GET_TASK_FOR_ACTIVITY_TRANSACTION: { data.enforceInterface(IActivityManager.descriptor); IBinder token = data.readStrongBinder(); @@ -3266,6 +3274,18 @@ class ActivityManagerProxy implements IActivityManager data.recycle(); reply.recycle(); } + @Override + public void registerTaskStackListener(ITaskStackListener listener) throws RemoteException + { + Parcel data = Parcel.obtain(); + Parcel reply = Parcel.obtain(); + data.writeInterfaceToken(IActivityManager.descriptor); + data.writeStrongBinder(listener.asBinder()); + mRemote.transact(REGISTER_TASK_STACK_LISTENER_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY); + reply.readException(); + data.recycle(); + reply.recycle(); + } public int getTaskForActivity(IBinder token, boolean onlyRoot) throws RemoteException { Parcel data = Parcel.obtain(); diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java index ba9c9d6..95870cf 100644 --- a/core/java/android/app/AppOpsManager.java +++ b/core/java/android/app/AppOpsManager.java @@ -26,6 +26,7 @@ import android.os.Parcel; import android.os.Parcelable; import android.os.Process; import android.os.RemoteException; +import android.os.UserHandle; import android.os.UserManager; import android.util.ArrayMap; @@ -734,6 +735,18 @@ public class AppOpsManager { } /** + * @hide + */ + public static int strDebugOpToOp(String op) { + for (int i=0; i<sOpNames.length; i++) { + if (sOpNames[i].equals(op)) { + return i; + } + } + throw new IllegalArgumentException("Unknown operation string: " + op); + } + + /** * Retrieve the permission associated with an operation, or null if there is not one. * @hide */ @@ -996,7 +1009,7 @@ public class AppOpsManager { /** @hide */ public void resetAllModes() { try { - mService.resetAllModes(); + mService.resetAllModes(UserHandle.myUserId(), null); } catch (RemoteException e) { } } diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index 5362303..1ccbd27 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -139,6 +139,7 @@ public interface IActivityManager extends IInterface { public StackInfo getStackInfo(int stackId) throws RemoteException; public boolean isInHomeStack(int taskId) throws RemoteException; public void setFocusedStack(int stackId) throws RemoteException; + public void registerTaskStackListener(ITaskStackListener listener) throws RemoteException; public int getTaskForActivity(IBinder token, boolean onlyRoot) throws RemoteException; public ContentProviderHolder getContentProvider(IApplicationThread caller, String name, int userId, boolean stable) throws RemoteException; @@ -788,4 +789,5 @@ public interface IActivityManager extends IInterface { int LAUNCH_ASSIST_INTENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+239; int START_IN_PLACE_ANIMATION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+240; int CHECK_PERMISSION_WITH_TOKEN_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+241; + int REGISTER_TASK_STACK_LISTENER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+242; } diff --git a/core/java/android/service/carriermessaging/CarrierMessagingService.aidl b/core/java/android/app/ITaskStackListener.aidl index 50c438a..4b0935c 100644 --- a/core/java/android/service/carriermessaging/CarrierMessagingService.aidl +++ b/core/java/android/app/ITaskStackListener.aidl @@ -14,6 +14,9 @@ * limitations under the License. */ -package android.service.carriermessaging; +package android.app; -parcelable CarrierMessagingService.SendSmsResponse;
\ No newline at end of file +/** @hide */ +oneway interface ITaskStackListener { + void onTaskStackChanged(); +} diff --git a/core/java/android/app/backup/WallpaperBackupHelper.java b/core/java/android/app/backup/WallpaperBackupHelper.java index a55cc2b..7a80936 100644 --- a/core/java/android/app/backup/WallpaperBackupHelper.java +++ b/core/java/android/app/backup/WallpaperBackupHelper.java @@ -102,9 +102,8 @@ public class WallpaperBackupHelper extends FileBackupHelperBase implements Backu final Display d = wm.getDefaultDisplay(); final Point size = new Point(); d.getSize(size); - mDesiredMinWidth = size.x; + mDesiredMinWidth = Math.min(size.x, size.y); mDesiredMinHeight = (double) wpm.getDesiredMinimumHeight(); - if (mDesiredMinHeight <= 0) { mDesiredMinHeight = size.y; } @@ -149,9 +148,13 @@ public class WallpaperBackupHelper extends FileBackupHelperBase implements Backu // We accept any wallpaper that is at least as wide as our preference // (i.e. wide enough to fill the screen), and is within a comfortable // factor of the target height, to avoid significant clipping/scaling/ - // letterboxing. + // letterboxing. At this point we know that mDesiredMinWidth is the + // smallest dimension, regardless of current orientation, so we can + // safely require that the candidate's width and height both exceed + // that hard minimum. final double heightRatio = mDesiredMinHeight / options.outHeight; if (options.outWidth < mDesiredMinWidth + || options.outHeight < mDesiredMinWidth || heightRatio >= MAX_HEIGHT_RATIO || heightRatio <= MIN_HEIGHT_RATIO) { // Not wide enough for the screen, or too short/tall to be a good fit diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java index 5c705e6..e9f7c50 100644 --- a/core/java/android/content/pm/PackageManager.java +++ b/core/java/android/content/pm/PackageManager.java @@ -1078,26 +1078,6 @@ public abstract class PackageManager { "android.hardware.camera.capability.raw"; /** - * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: At least one - * of the cameras on the device supports the - * {@link android.hardware.camera2.CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_BURST_CAPTURE BURST_CAPTURE} - * capability level. - */ - @SdkConstant(SdkConstantType.FEATURE) - public static final String FEATURE_CAMERA_CAPABILITY_BURST_CAPTURE = - "android.hardware.camera.capability.burst_capture"; - - /** - * Feature for {@link #getSystemAvailableFeatures} and {@link #hasSystemFeature}: At least one - * of the cameras on the device supports the - * {@link android.hardware.camera2.CameraMetadata#REQUEST_AVAILABLE_CAPABILITIES_READ_SENSOR_SETTINGS READ_SENSOR_SETTINGS} - * capability level. - */ - @SdkConstant(SdkConstantType.FEATURE) - public static final String FEATURE_CAMERA_CAPABILITY_READ_SENSOR_SETTINGS = - "android.hardware.camera.capability.read_sensor_settings"; - - /** * Feature for {@link #getSystemAvailableFeatures} and * {@link #hasSystemFeature}: The device is capable of communicating with * consumer IR devices. diff --git a/core/java/android/content/pm/PackageParser.java b/core/java/android/content/pm/PackageParser.java index 82da7c5..d7d9e8b 100644 --- a/core/java/android/content/pm/PackageParser.java +++ b/core/java/android/content/pm/PackageParser.java @@ -3528,6 +3528,10 @@ public class PackageParser { outError[0] = "<provider> does not include authorities attribute"; return null; } + if (cpname.length() <= 0) { + outError[0] = "<provider> has empty authorities attribute"; + return null; + } p.info.authority = cpname.intern(); if (!parseProviderTags(res, parser, attrs, p, outError)) { diff --git a/core/java/android/hardware/camera2/CameraCharacteristics.java b/core/java/android/hardware/camera2/CameraCharacteristics.java index 98096dc..f487f01 100644 --- a/core/java/android/hardware/camera2/CameraCharacteristics.java +++ b/core/java/android/hardware/camera2/CameraCharacteristics.java @@ -337,8 +337,7 @@ public final class CameraCharacteristics extends CameraMetadata<CameraCharacteri * supported by a given camera device. This field lists the * valid anti-banding modes that the application may request * for this camera device with the - * {@link CaptureRequest#CONTROL_AE_ANTIBANDING_MODE android.control.aeAntibandingMode} control. This list - * always includes AUTO.</p> + * {@link CaptureRequest#CONTROL_AE_ANTIBANDING_MODE android.control.aeAntibandingMode} control.</p> * <p><b>Range of valid values:</b><br> * Any value listed in {@link CaptureRequest#CONTROL_AE_ANTIBANDING_MODE android.control.aeAntibandingMode}</p> * <p>This key is available on all devices.</p> diff --git a/core/java/android/hardware/camera2/CameraMetadata.java b/core/java/android/hardware/camera2/CameraMetadata.java index 895ae04..999de8a 100644 --- a/core/java/android/hardware/camera2/CameraMetadata.java +++ b/core/java/android/hardware/camera2/CameraMetadata.java @@ -493,9 +493,11 @@ public abstract class CameraMetadata<TKey> { * {@link CameraCharacteristics#SCALER_STREAM_CONFIGURATION_MAP android.scaler.streamConfigurationMap}, the minimum frame * duration for that format and size is <= 1/20 s, and * the {@link CameraCharacteristics#CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES android.control.aeAvailableTargetFpsRanges} entry - * lists at least one FPS range where the minimum FPS - * is >= 1 / minimumFrameDuration for the maximum-size + * lists at least one FPS range where the minimum FPS is</p> + * <blockquote> + * <p>= 1 / minimumFrameDuration for the maximum-size * YUV_420_888 format.</p> + * </blockquote> * <p>In addition, the {@link CameraCharacteristics#SYNC_MAX_LATENCY android.sync.maxLatency} field is * guaranted to have a value between 0 and 4, inclusive.</p> * @@ -847,7 +849,8 @@ public abstract class CameraMetadata<TKey> { /** * <p>The camera device will automatically adapt its * antibanding routine to the current illumination - * conditions. This is the default.</p> + * condition. This is the default mode if AUTO is + * available on given camera device.</p> * @see CaptureRequest#CONTROL_AE_ANTIBANDING_MODE */ public static final int CONTROL_AE_ANTIBANDING_MODE_AUTO = 3; diff --git a/core/java/android/hardware/camera2/CaptureRequest.java b/core/java/android/hardware/camera2/CaptureRequest.java index 48af67c..e89a402 100644 --- a/core/java/android/hardware/camera2/CaptureRequest.java +++ b/core/java/android/hardware/camera2/CaptureRequest.java @@ -642,8 +642,10 @@ public final class CaptureRequest extends CameraMetadata<CaptureRequest.Key<?>> * options for the antibanding mode. The * {@link CameraCharacteristics#CONTROL_AE_AVAILABLE_ANTIBANDING_MODES android.control.aeAvailableAntibandingModes} key contains * the available modes for a given camera device.</p> - * <p>The default mode is AUTO, which is supported by all - * camera devices.</p> + * <p>AUTO mode is the default if it is available on given + * camera device. When AUTO mode is not available, the + * default will be either 50HZ or 60HZ, and both 50HZ + * and 60HZ will be available.</p> * <p>If manual exposure control is enabled (by setting * {@link CaptureRequest#CONTROL_AE_MODE android.control.aeMode} or {@link CaptureRequest#CONTROL_MODE android.control.mode} to OFF), * then this setting has no effect, and the application must diff --git a/core/java/android/hardware/camera2/CaptureResult.java b/core/java/android/hardware/camera2/CaptureResult.java index c5c843d..2c3b85f 100644 --- a/core/java/android/hardware/camera2/CaptureResult.java +++ b/core/java/android/hardware/camera2/CaptureResult.java @@ -493,8 +493,10 @@ public class CaptureResult extends CameraMetadata<CaptureResult.Key<?>> { * options for the antibanding mode. The * {@link CameraCharacteristics#CONTROL_AE_AVAILABLE_ANTIBANDING_MODES android.control.aeAvailableAntibandingModes} key contains * the available modes for a given camera device.</p> - * <p>The default mode is AUTO, which is supported by all - * camera devices.</p> + * <p>AUTO mode is the default if it is available on given + * camera device. When AUTO mode is not available, the + * default will be either 50HZ or 60HZ, and both 50HZ + * and 60HZ will be available.</p> * <p>If manual exposure control is enabled (by setting * {@link CaptureRequest#CONTROL_AE_MODE android.control.aeMode} or {@link CaptureRequest#CONTROL_MODE android.control.mode} to OFF), * then this setting has no effect, and the application must diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 4215f20..4fe418a 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -100,7 +100,7 @@ public class ConnectivityManager { /** * Identical to {@link #CONNECTIVITY_ACTION} broadcast, but sent without any - * applicable {@link Settings.Global#CONNECTIVITY_CHANGE_DELAY}. + * historic {@link Settings.Global#CONNECTIVITY_CHANGE_DELAY}. * * @hide */ @@ -428,18 +428,6 @@ public class ConnectivityManager { public static final int DEFAULT_NETWORK_PREFERENCE = TYPE_WIFI; /** - * Default value for {@link Settings.Global#CONNECTIVITY_CHANGE_DELAY} in - * milliseconds. This was introduced because IPv6 routes seem to take a - * moment to settle - trying network activity before the routes are adjusted - * can lead to packets using the wrong interface or having the wrong IP address. - * This delay is a bit crude, but in the future hopefully we will have kernel - * notifications letting us know when it's safe to use the new network. - * - * @hide - */ - public static final int CONNECTIVITY_CHANGE_DELAY_DEFAULT = 3000; - - /** * @hide */ public final static int REQUEST_ID_UNSET = 0; diff --git a/core/java/android/net/VpnService.java b/core/java/android/net/VpnService.java index 78b9c18..f6b6978 100644 --- a/core/java/android/net/VpnService.java +++ b/core/java/android/net/VpnService.java @@ -291,16 +291,16 @@ public class VpnService extends Service { /** * Sets the underlying networks used by the VPN for its upstream connections. * - * Used by the system to know the actual networks that carry traffic for apps affected by this - * VPN in order to present this information to the user (e.g., via status bar icons). + * <p>Used by the system to know the actual networks that carry traffic for apps affected by + * this VPN in order to present this information to the user (e.g., via status bar icons). * - * This method only needs to be called if the VPN has explicitly bound its underlying + * <p>This method only needs to be called if the VPN has explicitly bound its underlying * communications channels — such as the socket(s) passed to {@link #protect(int)} — * to a {@code Network} using APIs such as {@link Network#bindSocket(Socket)} or * {@link Network#bindSocket(DatagramSocket)}. The VPN should call this method every time * the set of {@code Network}s it is using changes. * - * {@code networks} is one of the following: + * <p>{@code networks} is one of the following: * <ul> * <li><strong>a non-empty array</strong>: an array of one or more {@link Network}s, in * decreasing preference order. For example, if this VPN uses both wifi and mobile (cellular) @@ -310,11 +310,11 @@ public class VpnService extends Service { * underlying network connection, and thus, app traffic will not be sent or received.</li> * <li><strong>null</strong>: (default) signifies that the VPN uses whatever is the system's * default network. I.e., it doesn't use the {@code bindSocket} or {@code bindDatagramSocket} - * APIs mentioned above to send traffic over specific channels. + * APIs mentioned above to send traffic over specific channels.</li> * </ul> * - * This call will succeed only if the VPN is currently established. For setting this value when - * the VPN has not yet been established, see {@link Builder#setUnderlyingNetworks}. + * <p>This call will succeed only if the VPN is currently established. For setting this value + * when the VPN has not yet been established, see {@link Builder#setUnderlyingNetworks}. * * @param networks An array of networks the VPN uses to tunnel traffic to/from its servers. * diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java index 5e5fbc7..3bc74ae 100644 --- a/core/java/android/provider/Settings.java +++ b/core/java/android/provider/Settings.java @@ -6118,7 +6118,7 @@ public final class Settings { /** * The number of milliseconds to delay before sending out - * {@link ConnectivityManager#CONNECTIVITY_ACTION} broadcasts. + * {@link ConnectivityManager#CONNECTIVITY_ACTION} broadcasts. Ignored. * * @hide */ @@ -6608,6 +6608,14 @@ public final class Settings { public static final String ENHANCED_4G_MODE_ENABLED = "volte_vt_enabled"; /** + * Global override to disable VoLTE (independent of user setting) + * <p> + * Type: int (1 for disable VoLTE, 0 to use user configuration) + * @hide + */ + public static final String VOLTE_FEATURE_DISABLED = "volte_feature_disabled"; + + /** * Whether user can enable/disable LTE as a preferred network. A carrier might control * this via gservices, OMA-DM, carrier app, etc. * <p> diff --git a/core/java/android/service/carrier/CarrierMessagingService.java b/core/java/android/service/carrier/CarrierMessagingService.java new file mode 100644 index 0000000..3d6ebca --- /dev/null +++ b/core/java/android/service/carrier/CarrierMessagingService.java @@ -0,0 +1,417 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package android.service.carrier; + +import android.annotation.NonNull; +import android.annotation.Nullable; +import android.annotation.SdkConstant; +import android.app.Service; +import android.content.Intent; +import android.net.Uri; +import android.os.IBinder; +import android.os.Parcel; +import android.os.Parcelable; +import android.os.RemoteException; + +import java.util.ArrayList; +import java.util.List; + +/** + * A service that receives calls from the system when new SMS and MMS are + * sent or received. + * <p>To extend this class, you must declare the service in your manifest file with + * the {@link android.Manifest.permission#BIND_CARRIER_MESSAGING_SERVICE} permission + * and include an intent filter with the {@link #SERVICE_INTERFACE} action. For example:</p> + * <pre> + * <service android:name=".MyMessagingService" + * android:label="@string/service_name" + * android:permission="android.permission.BIND_CARRIER_MESSAGING_SERVICE"> + * <intent-filter> + * <action android:name="android.service.carrier.CarrierMessagingService" /> + * </intent-filter> + * </service></pre> + */ +public abstract class CarrierMessagingService extends Service { + /** + * The {@link android.content.Intent} that must be declared as handled by the service. + */ + @SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION) + public static final String SERVICE_INTERFACE + = "android.service.carrier.CarrierMessagingService"; + + /** + * Indicates that an SMS or MMS message was successfully sent. + */ + public static final int SEND_STATUS_OK = 0; + + /** + * SMS/MMS sending failed. We should retry via the carrier network. + */ + public static final int SEND_STATUS_RETRY_ON_CARRIER_NETWORK = 1; + + /** + * SMS/MMS sending failed. We should not retry via the carrier network. + */ + public static final int SEND_STATUS_ERROR = 2; + + /** + * Successfully downloaded an MMS message. + */ + public static final int DOWNLOAD_STATUS_OK = 0; + + /** + * MMS downloading failed. We should retry via the carrier network. + */ + public static final int DOWNLOAD_STATUS_RETRY_ON_CARRIER_NETWORK = 1; + + /** + * MMS downloading failed. We should not retry via the carrier network. + */ + public static final int DOWNLOAD_STATUS_ERROR = 2; + + private final ICarrierMessagingWrapper mWrapper = new ICarrierMessagingWrapper(); + + /** + * Override this method to filter inbound SMS messages. + * + * @param pdu the PDUs of the message + * @param format the format of the PDUs, typically "3gpp" or "3gpp2" + * @param destPort the destination port of a binary SMS, this will be -1 for text SMS + * @param subId SMS subscription ID of the SIM + * @param callback result callback. Call with {@code true} to keep an inbound SMS message and + * deliver to SMS apps, and {@code false} to drop the message. + */ + public void onFilterSms(@NonNull MessagePdu pdu, @NonNull String format, int destPort, + int subId, @NonNull ResultCallback<Boolean> callback) { + // optional + try { + callback.onReceiveResult(true); + } catch (RemoteException ex) { + } + } + + /** + * Override this method to intercept text SMSs sent from the device. + * + * @param text the text to send + * @param subId SMS subscription ID of the SIM + * @param destAddress phone number of the recipient of the message + * @param callback result callback. Call with a {@link SendSmsResult}. + */ + public void onSendTextSms( + @NonNull String text, int subId, @NonNull String destAddress, + @NonNull ResultCallback<SendSmsResult> callback) { + // optional + try { + callback.onReceiveResult(new SendSmsResult(SEND_STATUS_RETRY_ON_CARRIER_NETWORK, 0)); + } catch (RemoteException ex) { + } + } + + /** + * Override this method to intercept binary SMSs sent from the device. + * + * @param data the binary content + * @param subId SMS subscription ID of the SIM + * @param destAddress phone number of the recipient of the message + * @param destPort the destination port + * @param callback result callback. Call with a {@link SendSmsResult}. + */ + public void onSendDataSms(@NonNull byte[] data, int subId, + @NonNull String destAddress, int destPort, + @NonNull ResultCallback<SendSmsResult> callback) { + // optional + try { + callback.onReceiveResult(new SendSmsResult(SEND_STATUS_RETRY_ON_CARRIER_NETWORK, 0)); + } catch (RemoteException ex) { + } + } + + /** + * Override this method to intercept long SMSs sent from the device. + * + * @param parts a {@link List} of the message parts + * @param subId SMS subscription ID of the SIM + * @param destAddress phone number of the recipient of the message + * @param callback result callback. Call with a {@link SendMultipartSmsResult}. + */ + public void onSendMultipartTextSms(@NonNull List<String> parts, + int subId, @NonNull String destAddress, + @NonNull ResultCallback<SendMultipartSmsResult> callback) { + // optional + try { + callback.onReceiveResult( + new SendMultipartSmsResult(SEND_STATUS_RETRY_ON_CARRIER_NETWORK, null)); + } catch (RemoteException ex) { + } + } + + /** + * Override this method to intercept MMSs sent from the device. + * + * @param pduUri the content provider URI of the PDU to send + * @param subId SMS subscription ID of the SIM + * @param location the optional URI to send this MMS PDU. If this is {code null}, + * the PDU should be sent to the default MMSC URL. + * @param callback result callback. Call with a {@link SendMmsResult}. + */ + public void onSendMms(@NonNull Uri pduUri, int subId, + @Nullable Uri location, @NonNull ResultCallback<SendMmsResult> callback) { + // optional + try { + callback.onReceiveResult(new SendMmsResult(SEND_STATUS_RETRY_ON_CARRIER_NETWORK, null)); + } catch (RemoteException ex) { + } + } + + /** + * Override this method to download MMSs received. + * + * @param contentUri the content provider URI of the PDU to be downloaded. + * @param subId SMS subscription ID of the SIM + * @param location the URI of the message to be downloaded. + * @param callback result callback. Call with a status code which is one of + * {@link #DOWNLOAD_STATUS_OK}, + * {@link #DOWNLOAD_STATUS_RETRY_ON_CARRIER_NETWORK}, or {@link #DOWNLOAD_STATUS_ERROR}. + */ + public void onDownloadMms(@NonNull Uri contentUri, int subId, @NonNull Uri location, + @NonNull ResultCallback<Integer> callback) { + // optional + try { + callback.onReceiveResult(DOWNLOAD_STATUS_RETRY_ON_CARRIER_NETWORK); + } catch (RemoteException ex) { + } + } + + @Override + public @Nullable IBinder onBind(@NonNull Intent intent) { + if (!SERVICE_INTERFACE.equals(intent.getAction())) { + return null; + } + return mWrapper; + } + + /** + * The result of sending an MMS. + */ + public static final class SendMmsResult { + private int mSendStatus; + private byte[] mSendConfPdu; + + /** + * Constructs a SendMmsResult with the MMS send result, and the SendConf PDU. + * + * @param sendStatus send status, one of {@link #SEND_STATUS_OK}, + * {@link #SEND_STATUS_RETRY_ON_CARRIER_NETWORK}, and + * {@link #SEND_STATUS_ERROR} + * @param sendConfPdu a possibly {code null} SendConf PDU, which confirms that the message + * was sent. sendConfPdu is ignored if the {@code result} is not + * {@link #SEND_STATUS_OK}. + */ + public SendMmsResult(int sendStatus, @Nullable byte[] sendConfPdu) { + mSendStatus = sendStatus; + mSendConfPdu = sendConfPdu; + } + + /** + * Returns the send status of the just-sent MMS. + * + * @return the send status which is one of {@link #SEND_STATUS_OK}, + * {@link #SEND_STATUS_RETRY_ON_CARRIER_NETWORK}, and {@link #SEND_STATUS_ERROR} + */ + public int getSendStatus() { + return mSendStatus; + } + + /** + * Returns the SendConf PDU, which confirms that the message was sent. + * + * @return the SendConf PDU + */ + public @Nullable byte[] getSendConfPdu() { + return mSendConfPdu; + } + } + + /** + * The result of sending an SMS. + */ + public static final class SendSmsResult { + private final int mSendStatus; + private final int mMessageRef; + + /** + * Constructs a SendSmsResult with the send status and message reference for the + * just-sent SMS. + * + * @param sendStatus send status, one of {@link #SEND_STATUS_OK}, + * {@link #SEND_STATUS_RETRY_ON_CARRIER_NETWORK}, and {@link #SEND_STATUS_ERROR}. + * @param messageRef message reference of the just-sent SMS. This field is applicable only + * if send status is {@link #SEND_STATUS_OK}. + */ + public SendSmsResult(int sendStatus, int messageRef) { + mSendStatus = sendStatus; + mMessageRef = messageRef; + } + + /** + * Returns the message reference of the just-sent SMS. + * + * @return the message reference + */ + public int getMessageRef() { + return mMessageRef; + } + + /** + * Returns the send status of the just-sent SMS. + * + * @return the send status + */ + public int getSendStatus() { + return mSendStatus; + } + } + + /** + * The result of sending a multipart SMS. + */ + public static final class SendMultipartSmsResult { + private final int mSendStatus; + private final int[] mMessageRefs; + + /** + * Constructs a SendMultipartSmsResult with the send status and message references for the + * just-sent multipart SMS. + * + * @param sendStatus send status, one of {@link #SEND_STATUS_OK}, + * {@link #SEND_STATUS_RETRY_ON_CARRIER_NETWORK}, and {@link #SEND_STATUS_ERROR}. + * @param messageRefs an array of message references, one for each part of the + * multipart SMS. This field is applicable only if send status is + * {@link #SEND_STATUS_OK}. + */ + public SendMultipartSmsResult(int sendStatus, @Nullable int[] messageRefs) { + mSendStatus = sendStatus; + mMessageRefs = messageRefs; + } + + /** + * Returns the message references of the just-sent multipart SMS. + * + * @return the message references, one for each part of the multipart SMS + */ + public @Nullable int[] getMessageRefs() { + return mMessageRefs; + } + + /** + * Returns the send status of the just-sent SMS. + * + * @return the send status + */ + public int getSendStatus() { + return mSendStatus; + } + } + + /** + * A callback interface used to provide results asynchronously. + */ + public interface ResultCallback<T> { + /** + * Invoked when the result is available. + * + * @param result the result + */ + public void onReceiveResult(@NonNull T result) throws RemoteException; + }; + + /** + * A wrapper around ICarrierMessagingService to enable the carrier messaging app to implement + * methods it cares about in the {@link ICarrierMessagingService} interface. + */ + private class ICarrierMessagingWrapper extends ICarrierMessagingService.Stub { + @Override + public void filterSms(MessagePdu pdu, String format, int destPort, + int subId, final ICarrierMessagingCallback callback) { + onFilterSms(pdu, format, destPort, subId, new ResultCallback<Boolean>() { + @Override + public void onReceiveResult(final Boolean result) throws RemoteException { + callback.onFilterComplete(result); + } + }); + } + + @Override + public void sendTextSms(String text, int subId, String destAddress, + final ICarrierMessagingCallback callback) { + onSendTextSms(text, subId, destAddress, new ResultCallback<SendSmsResult>() { + @Override + public void onReceiveResult(final SendSmsResult result) throws RemoteException { + callback.onSendSmsComplete(result.getSendStatus(), result.getMessageRef()); + } + }); + } + + @Override + public void sendDataSms(byte[] data, int subId, String destAddress, int destPort, + final ICarrierMessagingCallback callback) { + onSendDataSms(data, subId, destAddress, destPort, new ResultCallback<SendSmsResult>() { + @Override + public void onReceiveResult(final SendSmsResult result) throws RemoteException { + callback.onSendSmsComplete(result.getSendStatus(), result.getMessageRef()); + } + }); + } + + @Override + public void sendMultipartTextSms(List<String> parts, int subId, String destAddress, + final ICarrierMessagingCallback callback) { + onSendMultipartTextSms(parts, subId, destAddress, + new ResultCallback<SendMultipartSmsResult>() { + @Override + public void onReceiveResult(final SendMultipartSmsResult result) + throws RemoteException { + callback.onSendMultipartSmsComplete( + result.getSendStatus(), result.getMessageRefs()); + } + }); + } + + @Override + public void sendMms(Uri pduUri, int subId, Uri location, + final ICarrierMessagingCallback callback) { + onSendMms(pduUri, subId, location, new ResultCallback<SendMmsResult>() { + @Override + public void onReceiveResult(final SendMmsResult result) throws RemoteException { + callback.onSendMmsComplete(result.getSendStatus(), result.getSendConfPdu()); + } + }); + } + + @Override + public void downloadMms(Uri pduUri, int subId, Uri location, + final ICarrierMessagingCallback callback) { + onDownloadMms(pduUri, subId, location, new ResultCallback<Integer>() { + @Override + public void onReceiveResult(Integer result) throws RemoteException { + callback.onDownloadMmsComplete(result); + } + }); + } + } +} diff --git a/core/java/android/service/carriermessaging/ICarrierMessagingCallback.aidl b/core/java/android/service/carrier/ICarrierMessagingCallback.aidl index da56ad1..6118a20 100644 --- a/core/java/android/service/carriermessaging/ICarrierMessagingCallback.aidl +++ b/core/java/android/service/carrier/ICarrierMessagingCallback.aidl @@ -14,20 +14,17 @@ * limitations under the License. */ -package android.service.carriermessaging; - -import android.service.carriermessaging.CarrierMessagingService; +package android.service.carrier; /** * Callback interface definition for the Carrier Messaging Service client to get informed of the * result of various API invocations. + * @hide */ oneway interface ICarrierMessagingCallback { void onFilterComplete(boolean keepMessage); - void onSendSmsComplete( - int result, in CarrierMessagingService.SendSmsResponse sendSmsResponse); - void onSendMultipartSmsComplete( - int result, in List<CarrierMessagingService.SendSmsResponse> sendSmsResponses); + void onSendSmsComplete(int result, int messageRef); + void onSendMultipartSmsComplete(int result, in int[] messageRefs); void onSendMmsComplete(int result, in byte[] sendConfPdu); void onDownloadMmsComplete(int result); } diff --git a/core/java/android/service/carriermessaging/ICarrierMessagingService.aidl b/core/java/android/service/carrier/ICarrierMessagingService.aidl index 6e9e3fa..40a9047 100644 --- a/core/java/android/service/carriermessaging/ICarrierMessagingService.aidl +++ b/core/java/android/service/carrier/ICarrierMessagingService.aidl @@ -14,15 +14,16 @@ * limitations under the License. */ -package android.service.carriermessaging; +package android.service.carrier; import android.net.Uri; -import android.service.carriermessaging.ICarrierMessagingCallback; -import android.service.carriermessaging.MessagePdu; +import android.service.carrier.ICarrierMessagingCallback; +import android.service.carrier.MessagePdu; /** * <p class="note"><strong>Note:</strong> * This service can only be implemented by a carrier privileged app. + * @hide */ oneway interface ICarrierMessagingService { /** @@ -32,10 +33,12 @@ oneway interface ICarrierMessagingService { * @param pdu the PDUs of the message * @param format the format of the PDUs, typically "3gpp" or "3gpp2" * @param destPort the destination port of a data SMS. It will be -1 for text SMS + * @param subId SMS subscription ID of the SIM * @param callback the callback to notify upon completion */ void filterSms( - in MessagePdu pdu, String format, int destPort, in ICarrierMessagingCallback callback); + in MessagePdu pdu, String format, int destPort, int subId, + in ICarrierMessagingCallback callback); /** * Request sending a new text SMS from the device. @@ -43,11 +46,11 @@ oneway interface ICarrierMessagingService { * status. * * @param text the text to send - * @param format the format of the response PDU, typically "3gpp" or "3gpp2" + * @param subId SMS subscription ID of the SIM * @param destAddress phone number of the recipient of the message * @param callback the callback to notify upon completion */ - void sendTextSms(String text, String format, String destAddress, + void sendTextSms(String text, int subId, String destAddress, in ICarrierMessagingCallback callback); /** @@ -56,12 +59,12 @@ oneway interface ICarrierMessagingService { * status. * * @param data the data to send - * @param format the format of the response PDU, typically "3gpp" or "3gpp2" + * @param subId SMS subscription ID of the SIM * @param destAddress phone number of the recipient of the message * @param destPort port number of the recipient of the message * @param callback the callback to notify upon completion */ - void sendDataSms(in byte[] data, String format, String destAddress, int destPort, + void sendDataSms(in byte[] data, int subId, String destAddress, int destPort, in ICarrierMessagingCallback callback); /** @@ -70,11 +73,11 @@ oneway interface ICarrierMessagingService { * with the send status. * * @param parts the parts of the multi-part text SMS to send - * @param format the format of the response PDU, typically "3gpp" or "3gpp2" + * @param subId SMS subscription ID of the SIM * @param destAddress phone number of the recipient of the message * @param callback the callback to notify upon completion */ - void sendMultipartTextSms(in List<String> parts, String format, String destAddress, + void sendMultipartTextSms(in List<String> parts, int subId, String destAddress, in ICarrierMessagingCallback callback); /** @@ -83,11 +86,13 @@ oneway interface ICarrierMessagingService { * status. * * @param pduUri the content provider URI of the PDU to send - * @param locationUrl the optional url to send this MMS PDU. - * If this is not specified, PDU should be sent to the default MMSC url. + * @param subId SMS subscription ID of the SIM + * @param location the optional URI to send this MMS PDU. If this is {code null}, + * the PDU should be sent to the default MMSC URL. * @param callback the callback to notify upon completion */ - void sendMms(in Uri pduUri, String locationUrl, in ICarrierMessagingCallback callback); + void sendMms(in Uri pduUri, int subId, in Uri location, + in ICarrierMessagingCallback callback); /** * Request downloading a new MMS. @@ -95,9 +100,11 @@ oneway interface ICarrierMessagingService { * download status. * * @param pduUri the content provider URI of the PDU to be downloaded. - * @param locationUrl the URL of the message to be downloaded. + * @param subId SMS subscription ID of the SIM + * @param location the URI of the message to be downloaded. * @param callback the callback to notify upon completion */ - void downloadMms(in Uri pduUri, String locationUrl, in ICarrierMessagingCallback callback); + void downloadMms(in Uri pduUri, int subId, in Uri location, + in ICarrierMessagingCallback callback); } diff --git a/core/java/android/service/carriermessaging/MessagePdu.aidl b/core/java/android/service/carrier/MessagePdu.aidl index 82b3fb3..f0528a5 100644 --- a/core/java/android/service/carriermessaging/MessagePdu.aidl +++ b/core/java/android/service/carrier/MessagePdu.aidl @@ -14,6 +14,6 @@ * limitations under the License. */ -package android.service.carriermessaging; +package android.service.carrier; -parcelable MessagePdu;
\ No newline at end of file +parcelable MessagePdu; diff --git a/core/java/android/service/carriermessaging/MessagePdu.java b/core/java/android/service/carrier/MessagePdu.java index 3c78568..ca18e53 100644 --- a/core/java/android/service/carriermessaging/MessagePdu.java +++ b/core/java/android/service/carrier/MessagePdu.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package android.service.carriermessaging; +package android.service.carrier; import android.annotation.NonNull; import android.os.Parcel; diff --git a/core/java/android/service/carriermessaging/CarrierMessagingService.java b/core/java/android/service/carriermessaging/CarrierMessagingService.java deleted file mode 100644 index 7aea590..0000000 --- a/core/java/android/service/carriermessaging/CarrierMessagingService.java +++ /dev/null @@ -1,393 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.service.carriermessaging; - -import android.annotation.NonNull; -import android.annotation.Nullable; -import android.annotation.SdkConstant; -import android.app.Service; -import android.content.Intent; -import android.net.Uri; -import android.os.IBinder; -import android.os.Parcel; -import android.os.Parcelable; -import android.os.RemoteException; - -import java.util.List; - -/** - * A service that receives calls from the system when new SMS and MMS are - * sent or received. - * <p>To extend this class, you must declare the service in your manifest file with - * the {@link android.Manifest.permission#BIND_CARRIER_MESSAGING_SERVICE} permission - * and include an intent filter with the {@link #SERVICE_INTERFACE} action. For example:</p> - * <pre> - * <service android:name=".MyMessagingService" - * android:label="@string/service_name" - * android:permission="android.permission.BIND_CARRIER_MESSAGING_SERVICE"> - * <intent-filter> - * <action android:name="android.service.carriermessaging.CarrierMessagingService" /> - * </intent-filter> - * </service></pre> - */ -public abstract class CarrierMessagingService extends Service { - /** - * The {@link android.content.Intent} that must be declared as handled by the service. - */ - @SdkConstant(SdkConstant.SdkConstantType.SERVICE_ACTION) - public static final String SERVICE_INTERFACE - = "android.service.carriermessaging.CarrierMessagingService"; - - /** - * Indicates that an SMS or MMS message was successfully sent. - */ - public static final int SEND_STATUS_OK = 0; - - /** - * SMS/MMS sending failed. We should retry via the carrier network. - */ - public static final int SEND_STATUS_RETRY_ON_CARRIER_NETWORK = 1; - - /** - * SMS/MMS sending failed. We should not retry via the carrier network. - */ - public static final int SEND_STATUS_ERROR = 2; - - /** - * Successfully downloaded an MMS message. - */ - public static final int DOWNLOAD_STATUS_OK = 0; - - /** - * MMS downloading failed. We should retry via the carrier network. - */ - public static final int DOWNLOAD_STATUS_RETRY_ON_CARRIER_NETWORK = 1; - - /** - * MMS downloading failed. We should not retry via the carrier network. - */ - public static final int DOWNLOAD_STATUS_ERROR = 2; - - private final ICarrierMessagingWrapper mWrapper = new ICarrierMessagingWrapper(); - - /** - * Implement this method to filter SMS messages. - * - * @param pdu the PDUs of the message - * @param format the format of the PDUs, typically "3gpp" or "3gpp2" - * @param destPort the destination port of a binary SMS, this will be -1 for text SMS - * - * @return True to keep an inbound SMS message and delivered to SMS apps. False to - * drop the message. - */ - public boolean onFilterSms(@NonNull MessagePdu pdu, @NonNull String format, int destPort) { - // optional - return true; - } - - /** - * Implement this method to intercept text SMSs sent from the devcie. - * - * @param text the text to send - * @param format the format of the response PDU, typically "3gpp" or "3gpp2" - * @param destAddress phone number of the recipient of the message - * - * @return a possibly {code null} {@link SendSmsResponse}. Upon returning {@code null}, the SMS - * is sent using the carrier network. - */ - public @Nullable SendSmsResponse onSendTextSms( - @NonNull String text, @NonNull String format, @NonNull String destAddress) { - // optional - return null; - } - - /** - * Implement this method to intercept binary SMSs sent from the device. - * - * @param data the binary content - * @param format format the format of the response PDU, typically "3gpp" or "3gpp2" - * @param destAddress phone number of the recipient of the message - * @param destPort the destination port - * - * @return a possibly {code null} {@link SendSmsResponse}. Upon returning {@code null}, the SMS - * is sent using the carrier network. - */ - public @Nullable SendSmsResponse onSendDataSms(@NonNull byte[] data, @NonNull String format, - @NonNull String destAddress, int destPort) { - // optional - return null; - } - - /** - * Implement this method to intercept long SMSs sent from the device. - * - * @param parts a {@link List} of the message parts - * @param format format the format of the response PDU, typically "3gpp" or "3gpp2" - * @param destAddress phone number of the recipient of the message - * - * @return a possibly {code null} {@link List} of {@link SendSmsResponse}, one for each message - * part. Upon returning {@code null}, the SMS is sent using the carrier network. - */ - public @Nullable List<SendSmsResponse> onSendMultipartTextSms(@NonNull List<String> parts, - @NonNull String format, @NonNull String destAddress) { - // optional - return null; - } - - /** - * Implement this method to intercept MMSs sent from the device. - * - * @param pduUri the content provider URI of the PDU to send - * @param locationUrl the optional URL to send this MMS PDU. If this is not specified, - * the PDU should be sent to the default MMSC URL. - * - * @return a possibly {@code null} {@link SendMmsResult}. Upon returning {@code null}, the - * MMS is sent using the carrier network. - */ - public @Nullable SendMmsResult onSendMms(@NonNull Uri pduUri, @Nullable String locationUrl) { - // optional - return null; - } - - /** - * Implement this method to download MMSs received. - * - * @param contentUri the content provider URI of the PDU to be downloaded. - * @param locationUrl the URL of the message to be downloaded. - * - * @return a {@link SendMmsResult}. - */ - public int onDownloadMms(@NonNull Uri contentUri, @NonNull String locationUrl) { - // optional - return DOWNLOAD_STATUS_RETRY_ON_CARRIER_NETWORK; - } - - @Override - public @Nullable IBinder onBind(@NonNull Intent intent) { - if (!SERVICE_INTERFACE.equals(intent.getAction())) { - return null; - } - return mWrapper; - } - - /** - * The result of sending an MMS. - */ - public static final class SendMmsResult { - private int mResult; - private byte[] mSendConfPdu; - - /** - * Constructs a SendMmsResult with the MMS send result, and the SenConf PDU. - * - * @param result the result which is one of {@link #SEND_STATUS_OK}, - * {@link #SEND_STATUS_RETRY_ON_CARRIER_NETWORK}, and - * {@link #SEND_STATUS_ERROR} - * @param sendConfPdu a possibly {code null} SendConf PDU, which confirms that the message - * was sent. sendConfPdu is ignored if the {@code result} is not - * {@link #SEND_STATUS_OK} - */ - public SendMmsResult(int result, @Nullable byte[] sendConfPdu) { - mResult = result; - mSendConfPdu = sendConfPdu; - } - - /** - * Returns the result of sending the MMS. - * - * @return the result which is one of {@link #SEND_STATUS_OK}, - * {@link #SEND_STATUS_RETRY_ON_CARRIER_NETWORK}, and {@link #SEND_STATUS_ERROR} - */ - public int getResult() { - return mResult; - } - - /** - * Returns the SendConf PDU, which confirms that the message was sent. - * - * @return the SendConf PDU - */ - public @Nullable byte[] getSendConfPdu() { - return mSendConfPdu; - } - } - - /** - * Object passed in callbacks upon successful completion of - * {@link ICarrierMessagingService#sendTextSms}, - * {@link ICarrierMessagingService#sendDataSms}, and - * {@link ICarrierMessagingService#sendMultipartTextSms}. - * Contains message reference and ackPdu. - */ - public static final class SendSmsResponse implements Parcelable { - private int mMessageRef; - private byte[] mAckPdu; - private int mErrorCode; - - /** - * Constructs a SendSmsResponse for the message reference, the ack PDU, and error code for - * the just-sent SMS. - * - * @param messageRef message reference of the just-sent SMS - * @param ackPdu ackPdu for the just-sent SMS - * @param errorCode error code. See 3GPP 27.005, 3.2.5 for GSM/UMTS, - * 3GPP2 N.S0005 (IS-41C) Table 171 for CDMA, -1 if unknown or not applicable. - */ - public SendSmsResponse(int messageRef, @NonNull byte[] ackPdu, int errorCode) { - mMessageRef = messageRef; - mAckPdu = ackPdu; - mErrorCode = errorCode; - } - - /** - * Returns the message reference of the just-sent SMS. - * - * @return the message reference - */ - public int getMessageRef() { - return mMessageRef; - } - - /** - * Returns the ackPdu for the just-sent SMS. - * - * @return the ackPdu - */ - public @NonNull byte[] getAckPdu() { - return mAckPdu; - } - - /** - * Returns the error code upon encountering an error while sending the SMS, -1 if unknown or - * not applicable. - * - * @return errorCode the errorCode as defined in 3GPP 27.005, 3.2.5 for GSM/UMTS, and 3GPP2 - * N.S0005 (IS-41C) Table 171 for CDMA, -1 if unknown or not applicable. - */ - public int getErrorCode() { - return mErrorCode; - } - - @Override - public int describeContents() { - return 0; - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeInt(mMessageRef); - dest.writeByteArray(mAckPdu); - dest.writeInt(mErrorCode); - } - - public static final Parcelable.Creator<SendSmsResponse> CREATOR - = new Parcelable.Creator<SendSmsResponse>() { - @Override - public SendSmsResponse createFromParcel(Parcel source) { - return new SendSmsResponse(source.readInt(), - source.createByteArray(), - source.readInt()); - } - - @Override - public SendSmsResponse[] newArray(int size) { - return new SendSmsResponse[size]; - } - }; - } - - /** - * A wrapper around ICarrierMessagingService to enable the carrier messaging APP to implement - * methods it cares about in the {@link ICarrierMessagingService} interface. - */ - private class ICarrierMessagingWrapper extends ICarrierMessagingService.Stub { - @Override - public void filterSms(MessagePdu pdu, String format, int destPort, - ICarrierMessagingCallback callback) { - try { - callback.onFilterComplete(onFilterSms(pdu, format, destPort)); - } catch (RemoteException ex) { - } - } - - @Override - public void sendTextSms(String text, String format, String destAddress, - ICarrierMessagingCallback callback) { - try { - SendSmsResponse sendSmsResponse = onSendTextSms(text, format, destAddress); - if (sendSmsResponse == null) { - callback.onSendSmsComplete(SEND_STATUS_RETRY_ON_CARRIER_NETWORK, null); - } else { - callback.onSendSmsComplete(SEND_STATUS_OK, sendSmsResponse); - } - } catch (RemoteException ex) { - } - } - - @Override - public void sendDataSms(byte[] data, String format, String destAddress, int destPort, - ICarrierMessagingCallback callback) { - try { - SendSmsResponse sendSmsResponse = onSendDataSms(data, format, destAddress, - destPort); - if (sendSmsResponse == null) { - callback.onSendSmsComplete(SEND_STATUS_RETRY_ON_CARRIER_NETWORK, null); - } else { - callback.onSendSmsComplete(SEND_STATUS_OK, sendSmsResponse); - } - } catch (RemoteException ex) { - } - } - - @Override - public void sendMultipartTextSms(List<String> parts, String format, String destAddress, - ICarrierMessagingCallback callback) { - try { - List<SendSmsResponse> sendSmsResponses = - onSendMultipartTextSms(parts, format, destAddress); - if (sendSmsResponses == null) { - callback.onSendMultipartSmsComplete(SEND_STATUS_RETRY_ON_CARRIER_NETWORK, null); - } else { - callback.onSendMultipartSmsComplete(SEND_STATUS_OK, sendSmsResponses); - } - } catch (RemoteException ex) { - } - } - - @Override - public void sendMms(Uri pduUri, String locationUrl, ICarrierMessagingCallback callback) { - try { - SendMmsResult result = onSendMms(pduUri, locationUrl); - if (result == null) { - callback.onSendMmsComplete(SEND_STATUS_RETRY_ON_CARRIER_NETWORK, null); - } else { - callback.onSendMmsComplete(SEND_STATUS_OK, result.getSendConfPdu()); - } - } catch (RemoteException ex) { - } - } - - @Override - public void downloadMms(Uri contentUri, String locationUrl, - ICarrierMessagingCallback callback) { - try { - callback.onDownloadMmsComplete(onDownloadMms(contentUri, locationUrl)); - } catch (RemoteException ex) { - } - } - } -} diff --git a/core/java/android/service/carriermessaging/CarrierMessagingServiceManager.java b/core/java/android/service/carriermessaging/CarrierMessagingServiceManager.java deleted file mode 100644 index 56ee2c1..0000000 --- a/core/java/android/service/carriermessaging/CarrierMessagingServiceManager.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (C) 2014 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.service.carriermessaging; - -import android.content.ComponentName; -import android.content.Context; -import android.content.Intent; -import android.content.ServiceConnection; -import android.os.IBinder; - -import com.android.internal.util.Preconditions; - -/** - * Provides basic structure for platform to connect to the carrier messaging service. - * <p> - * <code> - * CarrierMessagingServiceManager carrierMessagingServiceManager = - * new CarrierMessagingServiceManagerImpl(); - * if (carrierMessagingServiceManager.bindToCarrierMessagingService(context, carrierPackageName)) { - * // wait for onServiceReady callback - * } else { - * // Unable to bind: handle error. - * } - * </code> - * <p> Upon completion {@link #disposeConnection} should be called to unbind the - * CarrierMessagingService. - * @hide - */ -public abstract class CarrierMessagingServiceManager { - // Populated by bindToCarrierMessagingService. bindToCarrierMessagingService must complete - // prior to calling disposeConnection so that mCarrierMessagingServiceConnection is initialized. - private volatile CarrierMessagingServiceConnection mCarrierMessagingServiceConnection; - - /** - * Binds to the carrier messaging service under package {@code carrierPackageName}. This method - * should be called exactly once. - * - * @param context the context - * @param carrierPackageName the carrier package name - * @return true upon successfully binding to a carrier messaging service, false otherwise - */ - public boolean bindToCarrierMessagingService(Context context, String carrierPackageName) { - Preconditions.checkState(mCarrierMessagingServiceConnection == null); - - Intent intent = new Intent(CarrierMessagingService.SERVICE_INTERFACE); - intent.setPackage(carrierPackageName); - mCarrierMessagingServiceConnection = new CarrierMessagingServiceConnection(); - return context.bindService(intent, mCarrierMessagingServiceConnection, - Context.BIND_AUTO_CREATE); - } - - /** - * Unbinds the carrier messaging service. This method should be called exactly once. - * - * @param context the context - */ - public void disposeConnection(Context context) { - Preconditions.checkNotNull(mCarrierMessagingServiceConnection); - context.unbindService(mCarrierMessagingServiceConnection); - mCarrierMessagingServiceConnection = null; - } - - /** - * Implemented by subclasses to use the carrier messaging service once it is ready. - * - * @param carrierMessagingService the carirer messaing service interface - */ - protected abstract void onServiceReady(ICarrierMessagingService carrierMessagingService); - - /** - * A basic {@link ServiceConnection}. - */ - private final class CarrierMessagingServiceConnection implements ServiceConnection { - @Override - public void onServiceConnected(ComponentName name, IBinder service) { - onServiceReady(ICarrierMessagingService.Stub.asInterface(service)); - } - - @Override - public void onServiceDisconnected(ComponentName name) { - } - } -} diff --git a/core/java/android/view/HardwareRenderer.java b/core/java/android/view/HardwareRenderer.java index 904e33f..c5c3f83 100644 --- a/core/java/android/view/HardwareRenderer.java +++ b/core/java/android/view/HardwareRenderer.java @@ -235,7 +235,7 @@ public abstract class HardwareRenderer { * or not the surface used by the HardwareRenderer will be changing. It * Suspends any rendering into the surface, but will not do any destruction */ - abstract void pauseSurface(Surface surface); + abstract boolean pauseSurface(Surface surface); /** * Destroys all hardware rendering resources associated with the specified diff --git a/core/java/android/view/ThreadedRenderer.java b/core/java/android/view/ThreadedRenderer.java index 131c039..14b950f 100644 --- a/core/java/android/view/ThreadedRenderer.java +++ b/core/java/android/view/ThreadedRenderer.java @@ -155,8 +155,8 @@ public class ThreadedRenderer extends HardwareRenderer { } @Override - void pauseSurface(Surface surface) { - nPauseSurface(mNativeProxy, surface); + boolean pauseSurface(Surface surface) { + return nPauseSurface(mNativeProxy, surface); } @Override @@ -494,7 +494,7 @@ public class ThreadedRenderer extends HardwareRenderer { private static native boolean nInitialize(long nativeProxy, Surface window); private static native void nUpdateSurface(long nativeProxy, Surface window); - private static native void nPauseSurface(long nativeProxy, Surface window); + private static native boolean nPauseSurface(long nativeProxy, Surface window); private static native void nSetup(long nativeProxy, int width, int height, float lightX, float lightY, float lightZ, float lightRadius, int ambientShadowAlpha, int spotShadowAlpha); diff --git a/core/java/android/view/ViewRootImpl.java b/core/java/android/view/ViewRootImpl.java index b12c747..34c27d7 100644 --- a/core/java/android/view/ViewRootImpl.java +++ b/core/java/android/view/ViewRootImpl.java @@ -1493,7 +1493,11 @@ public final class ViewRootImpl implements ViewParent, // relayoutWindow may decide to destroy mSurface. As that decision // happens in WindowManager service, we need to be defensive here // and stop using the surface in case it gets destroyed. - mAttachInfo.mHardwareRenderer.pauseSurface(mSurface); + if (mAttachInfo.mHardwareRenderer.pauseSurface(mSurface)) { + // Animations were running so we need to push a frame + // to resume them + mDirty.set(0, 0, mWidth, mHeight); + } } final int surfaceGenerationId = mSurface.getGenerationId(); relayoutResult = relayoutWindow(params, viewVisibility, insetsPending); diff --git a/core/java/com/android/internal/app/IAppOpsService.aidl b/core/java/com/android/internal/app/IAppOpsService.aidl index a52dd48..99bf9f3 100644 --- a/core/java/com/android/internal/app/IAppOpsService.aidl +++ b/core/java/com/android/internal/app/IAppOpsService.aidl @@ -36,7 +36,7 @@ interface IAppOpsService { List<AppOpsManager.PackageOps> getPackagesForOps(in int[] ops); List<AppOpsManager.PackageOps> getOpsForPackage(int uid, String packageName, in int[] ops); void setMode(int code, int uid, String packageName, int mode); - void resetAllModes(); + void resetAllModes(int reqUserId, String reqPackageName); int checkAudioOperation(int code, int usage, int uid, String packageName); void setAudioRestriction(int code, int usage, int uid, int mode, in String[] exceptionPackages); diff --git a/core/jni/android_view_ThreadedRenderer.cpp b/core/jni/android_view_ThreadedRenderer.cpp index 6219956..b9d849c 100644 --- a/core/jni/android_view_ThreadedRenderer.cpp +++ b/core/jni/android_view_ThreadedRenderer.cpp @@ -270,14 +270,14 @@ static void android_view_ThreadedRenderer_updateSurface(JNIEnv* env, jobject cla proxy->updateSurface(window); } -static void android_view_ThreadedRenderer_pauseSurface(JNIEnv* env, jobject clazz, +static jboolean android_view_ThreadedRenderer_pauseSurface(JNIEnv* env, jobject clazz, jlong proxyPtr, jobject jsurface) { RenderProxy* proxy = reinterpret_cast<RenderProxy*>(proxyPtr); sp<ANativeWindow> window; if (jsurface) { window = android_view_Surface_getNativeWindow(env, jsurface); } - proxy->pauseSurface(window); + return proxy->pauseSurface(window); } static void android_view_ThreadedRenderer_setup(JNIEnv* env, jobject clazz, jlong proxyPtr, @@ -429,7 +429,7 @@ static JNINativeMethod gMethods[] = { { "nLoadSystemProperties", "(J)Z", (void*) android_view_ThreadedRenderer_loadSystemProperties }, { "nInitialize", "(JLandroid/view/Surface;)Z", (void*) android_view_ThreadedRenderer_initialize }, { "nUpdateSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_updateSurface }, - { "nPauseSurface", "(JLandroid/view/Surface;)V", (void*) android_view_ThreadedRenderer_pauseSurface }, + { "nPauseSurface", "(JLandroid/view/Surface;)Z", (void*) android_view_ThreadedRenderer_pauseSurface }, { "nSetup", "(JIIFFFFII)V", (void*) android_view_ThreadedRenderer_setup }, { "nSetOpaque", "(JZ)V", (void*) android_view_ThreadedRenderer_setOpaque }, { "nSyncAndDrawFrame", "(JJJF)I", (void*) android_view_ThreadedRenderer_syncAndDrawFrame }, diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml index dec7f07..3dd9770 100644 --- a/core/res/AndroidManifest.xml +++ b/core/res/AndroidManifest.xml @@ -2910,7 +2910,7 @@ android:description="@string/permdesc_removeDrmCertificates" android:protectionLevel="signature|system" /> - <!-- Must be required by a {@link android.service.carriermessaging.CarrierMessagingService}. + <!-- Must be required by a {@link android.service.carrier.CarrierMessagingService}. Any service that filters for this intent must be a carrier privileged app. --> <permission android:name="android.permission.BIND_CARRIER_MESSAGING_SERVICE" android:label="@string/permlab_bindCarrierMessagingService" diff --git a/core/res/res/values-mcc310-mnc120/config.xml b/core/res/res/values-mcc310-mnc120/config.xml index 774732d..4b61688 100644 --- a/core/res/res/values-mcc310-mnc120/config.xml +++ b/core/res/res/values-mcc310-mnc120/config.xml @@ -31,4 +31,31 @@ <!-- If this value is true, The mms content-disposition field is supported correctly. If false, Content-disposition fragments are ignored --> <bool name="config_mms_content_disposition_support">false</bool> + + <!-- An array of CDMA roaming indicators which means international roaming --> + <integer-array translatable="false" name="config_cdma_international_roaming_indicators" > + <item>2</item> + <item>74</item> + <item>124</item> + <item>125</item> + <item>126</item> + <item>157</item> + <item>158</item> + <item>159</item> + <item>193</item> + <item>194</item> + <item>195</item> + <item>196</item> + <item>197</item> + <item>198</item> + <item>228</item> + <item>229</item> + <item>230</item> + <item>231</item> + <item>232</item> + <item>233</item> + <item>234</item> + <item>235</item> + </integer-array> + </resources> diff --git a/core/res/res/values-mcc311-mnc490/config.xml b/core/res/res/values-mcc311-mnc490/config.xml index defe78d..d481c97 100644 --- a/core/res/res/values-mcc311-mnc490/config.xml +++ b/core/res/res/values-mcc311-mnc490/config.xml @@ -23,4 +23,31 @@ <!-- Sprint need a 70 ms delay for 3way call --> <integer name="config_cdma_3waycall_flash_delay">70</integer> + + <!-- An array of CDMA roaming indicators which means international roaming --> + <integer-array translatable="false" name="config_cdma_international_roaming_indicators" > + <item>2</item> + <item>74</item> + <item>124</item> + <item>125</item> + <item>126</item> + <item>157</item> + <item>158</item> + <item>159</item> + <item>193</item> + <item>194</item> + <item>195</item> + <item>196</item> + <item>197</item> + <item>198</item> + <item>228</item> + <item>229</item> + <item>230</item> + <item>231</item> + <item>232</item> + <item>233</item> + <item>234</item> + <item>235</item> + </integer-array> + </resources> diff --git a/core/res/res/values-mcc311-mnc870/config.xml b/core/res/res/values-mcc311-mnc870/config.xml index 24e55b1..98cb72e 100644 --- a/core/res/res/values-mcc311-mnc870/config.xml +++ b/core/res/res/values-mcc311-mnc870/config.xml @@ -27,4 +27,31 @@ <!-- Sprint need a 70 ms delay for 3way call --> <integer name="config_cdma_3waycall_flash_delay">70</integer> + + <!-- An array of CDMA roaming indicators which means international roaming --> + <integer-array translatable="false" name="config_cdma_international_roaming_indicators" > + <item>2</item> + <item>74</item> + <item>124</item> + <item>125</item> + <item>126</item> + <item>157</item> + <item>158</item> + <item>159</item> + <item>193</item> + <item>194</item> + <item>195</item> + <item>196</item> + <item>197</item> + <item>198</item> + <item>228</item> + <item>229</item> + <item>230</item> + <item>231</item> + <item>232</item> + <item>233</item> + <item>234</item> + <item>235</item> + </integer-array> + </resources> diff --git a/core/res/res/values-mcc312-mnc530/config.xml b/core/res/res/values-mcc312-mnc530/config.xml index 24e55b1..98cb72e 100644 --- a/core/res/res/values-mcc312-mnc530/config.xml +++ b/core/res/res/values-mcc312-mnc530/config.xml @@ -27,4 +27,31 @@ <!-- Sprint need a 70 ms delay for 3way call --> <integer name="config_cdma_3waycall_flash_delay">70</integer> + + <!-- An array of CDMA roaming indicators which means international roaming --> + <integer-array translatable="false" name="config_cdma_international_roaming_indicators" > + <item>2</item> + <item>74</item> + <item>124</item> + <item>125</item> + <item>126</item> + <item>157</item> + <item>158</item> + <item>159</item> + <item>193</item> + <item>194</item> + <item>195</item> + <item>196</item> + <item>197</item> + <item>198</item> + <item>228</item> + <item>229</item> + <item>230</item> + <item>231</item> + <item>232</item> + <item>233</item> + <item>234</item> + <item>235</item> + </integer-array> + </resources> diff --git a/core/res/res/values-mcc415-mnc01/config.xml b/core/res/res/values-mcc415-mnc01/config.xml new file mode 100644 index 0000000..95d30a4 --- /dev/null +++ b/core/res/res/values-mcc415-mnc01/config.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<resources> + <bool name="config_use_sim_language_file">false</bool> +</resources> diff --git a/core/res/res/values-mcc416-mnc77/config.xml b/core/res/res/values-mcc416-mnc77/config.xml new file mode 100644 index 0000000..95d30a4 --- /dev/null +++ b/core/res/res/values-mcc416-mnc77/config.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<resources> + <bool name="config_use_sim_language_file">false</bool> +</resources> diff --git a/core/res/res/values-mcc432-mnc20/config.xml b/core/res/res/values-mcc432-mnc20/config.xml new file mode 100644 index 0000000..95d30a4 --- /dev/null +++ b/core/res/res/values-mcc432-mnc20/config.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/* +** Copyright 2014, The Android Open Source Project +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +*/ +--> +<resources> + <bool name="config_use_sim_language_file">false</bool> +</resources> diff --git a/core/res/res/values/config.xml b/core/res/res/values/config.xml index cdbee61..926b53e 100755 --- a/core/res/res/values/config.xml +++ b/core/res/res/values/config.xml @@ -1952,4 +1952,11 @@ <dimen name="config_mediaMetadataBitmapMaxSize">320dp</dimen> <string translatable="false" name="prohibit_manual_network_selection_in_gobal_mode">false</string> + + <!-- An array of CDMA roaming indicators which means international roaming --> + <integer-array translatable="false" name="config_cdma_international_roaming_indicators" /> + + + <!-- set the system language as value of EF LI/EF PL --> + <bool name="config_use_sim_language_file">true</bool> </resources> diff --git a/core/res/res/values/dimens_material.xml b/core/res/res/values/dimens_material.xml index f7ebbe4..dd1f815 100644 --- a/core/res/res/values/dimens_material.xml +++ b/core/res/res/values/dimens_material.xml @@ -87,9 +87,9 @@ <dimen name="floating_window_margin_bottom">32dp</dimen> <!-- Elevation when button is pressed --> - <dimen name="button_elevation_material">1dp</dimen> + <dimen name="button_elevation_material">4dp</dimen> <!-- Z translation to apply when button is pressed --> - <dimen name="button_pressed_z_material">2dp</dimen> + <dimen name="button_pressed_z_material">6dp</dimen> <!-- Default insets (outer padding) around buttons --> <dimen name="button_inset_vertical_material">6dp</dimen> <dimen name="button_inset_horizontal_material">@dimen/control_inset_material</dimen> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index a9123d1..e861ab2 100755 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2138,5 +2138,7 @@ <java-symbol type="string" name="system_error_wipe_data" /> <java-symbol type="string" name="system_error_manufacturer" /> <java-symbol type="dimen" name="fast_scroller_minimum_touch_target" /> + <java-symbol type="array" name="config_cdma_international_roaming_indicators" /> + <java-symbol type="bool" name="config_use_sim_language_file" /> </resources> diff --git a/data/keyboards/Vendor_046d_Product_b501.kl b/data/keyboards/Vendor_046d_Product_b501.kl new file mode 100644 index 0000000..496ddc3 --- /dev/null +++ b/data/keyboards/Vendor_046d_Product_b501.kl @@ -0,0 +1,65 @@ +# Copyright (C) 2014 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Logitech Bluetooth wireless gamepad (RedHawk) + +key 304 BUTTON_A +key 305 BUTTON_B +key 307 BUTTON_X +key 308 BUTTON_Y +key 310 BUTTON_L1 +key 311 BUTTON_R1 +key 312 BUTTON_L2 +key 313 BUTTON_R2 + +key 314 BUTTON_SELECT +key 315 BUTTON_START +key 316 BUTTON_MODE +key 317 BUTTON_THUMBL +key 318 BUTTON_THUMBR + +key 103 DPAD_UP +key 105 DPAD_LEFT +key 106 DPAD_RIGHT +key 108 DPAD_DOWN +key 353 DPAD_CENTER + +key 113 VOLUME_MUTE +key 114 VOLUME_DOWN +key 115 VOLUME_UP +key 152 POWER +key 163 MEDIA_NEXT +key 164 MEDIA_PLAY_PAUSE +key 165 MEDIA_PREVIOUS + +key 158 BACK +key 172 HOME + +key 217 SEARCH +key 580 APP_SWITCH +key 582 ASSIST + +axis 0x00 X +axis 0x01 Y +axis 0x02 Z +axis 0x05 RZ +axis 0x09 RTRIGGER +axis 0x0a LTRIGGER +axis 0x10 HAT_X +axis 0x11 HAT_Y + +led 0x00 CONTROLLER_1 +led 0x01 CONTROLLER_2 +led 0x02 CONTROLLER_3 +led 0x03 CONTROLLER_4 diff --git a/data/keyboards/Vendor_1532_Product_0900.kl b/data/keyboards/Vendor_1532_Product_0900.kl new file mode 100644 index 0000000..c2fc1b4 --- /dev/null +++ b/data/keyboards/Vendor_1532_Product_0900.kl @@ -0,0 +1,42 @@ +# Copyright (C) 2014 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Razer Serval + +key 304 BUTTON_A +key 305 BUTTON_B +key 307 BUTTON_X +key 308 BUTTON_Y +key 310 BUTTON_L1 +key 311 BUTTON_R1 +key 316 BUTTON_MODE +key 317 BUTTON_THUMBL +key 318 BUTTON_THUMBR + +key 158 BACK +key 172 HOME + +axis 0x00 X +axis 0x01 Y +axis 0x02 Z +axis 0x05 RZ +axis 0x09 RTRIGGER +axis 0x0a LTRIGGER +axis 0x10 HAT_X +axis 0x11 HAT_Y + +led 0x00 CONTROLLER_1 +led 0x01 CONTROLLER_2 +led 0x02 CONTROLLER_3 +led 0x03 CONTROLLER_4 diff --git a/docs/html/guide/topics/manifest/uses-feature-element.jd b/docs/html/guide/topics/manifest/uses-feature-element.jd index 775c424..59bf71c 100644 --- a/docs/html/guide/topics/manifest/uses-feature-element.jd +++ b/docs/html/guide/topics/manifest/uses-feature-element.jd @@ -560,7 +560,7 @@ is sensitive to delays or lag in sound input or output.</td> <td></td> </tr> <tr> - <td rowspan="12">Camera</td> + <td rowspan="10">Camera</td> <td><code>android.hardware.camera</code></td> <td>The application uses the device's camera. If the device supports multiple cameras, the application uses the camera that facing @@ -609,14 +609,6 @@ external camera device if one is connected. Use this in preference to <td><code>android.hardware.camera.capability.raw</code></td> <td>The application uses a a camera device with the <code>RAW</code> capability.</td> </tr> -<tr> - <td><code>android.hardware.camera.capability.burst_capture</code></td> - <td>The application uses a a camera device with the <code>BURST_CAPTURE</code> capability.</td> -</tr> -<tr> - <td><code>android.hardware.camera.capability.read_sensor_settings</code></td> - <td>The application uses a a camera device with the <code>READ_SENSOR_SETTINGS</code> capability.</td> -</tr> <tr> <td>Infrared</td> diff --git a/docs/html/samples/admin.jd b/docs/html/samples/admin.jd new file mode 100644 index 0000000..c6637d8 --- /dev/null +++ b/docs/html/samples/admin.jd @@ -0,0 +1,11 @@ +page.title=Admin +@jd:body + + +<div id="samples" class="admin"> +</div> + + +<script> + $(document).ready(showSamples); +</script> diff --git a/docs/html/samples/new/index.jd b/docs/html/samples/new/index.jd index ba75072..279b910 100644 --- a/docs/html/samples/new/index.jd +++ b/docs/html/samples/new/index.jd @@ -2,19 +2,18 @@ page.title=What's New @jd:body -<p>The following code samples were recently published for the L Developer Preview. You can +<p>The following code samples were recently published. You can download them in the Android SDK Manager under the <b>SDK Samples</b> component -for the L Developer Preview.</p> +for API 21.</p> <p class="note"> - <strong>Note:</strong> At this time, the downloadable projects are designed + <strong>Note:</strong> The downloadable projects are designed for use with Gradle and Android Studio. </p> - <!-- NOTE TO EDITORS: add most recent samples first --> -<h3 id="MediaBrowserService">Media Browser Service</h3> +<h3 id="MediaBrowserService"><a href="/samples/MediaBrowserService/index.html">Media Browser Service</a></h3> <p> This sample is a simple audio media app that exposes its media @@ -29,10 +28,8 @@ when not connected to a car. href="http://android.com/auto">Android Auto</a>. </p> -<p><a href="http://github.com/googlesamples/android-MediaBrowserService">Get it on GitHub</a></p> - -<h3 id="MessagingService">Messaging Service</h3> +<h3 id="MessagingService"><a href="/samples/MessagingService/index.html">Messaging Service</a></h3> <p> This sample shows a simple service that sends notifications using @@ -46,10 +43,8 @@ Each unread conversation from a user is sent as a distinct notification. href="http://android.com/auto">Android Auto</a>. </p> -<p><a href="http://github.com/googlesamples/android-MessagingService">Get it on GitHub</a></p> - -<h3 id="SpeedTracker">Speed Tracker (Wear)</h3> +<h3 id="SpeedTracker"><a href="/samples/SpeedTracker/index.html">Speed Tracker (Wear)</a></h3> <p> This sample uses the FusedLocation APIs of Google Play Services on Android Wear @@ -62,10 +57,8 @@ is synced with the phone component of the app and user can see a track made of those coordinates on a map on the phone. </p> -<p><a href="http://github.com/googlesamples/android-SpeedTracker">Get it on GitHub</a></p> - -<h3 id="AppRestrictionSchema">AppRestrictionSchema</h3> +<h3 id="AppRestrictionSchema"><a href="/samples/AppRestrictionSchema/index.html">AppRestrictionSchema</a></h3> <p> This sample shows how to use app restrictions. This application has one boolean @@ -74,29 +67,23 @@ app (press the button to show "Hello" message) is enabled or disabled. Use AppRestrictionEnforcer sample to toggle the restriction. </p> -<p><a href="http://github.com/googlesamples/android-AppRestrictionSchema">Get it on GitHub</a></p> - -<h3 id="AppRestrictionEnforcer">AppRestrictionEnforcer</h3> +<h3 id="AppRestrictionEnforcer"><a href="/samples/AppRestrictionEnforcer/index.html">AppRestrictionEnforcer</a></h3> <p> This sample demonstrates how to set restrictions to other apps as a profile owner. Use AppRestrictionSchema sample as a app with available restrictions. </p> -<p><a href="http://github.com/googlesamples/android-AppRestrictionEnforcer">Get it on GitHub</a></p> - -<h3 id="DocumentCentricRelinquishIdentity">DocumentCentricRelinquishIdentity</h3> +<h3 id="DocumentCentricRelinquishIdentity"><a href="/samples/DocumentCentricRelinquishIdentity/index.html">DocumentCentricRelinquishIdentity</a></h3> <p> This sample shows how to relinquish identity to activities above it in the task stack. </p> -<p><a href="http://github.com/googlesamples/android-DocumentCentricRelinquishIdentity">Get it on GitHub</a></p> - -<h3 id="DocumentCentricApps">DocumentCentricApps</h3> +<h3 id="DocumentCentricApps"><a href="/samples/DocumentCentricApps/index.html">DocumentCentricApps</a></h3> <p> This sample shows the basic usage of the new "Document Centric Apps" API. @@ -105,10 +92,8 @@ state through reboots. If "Task per document" is checked a new task will be created for every new document in the overview menu. </p> -<p><a href="http://github.com/googlesamples/android-DocumentCentricApps">Get it on GitHub</a></p> - -<h3 id="HdrViewfinder">HdrViewfinder</h3> +<h3 id="HdrViewfinder"><a href="/samples/HdrViewfinder/index.html">HdrViewfinder</a></h3> <p> This demo implements a real-time high-dynamic-range camera viewfinder, by alternating @@ -116,10 +101,8 @@ the sensor's exposure time between two exposure values on even and odd frames, a compositing together the latest two frames whenever a new frame is captured. </p> -<p><a href="http://github.com/googlesamples/android-HdrViewfinder">Get it on GitHub</a></p> - -<h3 id="Interpolator">Interpolator</h3> +<h3 id="Interpolator"><a href="/samples/Interpolator/index.html">Interpolator</a></h3> <p> This sample demonstrates the use of animation interpolators and path animations for @@ -127,10 +110,8 @@ Material Design. It shows how an ObjectAnimator is used to animate two propertie view (scale X and Y) along a path. </p> -<p><a href="http://github.com/googlesamples/android-Interpolator">Get it on GitHub</a></p> - -<h3 id="DrawableTinting">DrawableTinting</h3> +<h3 id="DrawableTinting"><a href="/samples/DrawableTinting/index.html">DrawableTinting</a></h3> <p>Sample that shows applying tinting and color filters to Drawables both programmatically and as Drawable resources in XML.</p> @@ -141,54 +122,43 @@ states of a View (for example disabled/enabled, focused, pressed or selected).</ with a reference to a color and a PorterDuff blend mode. The color and blend mode can be changed from the UI to see the effect of different options.</p> -<p><a href="http://github.com/googlesamples/android-DrawableTinting">Get it on GitHub</a></p> - -<h3 id="LNotifications">LNotifications</h3> +<h3 id="LNotifications"><a href="/samples/LNotifications/index.html">LNotifications</a></h3> <p> This sample demonstrates how new features for notifications introduced in Android 5.0 are used such as Heads-Up notifications, visibility, people, category and priority metadata. </p> -<p><a href="http://github.com/googlesamples/android-LNotifications">Get it on GitHub</a></p> -<h3 id="CardView">CardView</h3> +<h3 id="CardView"><a href="/samples/CardView/index.html">CardView</a></h3> <p> This sample demonstrates how to use the CardView UI widget introduced in Android 5.0, using the support library for backward compatibility. </p> -<p><a href="http://github.com/googlesamples/android-CardView">Get it on GitHub</a></p> - -<h3 id="RecyclerView">RecyclerView</h3> +<h3 id="RecyclerView"><a href="/samples/RecyclerView/index.html">RecyclerView</a></h3> <p> Demonstration of using RecyclerView with a LayoutManager to create a vertical ListView. </p> -<p><a href="http://github.com/googlesamples/android-RecyclerView">Get it on GitHub</a></p> - -<h3 id="RevealEffectBasic">RevealEffectBasic</h3> +<h3 id="RevealEffectBasic"><a href="/samples/RevealEffectBasic/index.html">RevealEffectBasic</a></h3> <p> A sample demonstrating how to perform a reveal effect for UI elements within the Material Design framework. </p> -<p><a href="http://github.com/googlesamples/android-RevealEffectBasic">Get it on GitHub</a></p> - -<h3 id="FloatingActionButtonBasic">FloatingActionButtonBasic</h3> +<h3 id="FloatingActionButtonBasic"><a href="/samples/FloatingActionButtonBasic/index.html">FloatingActionButtonBasic</a></h3> <p> This sample shows the two sizes of Floating Action Buttons and how to interact with them. </p> -<p><a href="http://github.com/googlesamples/android-FloatingActionButtonBasic">Get it on GitHub</a></p> - <!-- <h3 id="">SampleName</h3> @@ -205,36 +175,15 @@ them. </p> --> - -<h3 id="NavigationDrawerSample">NavigationDrawerSample</h3> -<!-- -<div class="figure" style="width:220px"> - <img src="" srcset="@2x.png 2x" alt="" height="375" /> - <p class="img-caption"> - <strong>Figure n.</strong> Single sentence summarizing the figure. - </p> -</div> ---> - -<p> -This sample illustrates a common usage of the Android support library's -{@link android.support.v4.widget.DrawerLayout} widget. -</p> - -<p><a href="http://github.com/googlesamples/android-NavigationDrawer">Get it on GitHub</a></p> - - -<h3 id="JobSchedulerSample">JobSchedulerSample</h3> +<h3 id="JobSchedulerSample"><a href="/samples/JobScheduler/index.html">JobScheduler</a></h3> <p> This sample app allows the user to schedule jobs through the UI, and shows visual cues when the jobs are executed. </p> -<p><a href="http://github.com/googlesamples/android-JobScheduler">Get it on GitHub</a></p> - -<h3 id="AndroidTVLeanbackSample">AndroidTVLeanbackSample</h3> +<h3 id="AndroidTVLeanbackSample"><a href="https://github.com/googlesamples/androidtv-leanback">AndroidTVLeanbackSample</a></h3> <!-- <div class="figure" style="width:220px"> <img src="" srcset="@2x.png 2x" alt="" height="375" /> @@ -248,10 +197,7 @@ visual cues when the jobs are executed. This sample demonstrates use of the Android TV Leanback Support Library. </p> -<p><a href="http://github.com/googlesamples/androidtv-Leanback">Get it on GitHub</a></p> - - -<h3 id="Visual-Game-Controller">Visual-Game-Controller</h3> +<h3 id="Visual-Game-Controller"><a href="https://github.com/googlesamples/androidtv-VisualGameController">Visual-Game-Controller</a></h3> <!-- <div class="figure" style="width:220px"> <img src="" srcset="@2x.png 2x" alt="" height="375" /> @@ -265,10 +211,8 @@ This sample demonstrates use of the Android TV Leanback Support Library. This sample displays events received from a game controller shown on the screen. </p> -<p><a href="http://github.com/googlesamples/androidtv-VisualGameController">Get it on GitHub</a></p> - -<h3 id="GameControllerSample">GameControllerSample</h3> +<h3 id="GameControllerSample"><a href="https://github.com/googlesamples/androidtv-GameController/">GameControllerSample</a></h3> <!-- <div class="figure" style="width:220px"> <img src="" srcset="@2x.png 2x" alt="" height="375" /> @@ -283,10 +227,8 @@ This sample implements a multi-player game, demonstrating game controller input handling. </p> -<p><a href="http://github.com/googlesamples/androidtv-GameController">Get it on GitHub</a></p> - -<h3 id="ClippingBasic">ClippingBasic</h3> +<h3 id="ClippingBasic"><a href="/samples/ClippingBasic/index.html">ClippingBasic</a></h3> <!-- <div class="figure" style="width:220px"> <img src="" srcset="@2x.png 2x" alt="" height="375" /> @@ -300,19 +242,17 @@ handling. This sample demonstrates clipping on a {@link android.view.View}. </p> -<p><a href="http://github.com/googlesamples/android-ClippingBasic">Get it on GitHub</a></p> - <div class="figure" style="width:220px"> <img src="{@docRoot}samples/images/JobSchedulerSample.png" srcset="{@docRoot}samples/images/JobSchedulerSample@2x.png 2x" alt="" height="375" /> <p class="img-caption"> - <strong>Figure 3.</strong> The JobSchedulerSample sample app. + <strong>Figure 1.</strong> The JobSchedulerSample sample app. </p> </div> -<h3 id="ElevationDrag">ElevationDrag</h3> +<h3 id="ElevationDrag"><a href="/samples/ElevationDrag/index.html">ElevationDrag</a></h3> <!-- <div class="figure" style="width:220px"> <img src="" srcset="@2x.png 2x" alt="" height="375" /> @@ -326,10 +266,8 @@ This sample demonstrates clipping on a {@link android.view.View}. Elevation and z-translation are used to render the shadows. The views are clipped using different outlines.</p> -<p><a href="http://github.com/googlesamples/android-ElevationDrag">Get it on GitHub</a></p> - -<h3 id="ElevationBasic">ElevationBasic</h3> +<h3 id="ElevationBasic"><a href="/samples/ElevationBasic/index.html">ElevationBasic</a></h3> <!-- <div class="figure" style="width:220px"> <img src="" srcset="@2x.png 2x" alt="" height="375" /> @@ -348,10 +286,8 @@ This sample demonstrates two alternative ways to move a view in the z-axis:</p> <code>setTranslationZ()</code>.</li> </ul> -<p><a href="http://github.com/googlesamples/android-ElevationBasic">Get it on GitHub</a></p> - -<h3 id="ActivitySceneTransitionBasic">ActivitySceneTransitionBasic</h3> +<h3 id="ActivitySceneTransitionBasic"><a href="/samples/ActivitySceneTransitionBasic/index.html">ActivitySceneTransitionBasic</a></h3> <div class="figure" style="width:220px"> <img src="{@docRoot}samples/images/ActivitySceneTransitionBasic.png" srcset="{@docRoot}samples/images/ActivitySceneTransitionBasic@2x.png 2x" @@ -366,10 +302,8 @@ transitions when transitioning from one activity to another. Uses a combination of <code>moveImage</code> and <code>changeBounds</code> to nicely transition from a grid of images to an activity with a large image and detail text. </p> -<p><a href="http://github.com/googlesamples/android-ActivitySceneTransition">Get it on GitHub</a></p> - -<h3 id="Camera2Video">Camera2Video</h3> +<h3 id="Camera2Video"><a href="/samples/Camera2Video/index.html">Camera2Video</a></h3> <!-- <div class="figure" style="width:220px"> <img src="" srcset="@2x.png 2x" alt="" height="375" /> @@ -381,10 +315,8 @@ from a grid of images to an activity with a large image and detail text. </p> <p>This sample demonstrates how to record video using the Camera2 API.</p> -<p><a href="http://github.com/googlesamples/android-Camera2Video">Get it on GitHub</a></p> - -<h3 id="Camera2Basic">Camera2Basic</h3> +<h3 id="Camera2Basic"><a href="/samples/Camera2Basic/index.html">Camera2Basic</a></h3> <!-- <div class="figure" style="width:220px"> @@ -398,16 +330,14 @@ from a grid of images to an activity with a large image and detail text. </p> <p>This sample demonstrates the basic use of the Camera2 API. The sample code demonstrates how you can display camera preview and take pictures.</p> -<p><a href="http://github.com/googlesamples/android-Camera2Basic">Get it on GitHub</a></p> - -<h3 id="BasicManagedProfile">BasicManagedProfile</h3> +<h3 id="BasicManagedProfile"><a href="/samples/BasicManagedProfile/index.html">BasicManagedProfile</a></h3> <div class="figure" style="width:220px"> <img src="{@docRoot}samples/images/BasicManagedProfile.png" srcset="{@docRoot}samples/images/BasicManagedProfile@2x.png 2x" alt="" height="375" /> <p class="img-caption"> - <strong>Figure 1.</strong> The BasicManagedProfile sample app. + <strong>Figure 3.</strong> The BasicManagedProfile sample app. </p> </div> @@ -422,5 +352,3 @@ demonstrates how you can display camera preview and take pictures.</p> <p class="note"><strong>Note:</strong> There can be only one managed profile on a device at a time.</p> -<p><a href="http://github.com/googlesamples/android-BasicManagedProfile">Get it on GitHub</a></p> - diff --git a/libs/hwui/renderthread/CanvasContext.cpp b/libs/hwui/renderthread/CanvasContext.cpp index aa32541..75bd067 100644 --- a/libs/hwui/renderthread/CanvasContext.cpp +++ b/libs/hwui/renderthread/CanvasContext.cpp @@ -123,8 +123,8 @@ void CanvasContext::updateSurface(ANativeWindow* window) { setSurface(window); } -void CanvasContext::pauseSurface(ANativeWindow* window) { - stopDrawing(); +bool CanvasContext::pauseSurface(ANativeWindow* window) { + return mRenderThread.removeFrameCallback(this); } // TODO: don't pass viewport size, it's automatic via EGL diff --git a/libs/hwui/renderthread/CanvasContext.h b/libs/hwui/renderthread/CanvasContext.h index 435244e..0cc2c7c 100644 --- a/libs/hwui/renderthread/CanvasContext.h +++ b/libs/hwui/renderthread/CanvasContext.h @@ -67,7 +67,7 @@ public: bool initialize(ANativeWindow* window); void updateSurface(ANativeWindow* window); - void pauseSurface(ANativeWindow* window); + bool pauseSurface(ANativeWindow* window); bool hasSurface() { return mNativeWindow.get(); } void setup(int width, int height, const Vector3& lightCenter, float lightRadius, diff --git a/libs/hwui/renderthread/RenderProxy.cpp b/libs/hwui/renderthread/RenderProxy.cpp index 5d55ea6..6d063a4 100644 --- a/libs/hwui/renderthread/RenderProxy.cpp +++ b/libs/hwui/renderthread/RenderProxy.cpp @@ -156,15 +156,14 @@ void RenderProxy::updateSurface(const sp<ANativeWindow>& window) { } CREATE_BRIDGE2(pauseSurface, CanvasContext* context, ANativeWindow* window) { - args->context->pauseSurface(args->window); - return NULL; + return (void*) args->context->pauseSurface(args->window); } -void RenderProxy::pauseSurface(const sp<ANativeWindow>& window) { +bool RenderProxy::pauseSurface(const sp<ANativeWindow>& window) { SETUP_TASK(pauseSurface); args->context = mContext; args->window = window.get(); - postAndWait(task); + return (bool) postAndWait(task); } CREATE_BRIDGE7(setup, CanvasContext* context, int width, int height, diff --git a/libs/hwui/renderthread/RenderProxy.h b/libs/hwui/renderthread/RenderProxy.h index 4989b14..fd1fe05 100644 --- a/libs/hwui/renderthread/RenderProxy.h +++ b/libs/hwui/renderthread/RenderProxy.h @@ -69,7 +69,7 @@ public: ANDROID_API bool initialize(const sp<ANativeWindow>& window); ANDROID_API void updateSurface(const sp<ANativeWindow>& window); - ANDROID_API void pauseSurface(const sp<ANativeWindow>& window); + ANDROID_API bool pauseSurface(const sp<ANativeWindow>& window); ANDROID_API void setup(int width, int height, const Vector3& lightCenter, float lightRadius, uint8_t ambientShadowAlpha, uint8_t spotShadowAlpha); ANDROID_API void setOpaque(bool opaque); diff --git a/libs/hwui/renderthread/RenderThread.cpp b/libs/hwui/renderthread/RenderThread.cpp index f887103..38cb4cd 100644 --- a/libs/hwui/renderthread/RenderThread.cpp +++ b/libs/hwui/renderthread/RenderThread.cpp @@ -314,9 +314,11 @@ void RenderThread::postFrameCallback(IFrameCallback* callback) { mPendingRegistrationFrameCallbacks.insert(callback); } -void RenderThread::removeFrameCallback(IFrameCallback* callback) { - mFrameCallbacks.erase(callback); - mPendingRegistrationFrameCallbacks.erase(callback); +bool RenderThread::removeFrameCallback(IFrameCallback* callback) { + size_t erased; + erased = mFrameCallbacks.erase(callback); + erased |= mPendingRegistrationFrameCallbacks.erase(callback); + return erased; } void RenderThread::pushBackFrameCallback(IFrameCallback* callback) { diff --git a/libs/hwui/renderthread/RenderThread.h b/libs/hwui/renderthread/RenderThread.h index c461f3a..4126d02 100644 --- a/libs/hwui/renderthread/RenderThread.h +++ b/libs/hwui/renderthread/RenderThread.h @@ -80,7 +80,7 @@ public: // Mimics android.view.Choreographer void postFrameCallback(IFrameCallback* callback); - void removeFrameCallback(IFrameCallback* callback); + bool removeFrameCallback(IFrameCallback* callback); // If the callback is currently registered, it will be pushed back until // the next vsync. If it is not currently registered this does nothing. void pushBackFrameCallback(IFrameCallback* callback); diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardConstants.java b/packages/Keyguard/src/com/android/keyguard/KeyguardConstants.java index 10baf23..05a5f66 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardConstants.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardConstants.java @@ -25,6 +25,6 @@ public class KeyguardConstants { * Turns on debugging information for the whole Keyguard. This is very verbose and should only * be used temporarily for debugging. */ - public static final boolean DEBUG = true; + public static final boolean DEBUG = false; public static final boolean DEBUG_SIM_STATES = true; } diff --git a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java index 7f1314d..ff07dd7 100644 --- a/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/Keyguard/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -1303,16 +1303,15 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener { // that don't return the complete set of values and have different types. In Keyguard we // need IccCardConstants, but TelephonyManager would only give us // TelephonyManager.SIM_STATE*, so we retrieve it manually. - final int phoneId = SubscriptionManager.getPhoneId(subId); - final String stateString = TelephonyManager.getTelephonyProperty(phoneId, - TelephonyProperties.PROPERTY_SIM_STATE, ""); + final TelephonyManager tele = TelephonyManager.from(mContext); + int simState = tele.getSimState(slotId); State state; try { - state = State.valueOf(stateString); + state = State.intToState(simState); } catch(IllegalArgumentException ex) { - Log.w(TAG, "Unknown sim state: " + stateString); + Log.w(TAG, "Unknown sim state: " + simState); state = State.UNKNOWN; - } + } mSimDatas.put(subId, new SimData(state, slotId, subId)); } diff --git a/packages/PrintSpooler/res/values-es-rUS/arrays.xml b/packages/PrintSpooler/res/values-es-rUS/arrays.xml new file mode 100644 index 0000000..c1b149c --- /dev/null +++ b/packages/PrintSpooler/res/values-es-rUS/arrays.xml @@ -0,0 +1,33 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Copyright (C) 2014 The Android Open Source Project + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +--> +<resources> + + <string-array name="pdf_printer_media_sizes" translatable="false"> + <item>NA_LETTER</item> + <item>NA_GOVT_LETTER</item> + <item>NA_LEGAL</item> + <item>NA_JUNIOR_LEGAL</item> + <item>NA_LEDGER</item> + <item>NA_TABLOID</item> + <item>NA_INDEX_3X5</item> + <item>NA_INDEX_4X6</item> + <item>NA_INDEX_5X8</item> + <item>NA_MONARCH</item> + <item>NA_QUARTO</item> + <item>NA_FOOLSCAP</item> + </string-array> + +</resources> diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index 9a95b37..98f03b5 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -251,12 +251,21 @@ <!-- Doze: duration to avoid false pickup gestures triggered by notification vibrations --> <integer name="doze_pickup_vibration_threshold">2000</integer> + <!-- Doze: can we assume the pickup sensor includes a proximity check? --> + <bool name="doze_pickup_performs_proximity_check">true</bool> + <!-- Doze: pulse parameter - how long does it take to fade in? --> <integer name="doze_pulse_duration_in">900</integer> - <!-- Doze: pulse parameter - delay for fading so the screen can wake up before --> + <!-- Doze: pulse parameter - how long does it take to fade in after a pickup? --> + <integer name="doze_pulse_duration_in_pickup">300</integer> + + <!-- Doze: pulse parameter - delay to wait for the screen to wake up --> <integer name="doze_pulse_delay_in">200</integer> + <!-- Doze: pulse parameter - delay to wait for the screen to wake up after a pickup --> + <integer name="doze_pulse_delay_in_pickup">200</integer> + <!-- Doze: pulse parameter - once faded in, how long does it stay visible? --> <integer name="doze_pulse_duration_visible">3000</integer> diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java index 7eb9c6e..1f3a830 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeLog.java @@ -153,7 +153,7 @@ public class DozeLog { sProxStats[pulseReason][near ? 0 : 1].append(); } - private static String pulseReasonToString(int pulseReason) { + public static String pulseReasonToString(int pulseReason) { switch (pulseReason) { case PULSE_REASON_INTENT: return "intent"; case PULSE_REASON_NOTIFICATION: return "notification"; diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java index 2341144..8d27450 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java @@ -222,15 +222,25 @@ public class DozeService extends DreamService { continuePulsing(reason); return; } - // perform a proximity check before pulsing final long start = SystemClock.uptimeMillis(); + final boolean nonBlocking = reason == DozeLog.PULSE_REASON_SENSOR_PICKUP + && mDozeParameters.getPickupPerformsProxCheck(); + if (nonBlocking) { + // proximity check is only done to capture statistics, continue pulsing + continuePulsing(reason); + } + // perform a proximity check new ProximityCheck() { @Override public void onProximityResult(int result) { - // avoid pulsing in pockets final boolean isNear = result == RESULT_NEAR; final long end = SystemClock.uptimeMillis(); DozeLog.traceProximityResult(isNear, end - start, reason); + if (nonBlocking) { + // we already continued + return; + } + // avoid pulsing in pockets if (isNear) { mPulsing = false; mWakeLock.release(); @@ -340,7 +350,8 @@ public class DozeService extends DreamService { if (DEBUG) Log.d(mTag, "No more schedule resets remaining"); return; } - if ((notificationTimeMs - mNotificationPulseTime) < mDozeParameters.getPulseDuration()) { + final long pulseDuration = mDozeParameters.getPulseDuration(false /*pickup*/); + if ((notificationTimeMs - mNotificationPulseTime) < pulseDuration) { if (DEBUG) Log.d(mTag, "Recently updated, not resetting schedule"); return; } diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java index c524edc..6bad652 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java +++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/UserDetailView.java @@ -47,6 +47,10 @@ public class UserDetailView extends PseudoGridView { ViewGroupAdapterBridge.link(this, mAdapter); } + public void refreshAdapter() { + mAdapter.refresh(); + } + public static class Adapter extends UserSwitcherController.BaseUserAdapter implements OnClickListener { diff --git a/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java b/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java index 29f291d..4f0700e 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java +++ b/packages/SystemUI/src/com/android/systemui/recents/AlternateRecentsComponent.java @@ -19,6 +19,7 @@ package com.android.systemui.recents; import android.app.Activity; import android.app.ActivityManager; import android.app.ActivityOptions; +import android.app.ITaskStackListener; import android.appwidget.AppWidgetHost; import android.appwidget.AppWidgetProviderInfo; import android.content.ActivityNotFoundException; @@ -56,6 +57,7 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; + /** A proxy implementation for the recents component */ public class AlternateRecentsComponent implements ActivityOptions.OnAnimationStartedListener { @@ -79,6 +81,28 @@ public class AlternateRecentsComponent implements ActivityOptions.OnAnimationSta final static String sRecentsPackage = "com.android.systemui"; final static String sRecentsActivity = "com.android.systemui.recents.RecentsActivity"; + /** + * An implementation of ITaskStackListener, that allows us to listen for changes to the system + * task stacks and update recents accordingly. + */ + class TaskStackListenerImpl extends ITaskStackListener.Stub { + @Override + public void onTaskStackChanged() { + RecentsConfiguration config = RecentsConfiguration.getInstance(); + if (config.svelteLevel == RecentsConfiguration.SVELTE_NONE) { + // Load the next task only if we aren't svelte + RecentsTaskLoader loader = RecentsTaskLoader.getInstance(); + RecentsTaskLoadPlan plan = loader.createLoadPlan(mContext); + loader.preloadTasks(plan, true /* isTopTaskHome */); + RecentsTaskLoadPlan.Options launchOpts = new RecentsTaskLoadPlan.Options(); + launchOpts.numVisibleTasks = 1; + launchOpts.numVisibleTaskThumbnails = 1; + launchOpts.onlyLoadForCache = true; + loader.loadTasks(mContext, plan, launchOpts); + } + } + } + static RecentsComponent.Callbacks sRecentsComponentCallbacks; static RecentsTaskLoadPlan sInstanceLoadPlan; @@ -86,6 +110,7 @@ public class AlternateRecentsComponent implements ActivityOptions.OnAnimationSta LayoutInflater mInflater; SystemServicesProxy mSystemServicesProxy; Handler mHandler; + TaskStackListenerImpl mTaskStackListener; boolean mBootCompleted; boolean mStartAnimationTriggered; boolean mCanReuseTaskStackViews = true; @@ -116,6 +141,10 @@ public class AlternateRecentsComponent implements ActivityOptions.OnAnimationSta mSystemServicesProxy = new SystemServicesProxy(context); mHandler = new Handler(); mTaskStackBounds = new Rect(); + + // Register the task stack listener + mTaskStackListener = new TaskStackListenerImpl(); + mSystemServicesProxy.registerTaskStackListener(mTaskStackListener); } public void onStart() { diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java index 6dc2edb..a37bc54 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsActivity.java @@ -167,10 +167,6 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView if (action.equals(Intent.ACTION_SCREEN_OFF)) { // When the screen turns off, dismiss Recents to Home dismissRecentsToHome(false); - // Preload the metadata for all tasks in the background - RecentsTaskLoader loader = RecentsTaskLoader.getInstance(); - RecentsTaskLoadPlan plan = loader.createLoadPlan(context); - loader.preloadTasks(plan, true /* isTopTaskHome */); } else if (action.equals(SearchManager.INTENT_GLOBAL_SEARCH_ACTIVITY_CHANGED)) { // When the search activity changes, update the Search widget refreshSearchWidget(); @@ -437,22 +433,6 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView onEnterAnimationTriggered(); } - // Start listening for widget package changes if there is one bound, post it since we don't - // want it stalling the startup - if (mConfig.searchBarAppWidgetId >= 0) { - final WeakReference<RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks> callback = - new WeakReference<RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks>(this); - mRecentsView.post(new Runnable() { - @Override - public void run() { - RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks cb = callback.get(); - if (cb != null) { - mAppWidgetHost.startListening(cb); - } - } - }); - } - mStatusBar = ((SystemUIApplication) getApplication()) .getComponent(PhoneStatusBar.class); } @@ -539,15 +519,29 @@ public class RecentsActivity extends Activity implements RecentsView.RecentsView unregisterReceiver(mSystemBroadcastReceiver); // Stop listening for widget package changes if there was one bound - if (mAppWidgetHost.isListening()) { - mAppWidgetHost.stopListening(); - } + mAppWidgetHost.stopListening(); } public void onEnterAnimationTriggered() { // Try and start the enter animation (or restart it on configuration changed) ReferenceCountedTrigger t = new ReferenceCountedTrigger(this, null, null, null); - mRecentsView.startEnterRecentsAnimation(new ViewAnimation.TaskViewEnterContext(t)); + ViewAnimation.TaskViewEnterContext ctx = new ViewAnimation.TaskViewEnterContext(t); + mRecentsView.startEnterRecentsAnimation(ctx); + if (mConfig.searchBarAppWidgetId >= 0) { + final WeakReference<RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks> cbRef = + new WeakReference<RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks>( + RecentsActivity.this); + ctx.postAnimationTrigger.addLastDecrementRunnable(new Runnable() { + @Override + public void run() { + // Start listening for widget package changes if there is one bound + RecentsAppWidgetHost.RecentsAppWidgetHostCallbacks cb = cbRef.get(); + if (cb != null) { + mAppWidgetHost.startListening(cb); + } + } + }); + } // Animate the SystemUI scrim views mScrimViews.startEnterRecentsAnimation(); diff --git a/packages/SystemUI/src/com/android/systemui/recents/RecentsAppWidgetHost.java b/packages/SystemUI/src/com/android/systemui/recents/RecentsAppWidgetHost.java index a63e167..5bae37a 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/RecentsAppWidgetHost.java +++ b/packages/SystemUI/src/com/android/systemui/recents/RecentsAppWidgetHost.java @@ -43,23 +43,23 @@ public class RecentsAppWidgetHost extends AppWidgetHost { public void startListening(RecentsAppWidgetHostCallbacks cb) { mCb = cb; - mIsListening = true; - super.startListening(); + if (!mIsListening) { + mIsListening = true; + super.startListening(); + } } @Override public void stopListening() { - super.stopListening(); + if (mIsListening) { + super.stopListening(); + } // Ensure that we release any references to the callbacks mCb = null; mContext = null; mIsListening = false; } - public boolean isListening() { - return mIsListening; - } - @Override protected void onProviderChanged(int appWidgetId, AppWidgetProviderInfo appWidgetInfo) { if (mCb == null) return; diff --git a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java index 9a4bd08..3fbd5a6 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java +++ b/packages/SystemUI/src/com/android/systemui/recents/misc/SystemServicesProxy.java @@ -21,6 +21,7 @@ import android.app.ActivityManagerNative; import android.app.ActivityOptions; import android.app.AppGlobals; import android.app.IActivityManager; +import android.app.ITaskStackListener; import android.app.SearchManager; import android.appwidget.AppWidgetHost; import android.appwidget.AppWidgetManager; @@ -536,4 +537,15 @@ public class SystemServicesProxy { e.printStackTrace(); } } + + /** Registers a task stack listener with the system. */ + public void registerTaskStackListener(ITaskStackListener listener) { + if (mIam == null) return; + + try { + mIam.registerTaskStackListener(listener); + } catch (Exception e) { + e.printStackTrace(); + } + } } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java index 46a5d8d..746a7df 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/RecentsView.java @@ -204,6 +204,10 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV /** Requests all task stacks to start their enter-recents animation */ public void startEnterRecentsAnimation(ViewAnimation.TaskViewEnterContext ctx) { + // We have to increment/decrement the post animation trigger in case there are no children + // to ensure that it runs + ctx.postAnimationTrigger.increment(); + int childCount = getChildCount(); for (int i = 0; i < childCount; i++) { View child = getChildAt(i); @@ -212,6 +216,7 @@ public class RecentsView extends FrameLayout implements TaskStackView.TaskStackV stackView.startEnterRecentsAnimation(ctx); } } + ctx.postAnimationTrigger.decrement(); } /** Requests all task stacks to start their exit-recents animation */ diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java index 2623db3..33a36f6 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/TaskStackView.java @@ -530,11 +530,12 @@ public class TaskStackView extends FrameLayout implements TaskStack.TaskStackCal /** Resets the focused task. */ void resetFocusedTask() { - if ((mStack != null) && (0 <= mFocusedTaskIndex) && - (mFocusedTaskIndex < mStack.getTaskCount())) { + if ((0 <= mFocusedTaskIndex) && (mFocusedTaskIndex < mStack.getTaskCount())) { Task t = mStack.getTasks().get(mFocusedTaskIndex); TaskView tv = getChildViewForTask(t); - tv.unsetFocusedTask(); + if (tv != null) { + tv.unsetFocusedTask(); + } } mFocusedTaskIndex = -1; } diff --git a/packages/SystemUI/src/com/android/systemui/recents/views/ViewAnimation.java b/packages/SystemUI/src/com/android/systemui/recents/views/ViewAnimation.java index 4586f12..e1d80fd 100644 --- a/packages/SystemUI/src/com/android/systemui/recents/views/ViewAnimation.java +++ b/packages/SystemUI/src/com/android/systemui/recents/views/ViewAnimation.java @@ -27,7 +27,7 @@ public class ViewAnimation { public static class TaskViewEnterContext { // A trigger to run some logic when all the animations complete. This works around the fact // that it is difficult to coordinate ViewPropertyAnimators - ReferenceCountedTrigger postAnimationTrigger; + public ReferenceCountedTrigger postAnimationTrigger; // An update listener to notify as the enter animation progresses (used for the home transition) ValueAnimator.AnimatorUpdateListener updateListener; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java index 3d4a1e0..6b167b4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeParameters.java @@ -46,9 +46,12 @@ public class DozeParameters { public void dump(PrintWriter pw) { pw.println(" DozeParameters:"); pw.print(" getDisplayStateSupported(): "); pw.println(getDisplayStateSupported()); - pw.print(" getPulseDuration(): "); pw.println(getPulseDuration()); - pw.print(" getPulseInDuration(): "); pw.println(getPulseInDuration()); - pw.print(" getPulseInDelay(): "); pw.println(getPulseInDelay()); + pw.print(" getPulseDuration(pickup=false): "); pw.println(getPulseDuration(false)); + pw.print(" getPulseDuration(pickup=true): "); pw.println(getPulseDuration(true)); + pw.print(" getPulseInDuration(pickup=false): "); pw.println(getPulseInDuration(false)); + pw.print(" getPulseInDuration(pickup=true): "); pw.println(getPulseInDuration(true)); + pw.print(" getPulseInDelay(pickup=false): "); pw.println(getPulseInDelay(false)); + pw.print(" getPulseInDelay(pickup=true): "); pw.println(getPulseInDelay(true)); pw.print(" getPulseInVisibleDuration(): "); pw.println(getPulseVisibleDuration()); pw.print(" getPulseOutDuration(): "); pw.println(getPulseOutDuration()); pw.print(" getPulseOnSigMotion(): "); pw.println(getPulseOnSigMotion()); @@ -60,22 +63,27 @@ public class DozeParameters { pw.print(" getPulseSchedule(): "); pw.println(getPulseSchedule()); pw.print(" getPulseScheduleResets(): "); pw.println(getPulseScheduleResets()); pw.print(" getPickupVibrationThreshold(): "); pw.println(getPickupVibrationThreshold()); + pw.print(" getPickupPerformsProxCheck(): "); pw.println(getPickupPerformsProxCheck()); } public boolean getDisplayStateSupported() { return getBoolean("doze.display.supported", R.bool.doze_display_state_supported); } - public int getPulseDuration() { - return getPulseInDuration() + getPulseVisibleDuration() + getPulseOutDuration(); + public int getPulseDuration(boolean pickup) { + return getPulseInDuration(pickup) + getPulseVisibleDuration() + getPulseOutDuration(); } - public int getPulseInDuration() { - return getInt("doze.pulse.duration.in", R.integer.doze_pulse_duration_in); + public int getPulseInDuration(boolean pickup) { + return pickup + ? getInt("doze.pulse.duration.in.pickup", R.integer.doze_pulse_duration_in_pickup) + : getInt("doze.pulse.duration.in", R.integer.doze_pulse_duration_in); } - public int getPulseInDelay() { - return getInt("doze.pulse.delay.in", R.integer.doze_pulse_delay_in); + public int getPulseInDelay(boolean pickup) { + return pickup + ? getInt("doze.pulse.delay.in.pickup", R.integer.doze_pulse_delay_in_pickup) + : getInt("doze.pulse.delay.in", R.integer.doze_pulse_delay_in); } public int getPulseVisibleDuration() { @@ -106,6 +114,10 @@ public class DozeParameters { return getBoolean("doze.pulse.proxcheck", R.bool.doze_proximity_check_before_pulse); } + public boolean getPickupPerformsProxCheck() { + return getBoolean("doze.pickup.proxcheck", R.bool.doze_pickup_performs_proximity_check); + } + public boolean getPulseOnNotifications() { return getBoolean("doze.pulse.notifications", R.bool.doze_pulse_on_notifications); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java index 022e64e..3e17328 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/DozeScrimController.java @@ -21,10 +21,8 @@ import android.animation.AnimatorListenerAdapter; import android.animation.ValueAnimator; import android.annotation.NonNull; import android.content.Context; -import android.graphics.Color; import android.os.Handler; import android.util.Log; -import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.view.animation.Interpolator; @@ -40,6 +38,7 @@ public class DozeScrimController { private final DozeParameters mDozeParameters; private final Interpolator mPulseInInterpolator = PhoneStatusBar.ALPHA_OUT; + private final Interpolator mPulseInInterpolatorPickup; private final Interpolator mPulseOutInterpolator = PhoneStatusBar.ALPHA_IN; private final Interpolator mDozeAnimationInterpolator; private final Handler mHandler = new Handler(); @@ -56,8 +55,8 @@ public class DozeScrimController { public DozeScrimController(ScrimController scrimController, Context context) { mScrimController = scrimController; mDozeParameters = new DozeParameters(context); - mDozeAnimationInterpolator = AnimationUtils.loadInterpolator(context, - android.R.interpolator.linear_out_slow_in); + mDozeAnimationInterpolator = mPulseInInterpolatorPickup = + AnimationUtils.loadInterpolator(context, android.R.interpolator.linear_out_slow_in); } public void setDozing(boolean dozing, boolean animate) { @@ -219,11 +218,16 @@ public class DozeScrimController { private final Runnable mPulseIn = new Runnable() { @Override public void run() { - if (DEBUG) Log.d(TAG, "Pulse in, mDozing=" + mDozing); + if (DEBUG) Log.d(TAG, "Pulse in, mDozing=" + mDozing + " mPulseReason=" + + DozeLog.pulseReasonToString(mPulseReason)); if (!mDozing) return; DozeLog.tracePulseStart(mPulseReason); - startScrimAnimation(true /* inFront */, 0f, mDozeParameters.getPulseInDuration(), - mPulseInInterpolator, mDozeParameters.getPulseInDelay(), mPulseInFinished); + final boolean pickup = mPulseReason == DozeLog.PULSE_REASON_SENSOR_PICKUP; + startScrimAnimation(true /* inFront */, 0f, + mDozeParameters.getPulseInDuration(pickup), + pickup ? mPulseInInterpolatorPickup : mPulseInInterpolator, + mDozeParameters.getPulseInDelay(pickup), + mPulseInFinished); // Signal that the pulse is ready to turn the screen on and draw. pulseStarted(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java index 7ee1fc5..1460e5f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/KeyguardUserSwitcher.java @@ -107,6 +107,7 @@ public class KeyguardUserSwitcher { public void show(boolean animate) { if (mUserSwitcher != null && mUserSwitcherContainer.getVisibility() != View.VISIBLE) { cancelAnimations(); + mAdapter.refresh(); mUserSwitcherContainer.setVisibility(View.VISIBLE); mStatusBarView.setKeyguardUserSwitcherShowing(true, animate); if (animate) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java index 39610e9..6431ab5 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkControllerImpl.java @@ -428,8 +428,9 @@ public class NetworkControllerImpl extends BroadcastReceiver updateNoSims(); } - private void updateNoSims() { - boolean hasNoSims = mPhone.getPhoneCount() != 0 && mMobileSignalControllers.size() == 0; + @VisibleForTesting + protected void updateNoSims() { + boolean hasNoSims = mHasMobileDataFeature && mMobileSignalControllers.size() == 0; if (hasNoSims != mHasNoSims) { mHasNoSims = hasNoSims; notifyListeners(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java index e5b357a..4ac41a1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/UserSwitcherController.java @@ -417,18 +417,6 @@ public class UserSwitcherController { } } - public int getSwitchableUsers() { - int result = 0; - ArrayList<UserRecord> users = mController.mUsers; - int N = users.size(); - for (int i = 0; i < N; i++) { - if (users.get(i).info != null) { - result++; - } - } - return result; - } - public Drawable getDrawable(Context context, UserRecord item) { if (item.isAddUser) { return context.getDrawable(R.drawable.ic_add_circle_qs); @@ -436,6 +424,10 @@ public class UserSwitcherController { return UserIcons.getDefaultUserIcon(item.isGuest ? UserHandle.USER_NULL : item.info.id, /* light= */ true); } + + public void refresh() { + mController.refreshUsers(UserHandle.USER_NULL); + } } public static final class UserRecord { @@ -500,6 +492,7 @@ public class UserSwitcherController { } else { v = (UserDetailView) convertView; } + v.refreshAdapter(); return v; } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java index eaf2f78..020bc00 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerBaseTest.java @@ -195,6 +195,18 @@ public class NetworkControllerBaseTest extends AndroidTestCase { mPhoneStateListener.onDataActivity(dataActivity); } + protected void verifyHasNoSims(boolean hasNoSimsVisible) { + ArgumentCaptor<Boolean> hasNoSimsArg = ArgumentCaptor.forClass(Boolean.class); + + Mockito.verify(mSignalCluster, Mockito.atLeastOnce()).setNoSims(hasNoSimsArg.capture()); + assertEquals("No sims in status bar", hasNoSimsVisible, (boolean) hasNoSimsArg.getValue()); + + Mockito.verify(mNetworkSignalChangedCallback, Mockito.atLeastOnce()) + .onNoSimVisibleChanged(hasNoSimsArg.capture()); + assertEquals("No sims in quick settings", hasNoSimsVisible, + (boolean) hasNoSimsArg.getValue()); + } + protected void verifyLastQsMobileDataIndicators(boolean visible, int icon, int typeIcon, boolean dataIn, boolean dataOut) { ArgumentCaptor<Integer> iconArg = ArgumentCaptor.forClass(Integer.class); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java index b5d97d9..33eb4d6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/NetworkControllerSignalTest.java @@ -25,6 +25,30 @@ public class NetworkControllerSignalTest extends NetworkControllerBaseTest { verifyLastMobileDataIndicators(false, 0, 0); } + public void testNoSimsIconPresent() { + // No Subscriptions. + mNetworkController.mMobileSignalControllers.clear(); + mNetworkController.updateNoSims(); + + verifyHasNoSims(true); + } + + public void testNoSimlessIconWithoutMobile() { + // Turn off mobile network support. + Mockito.when(mMockCm.isNetworkSupported(ConnectivityManager.TYPE_MOBILE)).thenReturn(false); + // Create a new NetworkController as this is currently handled in constructor. + mNetworkController = new NetworkControllerImpl(mContext, mMockCm, mMockTm, mMockWm, mMockSm, + mConfig, mock(AccessPointControllerImpl.class), + mock(MobileDataControllerImpl.class)); + setupNetworkController(); + + // No Subscriptions. + mNetworkController.mMobileSignalControllers.clear(); + mNetworkController.updateNoSims(); + + verifyHasNoSims(false); + } + public void testSignalStrength() { for (int testStrength = SignalStrength.SIGNAL_STRENGTH_NONE_OR_UNKNOWN; testStrength <= SignalStrength.SIGNAL_STRENGTH_GREAT; testStrength++) { diff --git a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java index ca0d481..8b53a62 100644 --- a/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java +++ b/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java @@ -4055,12 +4055,12 @@ public class PhoneWindowManager implements WindowManagerPolicy { mAppsToBeHidden.remove(appToken); mAppsThatDismissKeyguard.remove(appToken); if (mAppsToBeHidden.isEmpty()) { - if (mKeyguardSecureIncludingHidden) { + if (dismissKeyguard && !mKeyguardSecure) { + mAppsThatDismissKeyguard.add(appToken); + } else { mWinShowWhenLocked = win; mHideLockScreen = true; mForceStatusBarFromKeyguard = false; - } else if (dismissKeyguard && !mKeyguardSecure) { - mAppsThatDismissKeyguard.add(appToken); } } } else if (dismissKeyguard) { diff --git a/services/core/java/com/android/server/AppOpsService.java b/services/core/java/com/android/server/AppOpsService.java index c3465d1..42a5195 100644 --- a/services/core/java/com/android/server/AppOpsService.java +++ b/services/core/java/com/android/server/AppOpsService.java @@ -29,6 +29,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; +import android.app.ActivityManager; import android.app.ActivityThread; import android.app.AppOpsManager; import android.content.Context; @@ -53,7 +54,6 @@ import android.util.Log; import android.util.Pair; import android.util.Slog; import android.util.SparseArray; -import android.util.SparseIntArray; import android.util.TimeUtils; import android.util.Xml; @@ -78,10 +78,12 @@ public class AppOpsService extends IAppOpsService.Stub { final Handler mHandler; boolean mWriteScheduled; + boolean mFastWriteScheduled; final Runnable mWriteRunner = new Runnable() { public void run() { synchronized (AppOpsService.this) { mWriteScheduled = false; + mFastWriteScheduled = false; AsyncTask<Void, Void, Void> task = new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { writeState(); @@ -237,7 +239,7 @@ public class AppOpsService extends IAppOpsService.Stub { } } if (changed) { - scheduleWriteLocked(); + scheduleFastWriteLocked(); } } } @@ -250,7 +252,7 @@ public class AppOpsService extends IAppOpsService.Stub { if (pkgs.size() <= 0) { mUidOps.remove(uid); } - scheduleWriteLocked(); + scheduleFastWriteLocked(); } } } @@ -260,7 +262,7 @@ public class AppOpsService extends IAppOpsService.Stub { synchronized (this) { if (mUidOps.indexOfKey(uid) >= 0) { mUidOps.remove(uid); - scheduleWriteLocked(); + scheduleFastWriteLocked(); } } } @@ -400,7 +402,7 @@ public class AppOpsService extends IAppOpsService.Stub { // if there is nothing else interesting in it. pruneOp(op, uid, packageName); } - scheduleWriteNowLocked(); + scheduleFastWriteLocked(); } } } @@ -436,16 +438,20 @@ public class AppOpsService extends IAppOpsService.Stub { } @Override - public void resetAllModes() { - int callingUid = Binder.getCallingUid(); + public void resetAllModes(int reqUserId, String reqPackageName) { + final int callingPid = Binder.getCallingPid(); + final int callingUid = Binder.getCallingUid(); mContext.enforcePermission(android.Manifest.permission.UPDATE_APP_OPS_STATS, - Binder.getCallingPid(), callingUid, null); + callingPid, callingUid, null); + reqUserId = ActivityManager.handleIncomingUser(callingPid, callingUid, reqUserId, + true, true, "resetAllModes", null); HashMap<Callback, ArrayList<Pair<String, Integer>>> callbacks = null; synchronized (this) { boolean changed = false; for (int i=mUidOps.size()-1; i>=0; i--) { HashMap<String, Ops> packages = mUidOps.valueAt(i); - if (UserHandle.getUserId(callingUid) != UserHandle.getUserId(mUidOps.keyAt(i))) { + if (reqUserId != UserHandle.USER_ALL + && reqUserId != UserHandle.getUserId(mUidOps.keyAt(i))) { // Skip any ops for a different user continue; } @@ -453,6 +459,10 @@ public class AppOpsService extends IAppOpsService.Stub { while (it.hasNext()) { Map.Entry<String, Ops> ent = it.next(); String packageName = ent.getKey(); + if (reqPackageName != null && !reqPackageName.equals(packageName)) { + // Skip any ops for a different package + continue; + } Ops pkgOps = ent.getValue(); for (int j=pkgOps.size()-1; j>=0; j--) { Op curOp = pkgOps.valueAt(j); @@ -478,7 +488,7 @@ public class AppOpsService extends IAppOpsService.Stub { } } if (changed) { - scheduleWriteNowLocked(); + scheduleFastWriteLocked(); } } if (callbacks != null) { @@ -837,12 +847,13 @@ public class AppOpsService extends IAppOpsService.Stub { } } - private void scheduleWriteNowLocked() { - if (!mWriteScheduled) { + private void scheduleFastWriteLocked() { + if (!mFastWriteScheduled) { mWriteScheduled = true; + mFastWriteScheduled = true; + mHandler.removeCallbacks(mWriteRunner); + mHandler.postDelayed(mWriteRunner, 10*1000); } - mHandler.removeCallbacks(mWriteRunner); - mHandler.post(mWriteRunner); } private Op getOpLocked(int code, int uid, String packageName, boolean edit) { @@ -1236,12 +1247,11 @@ public class AppOpsService extends IAppOpsService.Stub { pw.print(" ago"); } if (op.duration == -1) { - pw.println(" (running)"); - } else { - pw.print("; duration="); - TimeUtils.formatDuration(op.duration, pw); - pw.println(); + pw.print(" (running)"); + } else if (op.duration != 0) { + pw.print("; duration="); TimeUtils.formatDuration(op.duration, pw); } + pw.println(); } } } diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index c5af085..84fddd7 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -797,17 +797,6 @@ public class ConnectivityService extends IConnectivityManager.Stub throw new IllegalStateException("No free netIds"); } - private int getConnectivityChangeDelay() { - final ContentResolver cr = mContext.getContentResolver(); - - /** Check system properties for the default value then use secure settings value, if any. */ - int defaultDelay = SystemProperties.getInt( - "conn." + Settings.Global.CONNECTIVITY_CHANGE_DELAY, - ConnectivityManager.CONNECTIVITY_CHANGE_DELAY_DEFAULT); - return Settings.Global.getInt(cr, Settings.Global.CONNECTIVITY_CHANGE_DELAY, - defaultDelay); - } - private boolean teardown(NetworkStateTracker netTracker) { if (netTracker.teardown()) { netTracker.setTeardownRequested(true); @@ -1479,11 +1468,6 @@ public class ConnectivityService extends IConnectivityManager.Stub sendGeneralBroadcast(info, CONNECTIVITY_ACTION); } - private void sendConnectedBroadcastDelayed(NetworkInfo info, int delayMs) { - sendGeneralBroadcast(info, CONNECTIVITY_ACTION_IMMEDIATE); - sendGeneralBroadcastDelayed(info, CONNECTIVITY_ACTION, delayMs); - } - private void sendInetConditionBroadcast(NetworkInfo info) { sendGeneralBroadcast(info, ConnectivityManager.INET_CONDITION_ACTION); } @@ -1515,10 +1499,6 @@ public class ConnectivityService extends IConnectivityManager.Stub sendStickyBroadcast(makeGeneralIntent(info, bcastType)); } - private void sendGeneralBroadcastDelayed(NetworkInfo info, String bcastType, int delayMs) { - sendStickyBroadcastDelayed(makeGeneralIntent(info, bcastType), delayMs); - } - private void sendDataActivityBroadcast(int deviceType, boolean active, long tsNanos) { Intent intent = new Intent(ConnectivityManager.ACTION_DATA_ACTIVITY_CHANGE); intent.putExtra(ConnectivityManager.EXTRA_DEVICE_TYPE, deviceType); @@ -1552,19 +1532,6 @@ public class ConnectivityService extends IConnectivityManager.Stub } } - private void sendStickyBroadcastDelayed(Intent intent, int delayMs) { - if (delayMs <= 0) { - sendStickyBroadcast(intent); - } else { - if (VDBG) { - log("sendStickyBroadcastDelayed: delayMs=" + delayMs + ", action=" - + intent.getAction()); - } - mHandler.sendMessageDelayed(mHandler.obtainMessage( - EVENT_SEND_STICKY_BROADCAST_INTENT, intent), delayMs); - } - } - void systemReady() { // start network sampling .. Intent intent = new Intent(ACTION_PKT_CNT_SAMPLE_INTERVAL_ELAPSED); @@ -4307,7 +4274,7 @@ public class ConnectivityService extends IConnectivityManager.Stub info.setType(type); if (connected) { info.setDetailedState(DetailedState.CONNECTED, null, info.getExtraInfo()); - sendConnectedBroadcastDelayed(info, getConnectivityChangeDelay()); + sendConnectedBroadcast(info); } else { info.setDetailedState(DetailedState.DISCONNECTED, null, info.getExtraInfo()); Intent intent = new Intent(ConnectivityManager.CONNECTIVITY_ACTION); @@ -4338,10 +4305,9 @@ public class ConnectivityService extends IConnectivityManager.Stub final Intent immediateIntent = new Intent(intent); immediateIntent.setAction(CONNECTIVITY_ACTION_IMMEDIATE); sendStickyBroadcast(immediateIntent); - sendStickyBroadcastDelayed(intent, getConnectivityChangeDelay()); + sendStickyBroadcast(intent); if (newDefaultAgent != null) { - sendConnectedBroadcastDelayed(newDefaultAgent.networkInfo, - getConnectivityChangeDelay()); + sendConnectedBroadcast(newDefaultAgent.networkInfo); } } } diff --git a/services/core/java/com/android/server/MmsServiceBroker.java b/services/core/java/com/android/server/MmsServiceBroker.java index b1c4955..83b1919 100644 --- a/services/core/java/com/android/server/MmsServiceBroker.java +++ b/services/core/java/com/android/server/MmsServiceBroker.java @@ -207,20 +207,6 @@ public class MmsServiceBroker extends SystemService { return mTelephonyManager; } - /* - * Throws a security exception unless the caller has carrier privilege. - */ - private void enforceCarrierPrivilege() { - final String[] packages = getPackageManager().getPackagesForUid(Binder.getCallingUid()); - for (String pkg : packages) { - if (getTelephonyManager().checkCarrierPrivilegesForPackage(pkg) == - TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS) { - return; - } - } - throw new SecurityException("No carrier privilege"); - } - private String getCallingPackageName() { final String[] packages = getPackageManager().getPackagesForUid(Binder.getCallingUid()); if (packages != null && packages.length > 0) { @@ -270,19 +256,6 @@ public class MmsServiceBroker extends SystemService { } @Override - public void updateMmsSendStatus(int messageRef, byte[] pdu, int status) - throws RemoteException { - enforceCarrierPrivilege(); - getServiceGuarded().updateMmsSendStatus(messageRef, pdu, status); - } - - @Override - public void updateMmsDownloadStatus(int messageRef, int status) throws RemoteException { - enforceCarrierPrivilege(); - getServiceGuarded().updateMmsDownloadStatus(messageRef, status); - } - - @Override public Bundle getCarrierConfigValues(int subId) throws RemoteException { Slog.d(TAG, "getCarrierConfigValues() by " + getCallingPackageName()); return getServiceGuarded().getCarrierConfigValues(subId); diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 7e17043..6823119 100755 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -37,6 +37,7 @@ import android.app.ApplicationThreadNative; import android.app.IActivityContainer; import android.app.IActivityContainerCallback; import android.app.IAppTask; +import android.app.ITaskStackListener; import android.app.ProfilerInfo; import android.app.admin.DevicePolicyManager; import android.app.usage.UsageEvents; @@ -292,7 +293,7 @@ public final class ActivityManagerService extends ActivityManagerNative static final boolean IS_USER_BUILD = "user".equals(Build.TYPE); // Maximum number recent bitmaps to keep in memory. - static final int MAX_RECENT_BITMAPS = 5; + static final int MAX_RECENT_BITMAPS = 3; // Amount of time after a call to stopAppSwitches() during which we will // prevent further untrusted switches from happening. @@ -370,6 +371,9 @@ public final class ActivityManagerService extends ActivityManagerNative static final int LAST_PREBOOT_DELIVERED_FILE_VERSION = 10000; + // Delay in notifying task stack change listeners (in millis) + static final int NOTIFY_TASK_STACK_CHANGE_LISTENERS_DELAY = 1000; + /** All system services */ SystemServiceManager mSystemServiceManager; @@ -378,6 +382,10 @@ public final class ActivityManagerService extends ActivityManagerNative /** Run all ActivityStacks through this */ ActivityStackSupervisor mStackSupervisor; + /** Task stack change listeners. */ + private RemoteCallbackList<ITaskStackListener> mTaskStackListeners = + new RemoteCallbackList<ITaskStackListener>(); + public IntentFirewall mIntentFirewall; // Whether we should show our dialogs (ANR, crash, etc) or just perform their @@ -1219,6 +1227,7 @@ public final class ActivityManagerService extends ActivityManagerNative static final int START_USER_SWITCH_MSG = 46; static final int SEND_LOCALE_TO_MOUNT_DAEMON_MSG = 47; static final int DISMISS_DIALOG_MSG = 48; + static final int NOTIFY_TASK_STACK_CHANGE_LISTENERS_MSG = 49; static final int FIRST_ACTIVITY_STACK_MSG = 100; static final int FIRST_BROADCAST_QUEUE_MSG = 200; @@ -1738,6 +1747,22 @@ public final class ActivityManagerService extends ActivityManagerNative d.dismiss(); break; } + case NOTIFY_TASK_STACK_CHANGE_LISTENERS_MSG: { + synchronized (ActivityManagerService.this) { + int i = mTaskStackListeners.beginBroadcast(); + while (i > 0) { + i--; + try { + // Make a one-way callback to the listener + mTaskStackListeners.getBroadcastItem(i).onTaskStackChanged(); + } catch (RemoteException e){ + // Handled by the RemoteCallbackList + } + } + mTaskStackListeners.finishBroadcast(); + } + break; + } } } }; @@ -2332,6 +2357,16 @@ public final class ActivityManagerService extends ActivityManagerNative } } + /** Sets the task stack listener that gets callbacks when a task stack changes. */ + @Override + public void registerTaskStackListener(ITaskStackListener listener) throws RemoteException { + synchronized (ActivityManagerService.this) { + if (listener != null) { + mTaskStackListeners.register(listener); + } + } + } + @Override public void notifyActivityDrawn(IBinder token) { if (DEBUG_VISBILITY) Slog.d(TAG, "notifyActivityDrawn: token=" + token); @@ -3643,12 +3678,12 @@ public final class ActivityManagerService extends ActivityManagerNative if(DEBUG_TASKS) Slog.i(TAG, "remove RecentTask " + tr + " when finishing user" + userId); mRecentTasks.remove(i); - tr.removedFromRecents(mTaskPersister); + tr.removedFromRecents(); } } // Remove tasks from persistent storage. - mTaskPersister.wakeup(null, true); + notifyTaskPersisterLocked(null, true); } // Sort by taskId @@ -3660,7 +3695,7 @@ public final class ActivityManagerService extends ActivityManagerNative }; // Extract the affiliates of the chain containing mRecentTasks[start]. - private int processNextAffiliateChain(int start) { + private int processNextAffiliateChainLocked(int start) { final TaskRecord startTask = mRecentTasks.get(start); final int affiliateId = startTask.mAffiliatedTaskId; @@ -3695,7 +3730,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (first.mNextAffiliate != null) { Slog.w(TAG, "Link error 1 first.next=" + first.mNextAffiliate); first.setNextAffiliate(null); - mTaskPersister.wakeup(first, false); + notifyTaskPersisterLocked(first, false); } // Everything in the middle is doubly linked from next to prev. final int tmpSize = mTmpRecents.size(); @@ -3706,13 +3741,13 @@ public final class ActivityManagerService extends ActivityManagerNative Slog.w(TAG, "Link error 2 next=" + next + " prev=" + next.mPrevAffiliate + " setting prev=" + prev); next.setPrevAffiliate(prev); - mTaskPersister.wakeup(next, false); + notifyTaskPersisterLocked(next, false); } if (prev.mNextAffiliate != next) { Slog.w(TAG, "Link error 3 prev=" + prev + " next=" + prev.mNextAffiliate + " setting next=" + next); prev.setNextAffiliate(next); - mTaskPersister.wakeup(prev, false); + notifyTaskPersisterLocked(prev, false); } prev.inRecents = true; } @@ -3721,7 +3756,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (last.mPrevAffiliate != null) { Slog.w(TAG, "Link error 4 last.prev=" + last.mPrevAffiliate); last.setPrevAffiliate(null); - mTaskPersister.wakeup(last, false); + notifyTaskPersisterLocked(last, false); } // Insert the group back into mRecentTasks at start. @@ -3762,7 +3797,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (task.autoRemoveRecents && task.getTopActivity() == null) { // This situation is broken, and we should just get rid of it now. mRecentTasks.remove(i); - task.removedFromRecents(mTaskPersister); + task.removedFromRecents(); i--; N--; Slog.w(TAG, "Removing auto-remove without activity: " + task); @@ -3807,7 +3842,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (app == dummyApp || (app.flags&ApplicationInfo.FLAG_INSTALLED) == 0) { // Doesn't exist any more! Good-bye. mRecentTasks.remove(i); - task.removedFromRecents(mTaskPersister); + task.removedFromRecents(); i--; N--; Slog.w(TAG, "Removing no longer valid recent: " + task); @@ -3843,7 +3878,7 @@ public final class ActivityManagerService extends ActivityManagerNative } // Verify the affiliate chain for each task. - for (int i = 0; i < N; i = processNextAffiliateChain(i)) { + for (int i = 0; i < N; i = processNextAffiliateChainLocked(i)) { } mTmpRecents.clear(); @@ -4009,12 +4044,12 @@ public final class ActivityManagerService extends ActivityManagerNative } if (DEBUG_RECENTS) Slog.d(TAG, "addRecent: trimming tasks for " + task); - trimRecentsForTask(task, true); + trimRecentsForTaskLocked(task, true); N = mRecentTasks.size(); while (N >= ActivityManager.getMaxRecentTasksStatic()) { final TaskRecord tr = mRecentTasks.remove(N - 1); - tr.removedFromRecents(mTaskPersister); + tr.removedFromRecents(); N--; } task.inRecents = true; @@ -4079,7 +4114,7 @@ public final class ActivityManagerService extends ActivityManagerNative * If needed, remove oldest existing entries in recents that are for the same kind * of task as the given one. */ - int trimRecentsForTask(TaskRecord task, boolean doTrim) { + int trimRecentsForTaskLocked(TaskRecord task, boolean doTrim) { int N = mRecentTasks.size(); final Intent intent = task.intent; final boolean document = intent != null && intent.isDocument(); @@ -4126,7 +4161,7 @@ public final class ActivityManagerService extends ActivityManagerNative tr.disposeThumbnail(); mRecentTasks.remove(i); if (task != tr) { - tr.removedFromRecents(mTaskPersister); + tr.removedFromRecents(); } i--; N--; @@ -7989,10 +8024,6 @@ public final class ActivityManagerService extends ActivityManagerNative return list; } - TaskRecord getMostRecentTask() { - return mRecentTasks.get(0); - } - /** * Creates a new RecentTaskInfo from a TaskRecord. */ @@ -8221,7 +8252,7 @@ public final class ActivityManagerService extends ActivityManagerNative TaskRecord task = new TaskRecord(this, mStackSupervisor.getNextTaskId(), ainfo, intent, description); - int trimIdx = trimRecentsForTask(task, false); + int trimIdx = trimRecentsForTaskLocked(task, false); if (trimIdx >= 0) { // If this would have caused a trim, then we'll abort because that // means it would be added at the end of the list but then just removed. @@ -8231,7 +8262,7 @@ public final class ActivityManagerService extends ActivityManagerNative final int N = mRecentTasks.size(); if (N >= (ActivityManager.getMaxRecentTasksStatic()-1)) { final TaskRecord tr = mRecentTasks.remove(N - 1); - tr.removedFromRecents(mTaskPersister); + tr.removedFromRecents(); } task.inRecents = true; @@ -8291,7 +8322,7 @@ public final class ActivityManagerService extends ActivityManagerNative private void cleanUpRemovedTaskLocked(TaskRecord tr, boolean killProcess) { mRecentTasks.remove(tr); - tr.removedFromRecents(mTaskPersister); + tr.removedFromRecents(); ComponentName component = tr.getBaseIntent().getComponent(); if (component == null) { Slog.w(TAG, "No component for base intent of task: " + tr); @@ -9979,6 +10010,7 @@ public final class ActivityManagerService extends ActivityManagerNative } } + /** Pokes the task persister. */ void notifyTaskPersisterLocked(TaskRecord task, boolean flush) { if (task != null && task.stack != null && task.stack.isHomeStack()) { // Never persist the home stack. @@ -9987,6 +10019,13 @@ public final class ActivityManagerService extends ActivityManagerNative mTaskPersister.wakeup(task, flush); } + /** Notifies all listeners when the task stack has changed. */ + void notifyTaskStackChangedLocked() { + mHandler.removeMessages(NOTIFY_TASK_STACK_CHANGE_LISTENERS_MSG); + Message nmsg = mHandler.obtainMessage(NOTIFY_TASK_STACK_CHANGE_LISTENERS_MSG); + mHandler.sendMessageDelayed(nmsg, NOTIFY_TASK_STACK_CHANGE_LISTENERS_DELAY); + } + @Override public boolean shutdown(int timeout) { if (checkCallingPermission(android.Manifest.permission.SHUTDOWN) @@ -10010,12 +10049,12 @@ public final class ActivityManagerService extends ActivityManagerNative mBatteryStatsService.shutdown(); synchronized (this) { mProcessStats.shutdownLocked(); + notifyTaskPersisterLocked(null, true); } - notifyTaskPersisterLocked(null, true); return timedout; } - + public final void activitySlept(IBinder token) { if (localLOGV) Slog.v(TAG, "Activity slept: token=" + token); diff --git a/services/core/java/com/android/server/am/ActivityRecord.java b/services/core/java/com/android/server/am/ActivityRecord.java index c12cadb..e37d5f3 100755 --- a/services/core/java/com/android/server/am/ActivityRecord.java +++ b/services/core/java/com/android/server/am/ActivityRecord.java @@ -69,7 +69,7 @@ import java.util.Objects; final class ActivityRecord { static final String TAG = ActivityManagerService.TAG; static final boolean DEBUG_SAVED_STATE = ActivityStackSupervisor.DEBUG_SAVED_STATE; - final public static String RECENTS_PACKAGE_NAME = "com.android.systemui.recent"; + final public static String RECENTS_PACKAGE_NAME = "com.android.systemui.recents"; private static final String TAG_ACTIVITY = "activity"; private static final String ATTR_ID = "id"; @@ -792,7 +792,7 @@ final class ActivityRecord { } } - void updateThumbnail(Bitmap newThumbnail, CharSequence description) { + void updateThumbnailLocked(Bitmap newThumbnail, CharSequence description) { if (newThumbnail != null) { if (ActivityManagerService.DEBUG_THUMBNAILS) Slog.i(ActivityManagerService.TAG, "Setting thumbnail of " + this + " to " + newThumbnail); diff --git a/services/core/java/com/android/server/am/ActivityStack.java b/services/core/java/com/android/server/am/ActivityStack.java index ea694ad..ad86aea 100755 --- a/services/core/java/com/android/server/am/ActivityStack.java +++ b/services/core/java/com/android/server/am/ActivityStack.java @@ -65,7 +65,6 @@ import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.res.Configuration; -import android.content.res.Resources; import android.graphics.Bitmap; import android.net.Uri; import android.os.Binder; @@ -838,7 +837,7 @@ final class ActivityStack { clearLaunchTime(prev); final ActivityRecord next = mStackSupervisor.topRunningActivityLocked(); if (mService.mHasRecents && (next == null || next.noDisplay || next.task != prev.task || uiSleeping)) { - prev.updateThumbnail(screenshotActivities(prev), null); + prev.updateThumbnailLocked(screenshotActivities(prev), null); } stopFullyDrawnTraceIfNeeded(); @@ -950,7 +949,7 @@ final class ActivityStack { r.icicle = icicle; r.haveState = true; r.launchCount = 0; - r.updateThumbnail(null, description); + r.updateThumbnailLocked(null, description); } if (!r.stopped) { if (DEBUG_STATES) Slog.v(TAG, "Moving to STOPPED: " + r + " (stop complete)"); @@ -1060,6 +1059,9 @@ final class ActivityStack { } prev.cpuTimeAtResume = 0; // reset it } + + // Notfiy when the task stack has changed + mService.notifyTaskStackChangedLocked(); } /** @@ -4105,7 +4107,7 @@ final class ActivityStack { // Task creator asked to remove this when done, or this task was a voice // interaction, so it should not remain on the recent tasks list. mService.mRecentTasks.remove(task); - task.removedFromRecents(mService.mTaskPersister); + task.removedFromRecents(); } } diff --git a/services/core/java/com/android/server/am/ActivityStackSupervisor.java b/services/core/java/com/android/server/am/ActivityStackSupervisor.java index 38809cb..d9396d8 100644 --- a/services/core/java/com/android/server/am/ActivityStackSupervisor.java +++ b/services/core/java/com/android/server/am/ActivityStackSupervisor.java @@ -2871,6 +2871,7 @@ public final class ActivityStackSupervisor implements DisplayListener { final TaskRecord task = r.task; task.setLastThumbnail(task.stack.screenshotActivities(r)); mService.addRecentTaskLocked(task); + mService.notifyTaskStackChangedLocked(); mWindowManager.setAppVisibility(r.appToken, false); } diff --git a/services/core/java/com/android/server/am/TaskRecord.java b/services/core/java/com/android/server/am/TaskRecord.java index ee93233..d726685 100644 --- a/services/core/java/com/android/server/am/TaskRecord.java +++ b/services/core/java/com/android/server/am/TaskRecord.java @@ -383,12 +383,12 @@ final class TaskRecord { setNextAffiliate(null); } - void removedFromRecents(TaskPersister persister) { + void removedFromRecents() { disposeThumbnail(); closeRecentsChain(); if (inRecents) { inRecents = false; - persister.wakeup(this, false); + mService.notifyTaskPersisterLocked(this, false); } } diff --git a/services/core/java/com/android/server/connectivity/NetworkMonitor.java b/services/core/java/com/android/server/connectivity/NetworkMonitor.java index 225097f..39718ea 100644 --- a/services/core/java/com/android/server/connectivity/NetworkMonitor.java +++ b/services/core/java/com/android/server/connectivity/NetworkMonitor.java @@ -215,6 +215,8 @@ public class NetworkMonitor extends StateMachine { // Default to 5s reevaluation delay. private static final int DEFAULT_REEVALUATE_DELAY_MS = 5000; private static final int MAX_RETRIES = 10; + // Between groups of MAX_RETRIES evaluation attempts, pause 10 mins in hopes ISP outage passes. + private static final int REEVALUATE_PAUSE_MS = 10*60*1000; private final int mReevaluateDelayMs; private int mReevaluateToken = 0; private static final int INVALID_UID = -1; @@ -345,6 +347,7 @@ public class NetworkMonitor extends StateMachine { public void enter() { mConnectivityServiceHandler.sendMessage(obtainMessage(EVENT_NETWORK_TESTED, NETWORK_TEST_RESULT_INVALID, 0, mNetworkAgentInfo)); + if (!mUserDoesNotWant) sendMessageDelayed(CMD_FORCE_REEVALUATION, REEVALUATE_PAUSE_MS); } @Override @@ -360,6 +363,15 @@ public class NetworkMonitor extends StateMachine { return NOT_HANDLED; } } + + @Override + public void exit() { + // NOTE: This removes the delayed message posted by enter() but will inadvertently + // remove any other CMD_FORCE_REEVALUATION in the message queue. At the moment this + // is harmless. If in the future this becomes problematic a different message could + // be used. + removeMessages(CMD_FORCE_REEVALUATION); + } } // Being in the ValidatedState State indicates a Network is: diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 57a89679..6f1e851 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -4539,25 +4539,34 @@ public class PackageManagerService extends IPackageManager.Stub { try { IMountService ms = PackageHelper.getMountService(); if (ms != null) { - final long interval = android.provider.Settings.Global.getLong( - mContext.getContentResolver(), - android.provider.Settings.Global.FSTRIM_MANDATORY_INTERVAL, - DEFAULT_MANDATORY_FSTRIM_INTERVAL); - if (interval > 0) { - final long timeSinceLast = System.currentTimeMillis() - ms.lastMaintenance(); - if (timeSinceLast > interval) { - Slog.w(TAG, "No disk maintenance in " + timeSinceLast - + "; running immediately"); - if (!isFirstBoot()) { - try { - ActivityManagerNative.getDefault().showBootMessage( - mContext.getResources().getString( - R.string.android_upgrading_fstrim), true); - } catch (RemoteException e) { - } + final boolean isUpgrade = isUpgrade(); + boolean doTrim = isUpgrade; + if (doTrim) { + Slog.w(TAG, "Running disk maintenance immediately due to system update"); + } else { + final long interval = android.provider.Settings.Global.getLong( + mContext.getContentResolver(), + android.provider.Settings.Global.FSTRIM_MANDATORY_INTERVAL, + DEFAULT_MANDATORY_FSTRIM_INTERVAL); + if (interval > 0) { + final long timeSinceLast = System.currentTimeMillis() - ms.lastMaintenance(); + if (timeSinceLast > interval) { + doTrim = true; + Slog.w(TAG, "No disk maintenance in " + timeSinceLast + + "; running immediately"); + } + } + } + if (doTrim) { + if (!isFirstBoot()) { + try { + ActivityManagerNative.getDefault().showBootMessage( + mContext.getResources().getString( + R.string.android_upgrading_fstrim), true); + } catch (RemoteException e) { } - ms.runMaintenance(); } + ms.runMaintenance(); } } else { Slog.e(TAG, "Mount service unavailable!"); diff --git a/services/core/java/com/android/server/wm/AppTransition.java b/services/core/java/com/android/server/wm/AppTransition.java index f6e8bcf..c0d54e1 100644 --- a/services/core/java/com/android/server/wm/AppTransition.java +++ b/services/core/java/com/android/server/wm/AppTransition.java @@ -118,7 +118,7 @@ public class AppTransition implements Dump { private static final float RECENTS_THUMBNAIL_FADEOUT_FRACTION = 0.3f; private static final int DEFAULT_APP_TRANSITION_DURATION = 250; - private static final int THUMBNAIL_APP_TRANSITION_DURATION = 300; + private static final int THUMBNAIL_APP_TRANSITION_DURATION = 325; private static final int THUMBNAIL_APP_TRANSITION_ALPHA_DURATION = 325; private final Context mContext; diff --git a/telecomm/java/android/telecom/AudioState.java b/telecomm/java/android/telecom/AudioState.java index bd63e00..3271ebf 100644 --- a/telecomm/java/android/telecom/AudioState.java +++ b/telecomm/java/android/telecom/AudioState.java @@ -91,7 +91,7 @@ public final class AudioState implements Parcelable { @Override public String toString() { return String.format(Locale.US, - "[AudioState isMuted: %b, route; %s, supportedRouteMask: %s]", + "[AudioState isMuted: %b, route: %s, supportedRouteMask: %s]", isMuted, audioRouteToString(route), audioRouteToString(supportedRouteMask)); diff --git a/telecomm/java/android/telecom/Connection.java b/telecomm/java/android/telecom/Connection.java index 04274c7..f3b0586 100644 --- a/telecomm/java/android/telecom/Connection.java +++ b/telecomm/java/android/telecom/Connection.java @@ -838,6 +838,11 @@ public abstract class Connection implements IConferenceable { return mConnectionCapabilities; } + /** @hide */ + @SystemApi @Deprecated public final int getCallCapabilities() { + return getConnectionCapabilities(); + } + /** * Sets the value of the {@link #getAddress()} property. * diff --git a/telephony/java/android/telephony/ServiceState.java b/telephony/java/android/telephony/ServiceState.java index 8c2a4eb..559a58c 100644 --- a/telephony/java/android/telephony/ServiceState.java +++ b/telephony/java/android/telephony/ServiceState.java @@ -167,10 +167,40 @@ public class ServiceState implements Parcelable { private int mVoiceRegState = STATE_OUT_OF_SERVICE; private int mDataRegState = STATE_OUT_OF_SERVICE; - private boolean mRoaming; - private String mOperatorAlphaLong; - private String mOperatorAlphaShort; - private String mOperatorNumeric; + + /** + * Roaming type + * HOME : in home network + * @hide + */ + public static final int ROAMING_TYPE_NOT_ROAMING = 0; + /** + * Roaming type + * UNKNOWN : in a roaming network, but we can not tell if it's domestic or international + * @hide + */ + public static final int ROAMING_TYPE_UNKNOWN = 1; + /** + * Roaming type + * DOMESTIC : in domestic roaming network + * @hide + */ + public static final int ROAMING_TYPE_DOMESTIC = 2; + /** + * Roaming type + * INTERNATIONAL : in international roaming network + * @hide + */ + public static final int ROAMING_TYPE_INTERNATIONAL = 3; + + private int mVoiceRoamingType; + private int mDataRoamingType; + private String mVoiceOperatorAlphaLong; + private String mVoiceOperatorAlphaShort; + private String mVoiceOperatorNumeric; + private String mDataOperatorAlphaLong; + private String mDataOperatorAlphaShort; + private String mDataOperatorNumeric; private boolean mIsManualNetworkSelection; private boolean mIsEmergencyOnly; @@ -187,6 +217,29 @@ public class ServiceState implements Parcelable { private int mCdmaEriIconMode; /** + * get String description of roaming type + * @hide + */ + public static final String getRoamingLogString(int roamingType) { + switch (roamingType) { + case ROAMING_TYPE_NOT_ROAMING: + return "home"; + + case ROAMING_TYPE_UNKNOWN: + return "roaming"; + + case ROAMING_TYPE_DOMESTIC: + return "Domestic Roaming"; + + case ROAMING_TYPE_INTERNATIONAL: + return "International Roaming"; + + default: + return "UNKNOWN"; + } + } + + /** * Create a new ServiceState from a intent notifier Bundle * * This method is used by PhoneStateIntentReceiver and maybe by @@ -221,10 +274,14 @@ public class ServiceState implements Parcelable { protected void copyFrom(ServiceState s) { mVoiceRegState = s.mVoiceRegState; mDataRegState = s.mDataRegState; - mRoaming = s.mRoaming; - mOperatorAlphaLong = s.mOperatorAlphaLong; - mOperatorAlphaShort = s.mOperatorAlphaShort; - mOperatorNumeric = s.mOperatorNumeric; + mVoiceRoamingType = s.mVoiceRoamingType; + mDataRoamingType = s.mDataRoamingType; + mVoiceOperatorAlphaLong = s.mVoiceOperatorAlphaLong; + mVoiceOperatorAlphaShort = s.mVoiceOperatorAlphaShort; + mVoiceOperatorNumeric = s.mVoiceOperatorNumeric; + mDataOperatorAlphaLong = s.mDataOperatorAlphaLong; + mDataOperatorAlphaShort = s.mDataOperatorAlphaShort; + mDataOperatorNumeric = s.mDataOperatorNumeric; mIsManualNetworkSelection = s.mIsManualNetworkSelection; mRilVoiceRadioTechnology = s.mRilVoiceRadioTechnology; mRilDataRadioTechnology = s.mRilDataRadioTechnology; @@ -244,10 +301,14 @@ public class ServiceState implements Parcelable { public ServiceState(Parcel in) { mVoiceRegState = in.readInt(); mDataRegState = in.readInt(); - mRoaming = in.readInt() != 0; - mOperatorAlphaLong = in.readString(); - mOperatorAlphaShort = in.readString(); - mOperatorNumeric = in.readString(); + mVoiceRoamingType = in.readInt(); + mDataRoamingType = in.readInt(); + mVoiceOperatorAlphaLong = in.readString(); + mVoiceOperatorAlphaShort = in.readString(); + mVoiceOperatorNumeric = in.readString(); + mDataOperatorAlphaLong = in.readString(); + mDataOperatorAlphaShort = in.readString(); + mDataOperatorNumeric = in.readString(); mIsManualNetworkSelection = in.readInt() != 0; mRilVoiceRadioTechnology = in.readInt(); mRilDataRadioTechnology = in.readInt(); @@ -264,10 +325,14 @@ public class ServiceState implements Parcelable { public void writeToParcel(Parcel out, int flags) { out.writeInt(mVoiceRegState); out.writeInt(mDataRegState); - out.writeInt(mRoaming ? 1 : 0); - out.writeString(mOperatorAlphaLong); - out.writeString(mOperatorAlphaShort); - out.writeString(mOperatorNumeric); + out.writeInt(mVoiceRoamingType); + out.writeInt(mDataRoamingType); + out.writeString(mVoiceOperatorAlphaLong); + out.writeString(mVoiceOperatorAlphaShort); + out.writeString(mVoiceOperatorNumeric); + out.writeString(mDataOperatorAlphaLong); + out.writeString(mDataOperatorAlphaShort); + out.writeString(mDataOperatorNumeric); out.writeInt(mIsManualNetworkSelection ? 1 : 0); out.writeInt(mRilVoiceRadioTechnology); out.writeInt(mRilDataRadioTechnology); @@ -337,10 +402,45 @@ public class ServiceState implements Parcelable { * * @return true if TS 27.007 7.2 roaming is true * and ONS is different from SPN - * */ public boolean getRoaming() { - return mRoaming; + return getVoiceRoaming() || getDataRoaming(); + } + + /** + * Get current voice network roaming status + * @return roaming status + * @hide + */ + public boolean getVoiceRoaming() { + return mVoiceRoamingType != ROAMING_TYPE_NOT_ROAMING; + } + + /** + * Get current voice network roaming type + * @return roaming type + * @hide + */ + public int getVoiceRoamingType() { + return mVoiceRoamingType; + } + + /** + * Get current data network roaming type + * @return roaming type + * @hide + */ + public boolean getDataRoaming() { + return mDataRoamingType != ROAMING_TYPE_NOT_ROAMING; + } + + /** + * Get current data network roaming type + * @return roaming type + * @hide + */ + public int getDataRoamingType() { + return mDataRoamingType; } /** @@ -387,7 +487,25 @@ public class ServiceState implements Parcelable { * @return long name of operator, null if unregistered or unknown */ public String getOperatorAlphaLong() { - return mOperatorAlphaLong; + return mVoiceOperatorAlphaLong; + } + + /** + * Get current registered voice network operator name in long alphanumeric format. + * @return long name of operator + * @hide + */ + public String getVoiceOperatorAlphaLong() { + return mVoiceOperatorAlphaLong; + } + + /** + * Get current registered data network operator name in long alphanumeric format. + * @return long name of voice operator + * @hide + */ + public String getDataOperatorAlphaLong() { + return mDataOperatorAlphaLong; } /** @@ -398,7 +516,25 @@ public class ServiceState implements Parcelable { * @return short name of operator, null if unregistered or unknown */ public String getOperatorAlphaShort() { - return mOperatorAlphaShort; + return mVoiceOperatorAlphaShort; + } + + /** + * Get current registered voice network operator name in short alphanumeric format. + * @return short name of operator, null if unregistered or unknown + * @hide + */ + public String getVoiceOperatorAlphaShort() { + return mVoiceOperatorAlphaShort; + } + + /** + * Get current registered data network operator name in short alphanumeric format. + * @return short name of operator, null if unregistered or unknown + * @hide + */ + public String getDataOperatorAlphaShort() { + return mDataOperatorAlphaShort; } /** @@ -414,7 +550,25 @@ public class ServiceState implements Parcelable { * {@link com.android.internal.telephony.MccTable#countryCodeForMcc(int)}. */ public String getOperatorNumeric() { - return mOperatorNumeric; + return mVoiceOperatorNumeric; + } + + /** + * Get current registered voice network operator numeric id. + * @return numeric format of operator, null if unregistered or unknown + * @hide + */ + public String getVoiceOperatorNumeric() { + return mVoiceOperatorNumeric; + } + + /** + * Get current registered data network operator numeric id. + * @return numeric format of operator, null if unregistered or unknown + * @hide + */ + public String getDataOperatorNumeric() { + return mDataOperatorNumeric; } /** @@ -430,11 +584,15 @@ public class ServiceState implements Parcelable { public int hashCode() { return ((mVoiceRegState * 31) + (mDataRegState * 37) - + (mRoaming ? 1 : 0) + + mVoiceRoamingType + + mDataRoamingType + (mIsManualNetworkSelection ? 1 : 0) - + ((null == mOperatorAlphaLong) ? 0 : mOperatorAlphaLong.hashCode()) - + ((null == mOperatorAlphaShort) ? 0 : mOperatorAlphaShort.hashCode()) - + ((null == mOperatorNumeric) ? 0 : mOperatorNumeric.hashCode()) + + ((null == mVoiceOperatorAlphaLong) ? 0 : mVoiceOperatorAlphaLong.hashCode()) + + ((null == mVoiceOperatorAlphaShort) ? 0 : mVoiceOperatorAlphaShort.hashCode()) + + ((null == mVoiceOperatorNumeric) ? 0 : mVoiceOperatorNumeric.hashCode()) + + ((null == mDataOperatorAlphaLong) ? 0 : mDataOperatorAlphaLong.hashCode()) + + ((null == mDataOperatorAlphaShort) ? 0 : mDataOperatorAlphaShort.hashCode()) + + ((null == mDataOperatorNumeric) ? 0 : mDataOperatorNumeric.hashCode()) + mCdmaRoamingIndicator + mCdmaDefaultRoamingIndicator + (mIsEmergencyOnly ? 1 : 0)); @@ -456,11 +614,15 @@ public class ServiceState implements Parcelable { return (mVoiceRegState == s.mVoiceRegState && mDataRegState == s.mDataRegState - && mRoaming == s.mRoaming && mIsManualNetworkSelection == s.mIsManualNetworkSelection - && equalsHandlesNulls(mOperatorAlphaLong, s.mOperatorAlphaLong) - && equalsHandlesNulls(mOperatorAlphaShort, s.mOperatorAlphaShort) - && equalsHandlesNulls(mOperatorNumeric, s.mOperatorNumeric) + && mVoiceRoamingType == s.mVoiceRoamingType + && mDataRoamingType == s.mDataRoamingType + && equalsHandlesNulls(mVoiceOperatorAlphaLong, s.mVoiceOperatorAlphaLong) + && equalsHandlesNulls(mVoiceOperatorAlphaShort, s.mVoiceOperatorAlphaShort) + && equalsHandlesNulls(mVoiceOperatorNumeric, s.mVoiceOperatorNumeric) + && equalsHandlesNulls(mDataOperatorAlphaLong, s.mDataOperatorAlphaLong) + && equalsHandlesNulls(mDataOperatorAlphaShort, s.mDataOperatorAlphaShort) + && equalsHandlesNulls(mDataOperatorNumeric, s.mDataOperatorNumeric) && equalsHandlesNulls(mRilVoiceRadioTechnology, s.mRilVoiceRadioTechnology) && equalsHandlesNulls(mRilDataRadioTechnology, s.mRilDataRadioTechnology) && equalsHandlesNulls(mCssIndicator, s.mCssIndicator) @@ -548,10 +710,17 @@ public class ServiceState implements Parcelable { String radioTechnology = rilRadioTechnologyToString(mRilVoiceRadioTechnology); String dataRadioTechnology = rilRadioTechnologyToString(mRilDataRadioTechnology); - return (mVoiceRegState + " " + mDataRegState + " " + (mRoaming ? "roaming" : "home") - + " " + mOperatorAlphaLong - + " " + mOperatorAlphaShort - + " " + mOperatorNumeric + return (mVoiceRegState + " " + mDataRegState + + " " + + "voice " + getRoamingLogString(mVoiceRoamingType) + + " " + + "data " + getRoamingLogString(mDataRoamingType) + + " " + mVoiceOperatorAlphaLong + + " " + mVoiceOperatorAlphaShort + + " " + mVoiceOperatorNumeric + + " " + mDataOperatorAlphaLong + + " " + mDataOperatorAlphaShort + + " " + mDataOperatorNumeric + " " + (mIsManualNetworkSelection ? "(manual)" : "") + " " + radioTechnology + " " + dataRadioTechnology @@ -567,10 +736,14 @@ public class ServiceState implements Parcelable { if (DBG) Rlog.d(LOG_TAG, "[ServiceState] setNullState=" + state); mVoiceRegState = state; mDataRegState = state; - mRoaming = false; - mOperatorAlphaLong = null; - mOperatorAlphaShort = null; - mOperatorNumeric = null; + mVoiceRoamingType = ROAMING_TYPE_NOT_ROAMING; + mDataRoamingType = ROAMING_TYPE_NOT_ROAMING; + mVoiceOperatorAlphaLong = null; + mVoiceOperatorAlphaShort = null; + mVoiceOperatorNumeric = null; + mDataOperatorAlphaLong = null; + mDataOperatorAlphaShort = null; + mDataOperatorNumeric = null; mIsManualNetworkSelection = false; mRilVoiceRadioTechnology = 0; mRilDataRadioTechnology = 0; @@ -610,9 +783,29 @@ public class ServiceState implements Parcelable { } public void setRoaming(boolean roaming) { - mRoaming = roaming; + mVoiceRoamingType = (roaming ? ROAMING_TYPE_UNKNOWN : ROAMING_TYPE_NOT_ROAMING); + mDataRoamingType = mVoiceRoamingType; } + /** @hide */ + public void setVoiceRoaming(boolean roaming) { + mVoiceRoamingType = (roaming ? ROAMING_TYPE_UNKNOWN : ROAMING_TYPE_NOT_ROAMING); + } + + /** @hide */ + public void setVoiceRoamingType(int type) { + mVoiceRoamingType = type; + } + + /** @hide */ + public void setDataRoaming(boolean dataRoaming) { + mDataRoamingType = (dataRoaming ? ROAMING_TYPE_UNKNOWN : ROAMING_TYPE_NOT_ROAMING); + } + + /** @hide */ + public void setDataRoamingType(int type) { + mDataRoamingType = type; + } /** * @hide @@ -650,9 +843,26 @@ public class ServiceState implements Parcelable { } public void setOperatorName(String longName, String shortName, String numeric) { - mOperatorAlphaLong = longName; - mOperatorAlphaShort = shortName; - mOperatorNumeric = numeric; + mVoiceOperatorAlphaLong = longName; + mVoiceOperatorAlphaShort = shortName; + mVoiceOperatorNumeric = numeric; + mDataOperatorAlphaLong = longName; + mDataOperatorAlphaShort = shortName; + mDataOperatorNumeric = numeric; + } + + /** @hide */ + public void setVoiceOperatorName(String longName, String shortName, String numeric) { + mVoiceOperatorAlphaLong = longName; + mVoiceOperatorAlphaShort = shortName; + mVoiceOperatorNumeric = numeric; + } + + /** @hide */ + public void setDataOperatorName(String longName, String shortName, String numeric) { + mDataOperatorAlphaLong = longName; + mDataOperatorAlphaShort = shortName; + mDataOperatorNumeric = numeric; } /** @@ -662,7 +872,18 @@ public class ServiceState implements Parcelable { * @hide */ public void setOperatorAlphaLong(String longName) { - mOperatorAlphaLong = longName; + mVoiceOperatorAlphaLong = longName; + mDataOperatorAlphaLong = longName; + } + + /** @hide */ + public void setVoiceOperatorAlphaLong(String longName) { + mVoiceOperatorAlphaLong = longName; + } + + /** @hide */ + public void setDataOperatorAlphaLong(String longName) { + mDataOperatorAlphaLong = longName; } public void setIsManualSelection(boolean isManual) { @@ -689,10 +910,14 @@ public class ServiceState implements Parcelable { private void setFromNotifierBundle(Bundle m) { mVoiceRegState = m.getInt("voiceRegState"); mDataRegState = m.getInt("dataRegState"); - mRoaming = m.getBoolean("roaming"); - mOperatorAlphaLong = m.getString("operator-alpha-long"); - mOperatorAlphaShort = m.getString("operator-alpha-short"); - mOperatorNumeric = m.getString("operator-numeric"); + mVoiceRoamingType = m.getInt("voiceRoamingType"); + mDataRoamingType = m.getInt("dataRoamingType"); + mVoiceOperatorAlphaLong = m.getString("operator-alpha-long"); + mVoiceOperatorAlphaShort = m.getString("operator-alpha-short"); + mVoiceOperatorNumeric = m.getString("operator-numeric"); + mDataOperatorAlphaLong = m.getString("data-operator-alpha-long"); + mDataOperatorAlphaShort = m.getString("data-operator-alpha-short"); + mDataOperatorNumeric = m.getString("data-operator-numeric"); mIsManualNetworkSelection = m.getBoolean("manual"); mRilVoiceRadioTechnology = m.getInt("radioTechnology"); mRilDataRadioTechnology = m.getInt("dataRadioTechnology"); @@ -713,10 +938,14 @@ public class ServiceState implements Parcelable { public void fillInNotifierBundle(Bundle m) { m.putInt("voiceRegState", mVoiceRegState); m.putInt("dataRegState", mDataRegState); - m.putBoolean("roaming", Boolean.valueOf(mRoaming)); - m.putString("operator-alpha-long", mOperatorAlphaLong); - m.putString("operator-alpha-short", mOperatorAlphaShort); - m.putString("operator-numeric", mOperatorNumeric); + m.putInt("voiceRoamingType", mVoiceRoamingType); + m.putInt("dataRoamingType", mDataRoamingType); + m.putString("operator-alpha-long", mVoiceOperatorAlphaLong); + m.putString("operator-alpha-short", mVoiceOperatorAlphaShort); + m.putString("operator-numeric", mVoiceOperatorNumeric); + m.putString("data-operator-alpha-long", mDataOperatorAlphaLong); + m.putString("data-operator-alpha-short", mDataOperatorAlphaShort); + m.putString("data-operator-numeric", mDataOperatorNumeric); m.putBoolean("manual", Boolean.valueOf(mIsManualNetworkSelection)); m.putInt("radioTechnology", mRilVoiceRadioTechnology); m.putInt("dataRadioTechnology", mRilDataRadioTechnology); diff --git a/telephony/java/android/telephony/SubscriptionManager.java b/telephony/java/android/telephony/SubscriptionManager.java index 40d2e77..abf1ead 100644 --- a/telephony/java/android/telephony/SubscriptionManager.java +++ b/telephony/java/android/telephony/SubscriptionManager.java @@ -1103,5 +1103,35 @@ public class SubscriptionManager { return Boolean.parseBoolean(TelephonyManager.getTelephonyProperty(phoneId, TelephonyProperties.PROPERTY_OPERATOR_ISROAMING, null)); } + + /** + * Returns a constant indicating the state of sim for the subscription. + * + * @param subId + * + * {@See TelephonyManager#SIM_STATE_UNKNOWN} + * {@See TelephonyManager#SIM_STATE_ABSENT} + * {@See TelephonyManager#SIM_STATE_PIN_REQUIRED} + * {@See TelephonyManager#SIM_STATE_PUK_REQUIRED} + * {@See TelephonyManager#SIM_STATE_NETWORK_LOCKED} + * {@See TelephonyManager#SIM_STATE_READY} + * {@See TelephonyManager#SIM_STATE_NOT_READY} + * {@See TelephonyManager#SIM_STATE_PERM_DISABLED} + * {@See TelephonyManager#SIM_STATE_CARD_IO_ERROR} + * + * {@hide} + */ + public static int getSimStateForSubscriber(int subId) { + int simState; + + try { + ISub iSub = ISub.Stub.asInterface(ServiceManager.getService("isub")); + simState = iSub.getSimStateForSubscriber(subId); + } catch (RemoteException ex) { + simState = TelephonyManager.SIM_STATE_UNKNOWN; + } + logd("getSimStateForSubscriber: simState=" + simState + " subId=" + subId); + return simState; + } } diff --git a/telephony/java/android/telephony/TelephonyManager.java b/telephony/java/android/telephony/TelephonyManager.java index de2a6da..751e11b 100644 --- a/telephony/java/android/telephony/TelephonyManager.java +++ b/telephony/java/android/telephony/TelephonyManager.java @@ -1416,10 +1416,14 @@ public class TelephonyManager { // // - /** SIM card state: Unknown. Signifies that the SIM is in transition - * between states. For example, when the user inputs the SIM pin - * under PIN_REQUIRED state, a query for sim status returns - * this state before turning to SIM_STATE_READY. */ + /** + * SIM card state: Unknown. Signifies that the SIM is in transition + * between states. For example, when the user inputs the SIM pin + * under PIN_REQUIRED state, a query for sim status returns + * this state before turning to SIM_STATE_READY. + * + * These are the ordinal value of IccCardConstants.State. + */ public static final int SIM_STATE_UNKNOWN = 0; /** SIM card state: no SIM card is available in the device */ public static final int SIM_STATE_ABSENT = 1; @@ -1427,14 +1431,22 @@ public class TelephonyManager { public static final int SIM_STATE_PIN_REQUIRED = 2; /** SIM card state: Locked: requires the user's SIM PUK to unlock */ public static final int SIM_STATE_PUK_REQUIRED = 3; - /** SIM card state: Locked: requries a network PIN to unlock */ + /** SIM card state: Locked: requires a network PIN to unlock */ public static final int SIM_STATE_NETWORK_LOCKED = 4; /** SIM card state: Ready */ public static final int SIM_STATE_READY = 5; - /** SIM card state: SIM Card Error, Sim Card is present but faulty + /** SIM card state: SIM Card is NOT READY + *@hide + */ + public static final int SIM_STATE_NOT_READY = 6; + /** SIM card state: SIM Card Error, permanently disabled + *@hide + */ + public static final int SIM_STATE_PERM_DISABLED = 7; + /** SIM card state: SIM Card Error, present but faulty *@hide */ - public static final int SIM_STATE_CARD_IO_ERROR = 6; + public static final int SIM_STATE_CARD_IO_ERROR = 8; /** * @return true if a ICC card is present @@ -1464,8 +1476,7 @@ public class TelephonyManager { } /** - * Returns a constant indicating the state of the - * device SIM card. + * Returns a constant indicating the state of the default SIM card. * * @see #SIM_STATE_UNKNOWN * @see #SIM_STATE_ABSENT @@ -1473,6 +1484,8 @@ public class TelephonyManager { * @see #SIM_STATE_PUK_REQUIRED * @see #SIM_STATE_NETWORK_LOCKED * @see #SIM_STATE_READY + * @see #SIM_STATE_NOT_READY + * @see #SIM_STATE_PERM_DISABLED * @see #SIM_STATE_CARD_IO_ERROR */ public int getSimState() { @@ -1480,10 +1493,9 @@ public class TelephonyManager { } /** - * Returns a constant indicating the state of the - * device SIM card in a slot. + * Returns a constant indicating the state of the device SIM card in a slot. * - * @param slotId + * @param slotIdx * * @see #SIM_STATE_UNKNOWN * @see #SIM_STATE_ABSENT @@ -1491,39 +1503,20 @@ public class TelephonyManager { * @see #SIM_STATE_PUK_REQUIRED * @see #SIM_STATE_NETWORK_LOCKED * @see #SIM_STATE_READY + * @see #SIM_STATE_NOT_READY + * @see #SIM_STATE_PERM_DISABLED + * @see #SIM_STATE_CARD_IO_ERROR */ /** {@hide} */ - // FIXME the argument to pass is subId ?? - public int getSimState(int slotId) { - int[] subId = SubscriptionManager.getSubId(slotId); + public int getSimState(int slotIdx) { + int[] subId = SubscriptionManager.getSubId(slotIdx); if (subId == null || subId.length == 0) { - return SIM_STATE_ABSENT; - } - // FIXME Do not use a property to determine SIM_STATE, call - // appropriate method on some object. - int phoneId = SubscriptionManager.getPhoneId(subId[0]); - String prop = getTelephonyProperty(phoneId, TelephonyProperties.PROPERTY_SIM_STATE, ""); - if ("ABSENT".equals(prop)) { - return SIM_STATE_ABSENT; - } - else if ("PIN_REQUIRED".equals(prop)) { - return SIM_STATE_PIN_REQUIRED; - } - else if ("PUK_REQUIRED".equals(prop)) { - return SIM_STATE_PUK_REQUIRED; - } - else if ("NETWORK_LOCKED".equals(prop)) { - return SIM_STATE_NETWORK_LOCKED; - } - else if ("READY".equals(prop)) { - return SIM_STATE_READY; - } - else if ("CARD_IO_ERROR".equals(prop)) { - return SIM_STATE_CARD_IO_ERROR; - } - else { + Rlog.d(TAG, "getSimState:- empty subId return SIM_STATE_ABSENT"); return SIM_STATE_UNKNOWN; } + int simState = SubscriptionManager.getSimStateForSubscriber(subId[0]); + Rlog.d(TAG, "getSimState: simState=" + simState + " slotIdx=" + slotIdx); + return simState; } /** @@ -1535,7 +1528,7 @@ public class TelephonyManager { * @see #getSimState */ public String getSimOperator() { - int subId = mSubscriptionManager.getDefaultDataSubId(); + int subId = SubscriptionManager.getDefaultDataSubId(); if (!SubscriptionManager.isUsableSubIdValue(subId)) { subId = SubscriptionManager.getDefaultSmsSubId(); if (!SubscriptionManager.isUsableSubIdValue(subId)) { @@ -2758,8 +2751,6 @@ public class TelephonyManager { * @hide */ public static void setTelephonyProperty(int phoneId, String property, String value) { - Rlog.d(TAG, "setTelephonyProperty property: " + property + " phoneId: " + phoneId + - " value: " + value); String propVal = ""; String p[] = null; String prop = SystemProperties.get(property); @@ -2773,7 +2764,8 @@ public class TelephonyManager { } if (!SubscriptionManager.isValidPhoneId(phoneId)) { - Rlog.d(TAG, "setTelephonyProperty invalid phone id"); + Rlog.d(TAG, "setTelephonyProperty: invalid phoneId=" + phoneId + + " property=" + property + " value: " + value + " prop=" + prop); return; } @@ -2792,13 +2784,15 @@ public class TelephonyManager { } } - // TODO: workaround for QC - if (property.length() > SystemProperties.PROP_NAME_MAX || propVal.length() > SystemProperties.PROP_VALUE_MAX) { - Rlog.d(TAG, "setTelephonyProperty length too long:" + property + ", " + propVal); + if (property.length() > SystemProperties.PROP_NAME_MAX + || propVal.length() > SystemProperties.PROP_VALUE_MAX) { + Rlog.d(TAG, "setTelephonyProperty: property to long phoneId=" + phoneId + + " property=" + property + " value: " + value + " propVal=" + propVal); return; } - Rlog.d(TAG, "setTelephonyProperty property=" + property + " propVal=" + propVal); + Rlog.d(TAG, "setTelephonyProperty: success phoneId=" + phoneId + + " property=" + property + " value: " + value + " propVal=" + propVal); SystemProperties.set(property, propVal); } @@ -2904,13 +2898,16 @@ public class TelephonyManager { propVal = values[phoneId]; } } + Rlog.d(TAG, "getTelephonyProperty: return propVal='" + propVal + "' phoneId=" + phoneId + + " property='" + property + "' defaultVal='" + defaultVal + "' prop=" + prop); return propVal == null ? defaultVal : propVal; } /** @hide */ public int getSimCount() { + // FIXME Need to get it from Telephony Dev Controller when that gets implemented! + // and then this method shouldn't be used at all! if(isMultiSimEnabled()) { - //FIXME Need to get it from Telephony Devcontroller return 2; } else { return 1; diff --git a/telephony/java/com/android/ims/ImsReasonInfo.java b/telephony/java/com/android/ims/ImsReasonInfo.java index 2ab9648..2482249 100644 --- a/telephony/java/com/android/ims/ImsReasonInfo.java +++ b/telephony/java/com/android/ims/ImsReasonInfo.java @@ -195,6 +195,10 @@ public class ImsReasonInfo implements Parcelable { public static final int CODE_USER_IGNORE = 503; // User declines an incoming call public static final int CODE_USER_DECLINE = 504; + // Device declines/ends a call due to low battery + public static final int CODE_LOW_BATTERY = 505; + // Device declines call due to blacklisted call ID + public static final int CODE_BLACKLISTED_CALL_ID = 506; // IMS -> Telephony // The call is terminated by the network or remote user public static final int CODE_USER_TERMINATED_BY_REMOTE = 510; diff --git a/telephony/java/com/android/internal/telephony/IMms.aidl b/telephony/java/com/android/internal/telephony/IMms.aidl index 0322499..49ac400 100644 --- a/telephony/java/com/android/internal/telephony/IMms.aidl +++ b/telephony/java/com/android/internal/telephony/IMms.aidl @@ -61,40 +61,6 @@ interface IMms { in PendingIntent downloadedIntent); /** - * Update the status of a pending (send-by-IP) MMS message handled by the carrier app. - * If the carrier app fails to send this message, it may be resent via carrier network - * depending on the status code. - * - * The caller should have carrier privileges. - * @see android.telephony.TelephonyManager.hasCarrierPrivileges - * - * @param messageRef the reference number of the MMS message. - * @param pdu non-empty (contains the SendConf PDU) if the message was sent successfully, - * otherwise, this param should be null. - * @param status send status. It can be Activity.RESULT_OK or one of the MMS error codes. - * If status is Activity.RESULT_OK, the MMS was sent successfully. - * If status is MMS_ERROR_RETRY, this message would be resent via carrier - * network. The message will not be resent for other MMS error statuses. - */ - void updateMmsSendStatus(int messageRef, in byte[] pdu, in int status); - - /** - * Update the status of a pending (download-by-IP) MMS message handled by the carrier app. - * If the carrier app fails to download this message, it may be re-downloaded via carrier - * network depending on the status code. - * - * The caller should have carrier privileges. - * @see android.telephony.TelephonyManager.hasCarrierPrivileges - * - * @param messageRef the reference number of the MMS message. - * @param status download status. It can be Activity.RESULT_OK or one of the MMS error codes. - * If status is Activity.RESULT_OK, the MMS was downloaded successfully. - * If status is MMS_ERROR_RETRY, this message would be re-downloaded via carrier - * network. The message will not be re-downloaded for other MMS error statuses. - */ - void updateMmsDownloadStatus(int messageRef, in int status); - - /** * Get carrier-dependent configuration values. * * @param subId the SIM id diff --git a/telephony/java/com/android/internal/telephony/ISms.aidl b/telephony/java/com/android/internal/telephony/ISms.aidl index 15fa340..6fdf121 100644 --- a/telephony/java/com/android/internal/telephony/ISms.aidl +++ b/telephony/java/com/android/internal/telephony/ISms.aidl @@ -224,17 +224,6 @@ interface ISms { void injectSmsPdu(in byte[] pdu, String format, in PendingIntent receivedIntent); /** - * Update the status of a pending (send-by-IP) SMS message and resend by PSTN if necessary. - * This outbound message was handled by the carrier app. If the carrier app fails to send - * this message, it would be resent by PSTN. - * - * @param messageRef the reference number of the SMS message. - * @param success True if and only if the message was sent successfully. If its value is - * false, this message should be resent via PSTN. - */ - void updateSmsSendStatus(int messageRef, boolean success); - - /** * Send a multi-part text based SMS. * * @param destinationAddress the address to send the message to diff --git a/telephony/java/com/android/internal/telephony/ISub.aidl b/telephony/java/com/android/internal/telephony/ISub.aidl index ca82083..acbc0aa 100755 --- a/telephony/java/com/android/internal/telephony/ISub.aidl +++ b/telephony/java/com/android/internal/telephony/ISub.aidl @@ -164,4 +164,11 @@ interface ISub { void clearDefaultsForInactiveSubIds(); int[] getActiveSubIdList(); + + /** + * Get the SIM state for the subscriber + * @return SIM state as the ordinal of IccCardConstants.State + */ + int getSimStateForSubscriber(int subId); + } diff --git a/telephony/java/com/android/internal/telephony/IccCardConstants.java b/telephony/java/com/android/internal/telephony/IccCardConstants.java index 8029713..c1e2518 100644 --- a/telephony/java/com/android/internal/telephony/IccCardConstants.java +++ b/telephony/java/com/android/internal/telephony/IccCardConstants.java @@ -15,12 +15,14 @@ */ package com.android.internal.telephony; +import android.telephony.TelephonyManager; + /** * {@hide} */ public class IccCardConstants { - /* The extra data for broacasting intent INTENT_ICC_STATE_CHANGE */ + /* The extra data for broadcasting intent INTENT_ICC_STATE_CHANGE */ public static final String INTENT_KEY_ICC_STATE = "ss"; /* UNKNOWN means the ICC state is unknown */ public static final String INTENT_VALUE_ICC_UNKNOWN = "UNKNOWN"; @@ -32,13 +34,17 @@ public class IccCardConstants { static public final String INTENT_VALUE_ICC_CARD_IO_ERROR = "CARD_IO_ERROR"; /* LOCKED means ICC is locked by pin or by network */ public static final String INTENT_VALUE_ICC_LOCKED = "LOCKED"; + //TODO: we can remove this state in the future if Bug 18489776 analysis + //#42's first race condition is resolved + /* INTERNAL LOCKED means ICC is locked by pin or by network */ + public static final String INTENT_VALUE_ICC_INTERNAL_LOCKED = "INTERNAL_LOCKED"; /* READY means ICC is ready to access */ public static final String INTENT_VALUE_ICC_READY = "READY"; /* IMSI means ICC IMSI is ready in property */ public static final String INTENT_VALUE_ICC_IMSI = "IMSI"; /* LOADED means all ICC records, including IMSI, are loaded */ public static final String INTENT_VALUE_ICC_LOADED = "LOADED"; - /* The extra data for broacasting intent INTENT_ICC_STATE_CHANGE */ + /* The extra data for broadcasting intent INTENT_ICC_STATE_CHANGE */ public static final String INTENT_KEY_LOCKED_REASON = "reason"; /* PIN means ICC is locked on PIN1 */ public static final String INTENT_VALUE_LOCKED_ON_PIN = "PIN"; @@ -56,17 +62,19 @@ public class IccCardConstants { * UNKNOWN is a transient state, for example, after user inputs ICC pin under * PIN_REQUIRED state, the query for ICC status returns UNKNOWN before it * turns to READY + * + * The ordinal values much match {@link TelephonyManager#SIM_STATE_UNKNOWN} ... */ public enum State { - UNKNOWN, - ABSENT, - PIN_REQUIRED, - PUK_REQUIRED, - NETWORK_LOCKED, - READY, - NOT_READY, - PERM_DISABLED, - CARD_IO_ERROR; + UNKNOWN, /** ordinal(0) == {@See TelephonyManager#SIM_STATE_UNKNOWN} */ + ABSENT, /** ordinal(1) == {@See TelephonyManager#SIM_STATE_ABSENT} */ + PIN_REQUIRED, /** ordinal(2) == {@See TelephonyManager#SIM_STATE_PIN_REQUIRED} */ + PUK_REQUIRED, /** ordinal(3) == {@See TelephonyManager#SIM_STATE_PUK_REQUIRED} */ + NETWORK_LOCKED, /** ordinal(4) == {@See TelephonyManager#SIM_STATE_NETWORK_LOCKED} */ + READY, /** ordinal(5) == {@See TelephonyManager#SIM_STATE_READY} */ + NOT_READY, /** ordinal(6) == {@See TelephonyManager#SIM_STATE_NOT_READY} */ + PERM_DISABLED, /** ordinal(7) == {@See TelephonyManager#SIM_STATE_PERM_DISABLED} */ + CARD_IO_ERROR; /** ordinal(8) == {@See TelephonyManager#SIM_STATE_CARD_IO_ERROR} */ public boolean isPinLocked() { return ((this == PIN_REQUIRED) || (this == PUK_REQUIRED)); @@ -77,5 +85,21 @@ public class IccCardConstants { || (this == NETWORK_LOCKED) || (this == READY) || (this == PERM_DISABLED) || (this == CARD_IO_ERROR)); } + + public static State intToState(int state) throws IllegalArgumentException { + switch(state) { + case 0: return UNKNOWN; + case 1: return ABSENT; + case 2: return PIN_REQUIRED; + case 3: return PUK_REQUIRED; + case 4: return NETWORK_LOCKED; + case 5: return READY; + case 6: return NOT_READY; + case 7: return PERM_DISABLED; + case 8: return CARD_IO_ERROR; + default: + throw new IllegalArgumentException(); + } + } } } diff --git a/tools/aapt/Resource.cpp b/tools/aapt/Resource.cpp index bfd0531..e3a0200 100644 --- a/tools/aapt/Resource.cpp +++ b/tools/aapt/Resource.cpp @@ -2985,23 +2985,26 @@ status_t writeProguardForLayouts(ProguardKeepSet* keep, const sp<AaptAssets>& assets) { status_t err; + const char* kClass = "class"; + const char* kFragment = "fragment"; const String8 kTransition("transition"); const String8 kTransitionPrefix("transition-"); // tag:attribute pairs that should be checked in layout files. KeyedVector<String8, Vector<NamespaceAttributePair> > kLayoutTagAttrPairs; - addTagAttrPair(&kLayoutTagAttrPairs, "view", NULL, "class"); - addTagAttrPair(&kLayoutTagAttrPairs, "fragment", NULL, "class"); - addTagAttrPair(&kLayoutTagAttrPairs, "fragment", RESOURCES_ANDROID_NAMESPACE, "name"); + addTagAttrPair(&kLayoutTagAttrPairs, "view", NULL, kClass); + addTagAttrPair(&kLayoutTagAttrPairs, kFragment, NULL, kClass); + addTagAttrPair(&kLayoutTagAttrPairs, kFragment, RESOURCES_ANDROID_NAMESPACE, "name"); // tag:attribute pairs that should be checked in xml files. KeyedVector<String8, Vector<NamespaceAttributePair> > kXmlTagAttrPairs; - addTagAttrPair(&kXmlTagAttrPairs, "PreferenceScreen", RESOURCES_ANDROID_NAMESPACE, "fragment"); - addTagAttrPair(&kXmlTagAttrPairs, "header", RESOURCES_ANDROID_NAMESPACE, "fragment"); + addTagAttrPair(&kXmlTagAttrPairs, "PreferenceScreen", RESOURCES_ANDROID_NAMESPACE, kFragment); + addTagAttrPair(&kXmlTagAttrPairs, "header", RESOURCES_ANDROID_NAMESPACE, kFragment); // tag:attribute pairs that should be checked in transition files. KeyedVector<String8, Vector<NamespaceAttributePair> > kTransitionTagAttrPairs; - addTagAttrPair(&kTransitionTagAttrPairs, kTransition.string(), NULL, "class"); + addTagAttrPair(&kTransitionTagAttrPairs, kTransition.string(), NULL, kClass); + addTagAttrPair(&kTransitionTagAttrPairs, "pathMotion", NULL, kClass); const Vector<sp<AaptDir> >& dirs = assets->resDirs(); const size_t K = dirs.size(); |