Merge "Call preference.setEnabled only after updating disabledByAdmin state." into nyc-dev
diff --git a/api/current.txt b/api/current.txt
index 1944157..c04debf 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -6373,8 +6373,8 @@
method public long getTxPackets();
method public int getUid();
field public static final int ROAMING_ALL = -1; // 0xffffffff
- field public static final int ROAMING_DEFAULT = 1; // 0x1
- field public static final int ROAMING_ROAMING = 2; // 0x2
+ field public static final int ROAMING_NO = 1; // 0x1
+ field public static final int ROAMING_YES = 2; // 0x2
field public static final int STATE_ALL = -1; // 0xffffffff
field public static final int STATE_DEFAULT = 1; // 0x1
field public static final int STATE_FOREGROUND = 2; // 0x2
@@ -9454,6 +9454,7 @@
method public int getShortcutIconResId(android.content.pm.ShortcutInfo, android.os.UserHandle);
method public java.util.List<android.content.pm.ShortcutInfo> getShortcutInfo(java.lang.String, java.util.List<java.lang.String>, android.os.UserHandle);
method public java.util.List<android.content.pm.ShortcutInfo> getShortcuts(android.content.pm.LauncherApps.ShortcutQuery, android.os.UserHandle);
+ method public boolean hasShortcutHostPermission();
method public boolean isActivityEnabled(android.content.ComponentName, android.os.UserHandle);
method public boolean isPackageEnabled(java.lang.String, android.os.UserHandle);
method public void pinShortcuts(java.lang.String, java.util.List<java.lang.String>, android.os.UserHandle);
diff --git a/api/system-current.txt b/api/system-current.txt
index cf175cc..d242e2f 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -6639,8 +6639,8 @@
method public long getTxPackets();
method public int getUid();
field public static final int ROAMING_ALL = -1; // 0xffffffff
- field public static final int ROAMING_DEFAULT = 1; // 0x1
- field public static final int ROAMING_ROAMING = 2; // 0x2
+ field public static final int ROAMING_NO = 1; // 0x1
+ field public static final int ROAMING_YES = 2; // 0x2
field public static final int STATE_ALL = -1; // 0xffffffff
field public static final int STATE_DEFAULT = 1; // 0x1
field public static final int STATE_FOREGROUND = 2; // 0x2
@@ -9788,6 +9788,7 @@
method public int getShortcutIconResId(android.content.pm.ShortcutInfo, android.os.UserHandle);
method public java.util.List<android.content.pm.ShortcutInfo> getShortcutInfo(java.lang.String, java.util.List<java.lang.String>, android.os.UserHandle);
method public java.util.List<android.content.pm.ShortcutInfo> getShortcuts(android.content.pm.LauncherApps.ShortcutQuery, android.os.UserHandle);
+ method public boolean hasShortcutHostPermission();
method public boolean isActivityEnabled(android.content.ComponentName, android.os.UserHandle);
method public boolean isPackageEnabled(java.lang.String, android.os.UserHandle);
method public void pinShortcuts(java.lang.String, java.util.List<java.lang.String>, android.os.UserHandle);
@@ -9928,11 +9929,11 @@
public static class PackageInstaller.SessionParams implements android.os.Parcelable {
ctor public PackageInstaller.SessionParams(int);
method public int describeContents();
+ method public void setAllowDowngrade(boolean);
method public void setAppIcon(android.graphics.Bitmap);
method public void setAppLabel(java.lang.CharSequence);
method public void setAppPackageName(java.lang.String);
method public void setGrantedRuntimePermissions(java.lang.String[]);
- method public void setInstallFlagsDowngrade();
method public void setInstallLocation(int);
method public void setOriginatingUid(int);
method public void setOriginatingUri(android.net.Uri);
diff --git a/api/test-current.txt b/api/test-current.txt
index b8f7326..78bdf16 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -6377,8 +6377,8 @@
method public long getTxPackets();
method public int getUid();
field public static final int ROAMING_ALL = -1; // 0xffffffff
- field public static final int ROAMING_DEFAULT = 1; // 0x1
- field public static final int ROAMING_ROAMING = 2; // 0x2
+ field public static final int ROAMING_NO = 1; // 0x1
+ field public static final int ROAMING_YES = 2; // 0x2
field public static final int STATE_ALL = -1; // 0xffffffff
field public static final int STATE_DEFAULT = 1; // 0x1
field public static final int STATE_FOREGROUND = 2; // 0x2
@@ -9463,6 +9463,7 @@
method public int getShortcutIconResId(android.content.pm.ShortcutInfo, android.os.UserHandle);
method public java.util.List<android.content.pm.ShortcutInfo> getShortcutInfo(java.lang.String, java.util.List<java.lang.String>, android.os.UserHandle);
method public java.util.List<android.content.pm.ShortcutInfo> getShortcuts(android.content.pm.LauncherApps.ShortcutQuery, android.os.UserHandle);
+ method public boolean hasShortcutHostPermission();
method public boolean isActivityEnabled(android.content.ComponentName, android.os.UserHandle);
method public boolean isPackageEnabled(java.lang.String, android.os.UserHandle);
method public void pinShortcuts(java.lang.String, java.util.List<java.lang.String>, android.os.UserHandle);
diff --git a/core/java/android/app/WallpaperManager.java b/core/java/android/app/WallpaperManager.java
index 2d06dcc..52e5272 100644
--- a/core/java/android/app/WallpaperManager.java
+++ b/core/java/android/app/WallpaperManager.java
@@ -919,8 +919,8 @@
* image for restore to a future device; {@code false} otherwise.
* @param which Flags indicating which wallpaper(s) to configure with the new imagery.
*
- * @see #FLAG_SET_LOCK_WALLPAPER
- * @see #FLAG_SET_SYSTEM_WALLPAPER
+ * @see #FLAG_SET_LOCK
+ * @see #FLAG_SET_SYSTEM
*
* @return An integer ID assigned to the newly active wallpaper; or zero on failure.
*
@@ -1038,8 +1038,8 @@
* image for restore to a future device; {@code false} otherwise.
* @param which Flags indicating which wallpaper(s) to configure with the new imagery.
*
- * @see #FLAG_SET_LOCK_WALLPAPER
- * @see #FLAG_SET_SYSTEM_WALLPAPER
+ * @see #FLAG_SET_LOCK
+ * @see #FLAG_SET_SYSTEM
*
* @throws IOException
*/
diff --git a/core/java/android/app/usage/NetworkStats.java b/core/java/android/app/usage/NetworkStats.java
index 9f1a9cf0..6d5c81b 100644
--- a/core/java/android/app/usage/NetworkStats.java
+++ b/core/java/android/app/usage/NetworkStats.java
@@ -16,6 +16,7 @@
package android.app.usage;
+import android.annotation.IntDef;
import android.content.Context;
import android.net.INetworkStatsService;
import android.net.INetworkStatsSession;
@@ -29,6 +30,9 @@
import dalvik.system.CloseGuard;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
/**
* Class providing enumeration over buckets of network usage statistics. {@link NetworkStats} objects
* are returned as results to various queries in {@link NetworkStatsManager}.
@@ -119,6 +123,11 @@
* aggregated (e.g. time or state) some values may be equal across all buckets.
*/
public static class Bucket {
+ /** @hide */
+ @IntDef({STATE_ALL, STATE_DEFAULT, STATE_FOREGROUND})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface State {}
+
/**
* Combined usage across all states.
*/
@@ -149,20 +158,34 @@
*/
public static final int UID_TETHERING = TrafficStats.UID_TETHERING;
+ /** @hide */
+ @IntDef({ROAMING_ALL, ROAMING_NO, ROAMING_YES})
+ @Retention(RetentionPolicy.SOURCE)
+ public @interface Roaming {}
+
/**
- * Combined usage across all roaming states.
+ * Combined usage across all roaming states. Covers both roaming and non-roaming usage.
*/
public static final int ROAMING_ALL = -1;
/**
- * Usage not accounted for in any other roaming state.
+ * Usage that occurs on a home, non-roaming network.
+ *
+ * <p>Any cellular usage in this bucket was incurred while the device was connected to a
+ * tower owned or operated by the user's wireless carrier, or a tower that the user's
+ * wireless carrier has indicated should be treated as a home network regardless.
+ *
+ * <p>This is also the default value for network types that do not support roaming.
*/
- public static final int ROAMING_DEFAULT = 0x1;
+ public static final int ROAMING_NO = 0x1;
/**
- * Roaming usage.
+ * Usage that occurs on a roaming network.
+ *
+ * <p>Any cellular usage in this bucket as incurred while the device was roaming on another
+ * carrier's network, for which additional charges may apply.
*/
- public static final int ROAMING_ROAMING = 0x2;
+ public static final int ROAMING_YES = 0x2;
/**
* Special TAG value matching any tag.
@@ -185,7 +208,7 @@
private long mTxBytes;
private long mTxPackets;
- private static int convertState(int networkStatsSet) {
+ private static @State int convertState(int networkStatsSet) {
switch (networkStatsSet) {
case android.net.NetworkStats.SET_ALL : return STATE_ALL;
case android.net.NetworkStats.SET_DEFAULT : return STATE_DEFAULT;
@@ -210,11 +233,11 @@
return tag;
}
- private static int convertRoaming(int roaming) {
+ private static @Roaming int convertRoaming(int roaming) {
switch (roaming) {
case android.net.NetworkStats.ROAMING_ALL : return ROAMING_ALL;
- case android.net.NetworkStats.ROAMING_DEFAULT : return ROAMING_DEFAULT;
- case android.net.NetworkStats.ROAMING_ROAMING : return ROAMING_ROAMING;
+ case android.net.NetworkStats.ROAMING_NO: return ROAMING_NO;
+ case android.net.NetworkStats.ROAMING_YES: return ROAMING_YES;
}
return 0;
}
@@ -252,7 +275,7 @@
* </ul>
* @return Usage state.
*/
- public int getState() {
+ public @State int getState() {
return mState;
}
@@ -260,11 +283,11 @@
* Roaming state. One of the following values:<p/>
* <ul>
* <li>{@link #ROAMING_ALL}</li>
- * <li>{@link #ROAMING_DEFAULT}</li>
- * <li>{@link #ROAMING_ROAMING}</li>
+ * <li>{@link #ROAMING_NO}</li>
+ * <li>{@link #ROAMING_YES}</li>
* </ul>
*/
- public int getRoaming() {
+ public @Roaming int getRoaming() {
return mRoaming;
}
diff --git a/core/java/android/content/Intent.java b/core/java/android/content/Intent.java
index 09fa5e11..182475f 100644
--- a/core/java/android/content/Intent.java
+++ b/core/java/android/content/Intent.java
@@ -4560,7 +4560,8 @@
/**
* This flag is only used in split-screen multi-window mode. The new activity will be displayed
* adjacent to the one launching it. This can only be used in conjunction with
- * {@link #FLAG_ACTIVITY_NEW_TASK}.
+ * {@link #FLAG_ACTIVITY_NEW_TASK}. Also, setting {@link #FLAG_ACTIVITY_MULTIPLE_TASK} is
+ * required if you want a new instance of an existing activity to be created.
*/
public static final int FLAG_ACTIVITY_LAUNCH_ADJACENT = 0x00001000;
diff --git a/core/java/android/content/pm/ILauncherApps.aidl b/core/java/android/content/pm/ILauncherApps.aidl
index b1d3f20..7b57872 100644
--- a/core/java/android/content/pm/ILauncherApps.aidl
+++ b/core/java/android/content/pm/ILauncherApps.aidl
@@ -58,4 +58,6 @@
int getShortcutIconResId(String callingPackage, in ShortcutInfo shortcut, in UserHandle user);
ParcelFileDescriptor getShortcutIconFd(String callingPackage, in ShortcutInfo shortcut,
in UserHandle user);
+
+ boolean hasShortcutHostPermission(String callingPackage);
}
diff --git a/core/java/android/content/pm/LauncherApps.java b/core/java/android/content/pm/LauncherApps.java
index a6a732e..8d43c44 100644
--- a/core/java/android/content/pm/LauncherApps.java
+++ b/core/java/android/content/pm/LauncherApps.java
@@ -16,11 +16,9 @@
package android.content.pm;
-import android.Manifest.permission;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
-import android.annotation.RequiresPermission;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -30,7 +28,6 @@
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
-import android.os.Parcel;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
import android.os.UserHandle;
@@ -159,6 +156,9 @@
* Indicates that one or more shortcuts (which may be dynamic and/or pinned)
* have been added, updated or removed.
*
+ * <p>Only the applications that are allowed to access the shortcut information,
+ * as defined in {@link #hasShortcutHostPermission()}, will receive it.
+ *
* @param packageName The name of the package that has the shortcuts.
* @param shortcuts all shortcuts from the package (dynamic and/or pinned).
* @param user The UserHandle of the profile that generated the change.
@@ -395,16 +395,34 @@
}
/**
+ * Returns whether the caller can access the shortcut information.
+ *
+ * <p>Only the default launcher can access the shortcut information.
+ *
+ * <p>Note when this method returns {@code false}, that may be a temporary situation because
+ * the user is trying a new launcher application. The user may decide to change the default
+ * launcher to the calling application again, so even if a launcher application loses
+ * this permission, it does <b>not</b> have to purge pinned shortcut information.
+ */
+ public boolean hasShortcutHostPermission() {
+ try {
+ return mService.hasShortcutHostPermission(mContext.getPackageName());
+ } catch (RemoteException re) {
+ throw re.rethrowFromSystemServer();
+ }
+ }
+
+ /**
* Returns the IDs of {@link ShortcutInfo}s that match {@code query}.
*
- * <p>Callers mut have the {@link permission#BIND_APPWIDGET} permission.
+ * <p>Callers must be allowed to access the shortcut information, as defined in {@link
+ * #hasShortcutHostPermission()}.
*
* @param query result includes shortcuts matching this query.
* @param user The UserHandle of the profile.
*
* @return the IDs of {@link ShortcutInfo}s that match the query.
*/
- @RequiresPermission(permission.BIND_APPWIDGET)
@Nullable
public List<ShortcutInfo> getShortcuts(@NonNull ShortcutQuery query,
@NonNull UserHandle user) {
@@ -420,7 +438,8 @@
/**
* Returns {@link ShortcutInfo}s with the given IDs from a package.
*
- * <p>Callers mut have the {@link permission#BIND_APPWIDGET} permission.
+ * <p>Callers must be allowed to access the shortcut information, as defined in {@link
+ * #hasShortcutHostPermission()}.
*
* @param packageName The target package.
* @param ids IDs of the shortcuts to retrieve.
@@ -428,7 +447,6 @@
*
* @return list of {@link ShortcutInfo} associated with the package.
*/
- @RequiresPermission(permission.BIND_APPWIDGET)
@Nullable
public List<ShortcutInfo> getShortcutInfo(@NonNull String packageName,
@NonNull List<String> ids, @NonNull UserHandle user) {
@@ -447,13 +465,13 @@
* <p>This API is <b>NOT</b> cumulative; this will replace all pinned shortcuts for the package.
* However, different launchers may have different set of pinned shortcuts.
*
- * <p>Callers must have the {@link permission#BIND_APPWIDGET} permission.
+ * <p>Callers must be allowed to access the shortcut information, as defined in {@link
+ * #hasShortcutHostPermission()}.
*
* @param packageName The target package name.
* @param shortcutIds The IDs of the shortcut to be pinned.
* @param user The UserHandle of the profile.
*/
- @RequiresPermission(permission.BIND_APPWIDGET)
public void pinShortcuts(@NonNull String packageName, @NonNull List<String> shortcutIds,
@NonNull UserHandle user) {
try {
@@ -467,12 +485,12 @@
* Return the icon resource ID, if {@code shortcut} has one
* (i.e. when {@link ShortcutInfo#hasIconResource()} returns {@code true}).
*
- * <p>Callers mut have the {@link permission#BIND_APPWIDGET} permission.
+ * <p>Callers must be allowed to access the shortcut information, as defined in {@link
+ * #hasShortcutHostPermission()}.
*
* @param shortcut The target shortcut.
* @param user The UserHandle of the profile.
*/
- @RequiresPermission(permission.BIND_APPWIDGET)
public int getShortcutIconResId(@NonNull ShortcutInfo shortcut, @NonNull UserHandle user) {
try {
return mService.getShortcutIconResId(mContext.getPackageName(), shortcut, user);
@@ -485,12 +503,12 @@
* Return the icon as {@link ParcelFileDescriptor}, when it's stored as a file
* (i.e. when {@link ShortcutInfo#hasIconFile()} returns {@code true}).
*
- * <p>Callers mut have the {@link permission#BIND_APPWIDGET} permission.
+ * <p>Callers must be allowed to access the shortcut information, as defined in {@link
+ * #hasShortcutHostPermission()}.
*
* @param shortcut The target shortcut.
* @param user The UserHandle of the profile.
*/
- @RequiresPermission(permission.BIND_APPWIDGET)
public ParcelFileDescriptor getShortcutIconFd(
@NonNull ShortcutInfo shortcut, @NonNull UserHandle user) {
try {
@@ -503,7 +521,8 @@
/**
* Launches a shortcut.
*
- * <p>Callers mut have the {@link permission#BIND_APPWIDGET} permission.
+ * <p>Callers must be allowed to access the shortcut information, as defined in {@link
+ * #hasShortcutHostPermission()}.
*
* @param packageName The target shortcut package name.
* @param shortcutId The target shortcut ID.
@@ -513,7 +532,6 @@
* @return {@code false} when the shortcut is no longer valid (e.g. the creator application
* has been uninstalled). {@code true} when the shortcut is still valid.
*/
- @RequiresPermission(permission.BIND_APPWIDGET)
public boolean startShortcut(@NonNull String packageName, @NonNull String shortcutId,
@Nullable Rect sourceBounds, @Nullable Bundle startActivityOptions,
@NonNull UserHandle user) {
diff --git a/core/java/android/content/pm/PackageInstaller.java b/core/java/android/content/pm/PackageInstaller.java
index 0f5ec91..6f2786a 100644
--- a/core/java/android/content/pm/PackageInstaller.java
+++ b/core/java/android/content/pm/PackageInstaller.java
@@ -1054,8 +1054,12 @@
/** {@hide} */
@SystemApi
- public void setInstallFlagsDowngrade() {
- installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE;
+ public void setAllowDowngrade(boolean allowDowngrade) {
+ if (allowDowngrade) {
+ installFlags |= PackageManager.INSTALL_ALLOW_DOWNGRADE;
+ } else {
+ installFlags &= ~PackageManager.INSTALL_ALLOW_DOWNGRADE;
+ }
}
/** {@hide} */
diff --git a/core/java/android/content/pm/PackageManagerInternal.java b/core/java/android/content/pm/PackageManagerInternal.java
index 89f2fc4..13ebb82 100644
--- a/core/java/android/content/pm/PackageManagerInternal.java
+++ b/core/java/android/content/pm/PackageManagerInternal.java
@@ -16,6 +16,7 @@
package android.content.pm;
+import android.content.ComponentName;
import android.content.pm.PackageManager.NameNotFoundException;
import java.util.List;
@@ -140,4 +141,10 @@
* found on the system.
*/
public abstract ApplicationInfo getApplicationInfo(String packageName, int userId);
+
+ /**
+ * Interface to {@link com.android.server.pm.PackageManagerService#getHomeActivitiesAsUser}.
+ */
+ public abstract ComponentName getHomeActivitiesAsUser(List<ResolveInfo> allHomeCandidates,
+ int userId);
}
diff --git a/core/java/android/content/pm/ShortcutServiceInternal.java b/core/java/android/content/pm/ShortcutServiceInternal.java
index 918c763..7c764aa 100644
--- a/core/java/android/content/pm/ShortcutServiceInternal.java
+++ b/core/java/android/content/pm/ShortcutServiceInternal.java
@@ -63,4 +63,6 @@
public abstract ParcelFileDescriptor getShortcutIconFd(@NonNull String callingPackage,
@NonNull ShortcutInfo shortcut, int userId);
+
+ public abstract boolean hasShortcutHostPermission(@NonNull String callingPackage, int userId);
}
diff --git a/core/java/android/net/NetworkStats.java b/core/java/android/net/NetworkStats.java
index 3d8b091..25806fa 100644
--- a/core/java/android/net/NetworkStats.java
+++ b/core/java/android/net/NetworkStats.java
@@ -71,9 +71,9 @@
/** {@link #set} value for all roaming values. */
public static final int ROAMING_ALL = -1;
/** {@link #set} value where native, non-roaming data is accounted. */
- public static final int ROAMING_DEFAULT = 0;
+ public static final int ROAMING_NO = 0;
/** {@link #set} value where roaming data is accounted. */
- public static final int ROAMING_ROAMING = 1;
+ public static final int ROAMING_YES = 1;
// TODO: move fields to "mVariable" notation
@@ -123,7 +123,7 @@
public Entry(String iface, int uid, int set, int tag, long rxBytes, long rxPackets,
long txBytes, long txPackets, long operations) {
- this(iface, uid, set, tag, ROAMING_DEFAULT, rxBytes, rxPackets, txBytes, txPackets,
+ this(iface, uid, set, tag, ROAMING_NO, rxBytes, rxPackets, txBytes, txPackets,
operations);
}
@@ -836,10 +836,10 @@
switch (roaming) {
case ROAMING_ALL:
return "ALL";
- case ROAMING_DEFAULT:
- return "DEFAULT";
- case ROAMING_ROAMING:
- return "ROAMING";
+ case ROAMING_NO:
+ return "NO";
+ case ROAMING_YES:
+ return "YES";
default:
return "UNKNOWN";
}
@@ -1019,18 +1019,18 @@
// Caveat: if the vpn software uses tag, the total tagged traffic may be greater than
// the TAG_NONE traffic.
//
- // Relies on the fact that the underlying traffic only has state ROAMING_DEFAULT, which
+ // Relies on the fact that the underlying traffic only has state ROAMING_NO, which
// should be the case as it comes directly from the /proc file. We only blend in the
// roaming data after applying these adjustments, by checking the NetworkIdentity of the
// underlying iface.
int idxVpnBackground = findIndex(underlyingIface, tunUid, SET_DEFAULT, TAG_NONE,
- ROAMING_DEFAULT);
+ ROAMING_NO);
if (idxVpnBackground != -1) {
tunSubtract(idxVpnBackground, this, moved);
}
int idxVpnForeground = findIndex(underlyingIface, tunUid, SET_FOREGROUND, TAG_NONE,
- ROAMING_DEFAULT);
+ ROAMING_NO);
if (idxVpnForeground != -1) {
tunSubtract(idxVpnForeground, this, moved);
}
diff --git a/core/java/android/view/WindowManagerPolicy.java b/core/java/android/view/WindowManagerPolicy.java
index b011414..34e81fc 100644
--- a/core/java/android/view/WindowManagerPolicy.java
+++ b/core/java/android/view/WindowManagerPolicy.java
@@ -405,6 +405,12 @@
* not attached to any stack.
*/
int getStackId();
+
+ /**
+ * Returns true if the window is current in multi-windowing mode. i.e. it shares the
+ * screen with other application windows.
+ */
+ public boolean inMultiWindowMode();
}
/**
diff --git a/core/res/res/values-television/config.xml b/core/res/res/values-television/config.xml
index ae19150..3408c21 100644
--- a/core/res/res/values-television/config.xml
+++ b/core/res/res/values-television/config.xml
@@ -25,7 +25,7 @@
<bool name="config_defaultWindowFeatureOptionsPanel">false</bool>
<!-- Default bounds [left top right bottom] on screen for picture-in-picture windows. -->
- <string translatable="false" name="config_defaultPictureInPictureBounds">"1420 100 1820 325"</string>
+ <string translatable="false" name="config_defaultPictureInPictureBounds">"1328 54 1808 324"</string>
<!-- Bounds [left top right bottom] on screen for picture-in-picture (PIP) windows, when the PIP
is located in center. -->
diff --git a/core/tests/coretests/src/android/net/NetworkStatsTest.java b/core/tests/coretests/src/android/net/NetworkStatsTest.java
index a723977..9074f8a 100644
--- a/core/tests/coretests/src/android/net/NetworkStatsTest.java
+++ b/core/tests/coretests/src/android/net/NetworkStatsTest.java
@@ -17,8 +17,8 @@
package android.net;
import static android.net.NetworkStats.ROAMING_ALL;
-import static android.net.NetworkStats.ROAMING_DEFAULT;
-import static android.net.NetworkStats.ROAMING_ROAMING;
+import static android.net.NetworkStats.ROAMING_NO;
+import static android.net.NetworkStats.ROAMING_YES;
import static android.net.NetworkStats.SET_DEFAULT;
import static android.net.NetworkStats.SET_FOREGROUND;
import static android.net.NetworkStats.SET_DBG_VPN_IN;
@@ -46,57 +46,57 @@
public void testFindIndex() throws Exception {
final NetworkStats stats = new NetworkStats(TEST_START, 4)
- .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 1024L, 8L, 0L,
+ .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 1024L, 8L, 0L,
0L, 10)
- .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 0L, 0L, 1024L,
+ .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_NO, 0L, 0L, 1024L,
8L, 11)
- .addValues(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 1024L, 8L,
+ .addValues(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, ROAMING_NO, 1024L, 8L,
1024L, 8L, 12)
- .addValues(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, ROAMING_ROAMING, 1024L, 8L,
+ .addValues(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, ROAMING_YES, 1024L, 8L,
1024L, 8L, 12);
- assertEquals(3, stats.findIndex(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, ROAMING_ROAMING));
- assertEquals(2, stats.findIndex(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT));
- assertEquals(1, stats.findIndex(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT));
- assertEquals(0, stats.findIndex(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT));
- assertEquals(-1, stats.findIndex(TEST_IFACE, 6, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT));
+ assertEquals(3, stats.findIndex(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, ROAMING_YES));
+ assertEquals(2, stats.findIndex(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, ROAMING_NO));
+ assertEquals(1, stats.findIndex(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_NO));
+ assertEquals(0, stats.findIndex(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO));
+ assertEquals(-1, stats.findIndex(TEST_IFACE, 6, SET_DEFAULT, TAG_NONE, ROAMING_NO));
}
public void testFindIndexHinted() {
final NetworkStats stats = new NetworkStats(TEST_START, 3)
- .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 1024L, 8L, 0L,
+ .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 1024L, 8L, 0L,
0L, 10)
- .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 0L, 0L, 1024L,
+ .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_NO, 0L, 0L, 1024L,
8L, 11)
- .addValues(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 1024L, 8L,
+ .addValues(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, ROAMING_NO, 1024L, 8L,
1024L, 8L, 12)
- .addValues(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, ROAMING_DEFAULT, 1024L, 8L,
+ .addValues(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 1024L, 8L,
0L, 0L, 10)
- .addValues(TEST_IFACE2, 101, SET_DEFAULT, 0xF00D, ROAMING_DEFAULT, 0L, 0L, 1024L,
+ .addValues(TEST_IFACE2, 101, SET_DEFAULT, 0xF00D, ROAMING_NO, 0L, 0L, 1024L,
8L, 11)
- .addValues(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 1024L, 8L,
+ .addValues(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE, ROAMING_NO, 1024L, 8L,
1024L, 8L, 12)
- .addValues(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE, ROAMING_ROAMING, 1024L, 8L,
+ .addValues(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE, ROAMING_YES, 1024L, 8L,
1024L, 8L, 12);
// verify that we correctly find across regardless of hinting
for (int hint = 0; hint < stats.size(); hint++) {
assertEquals(0, stats.findIndexHinted(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE,
- ROAMING_DEFAULT, hint));
+ ROAMING_NO, hint));
assertEquals(1, stats.findIndexHinted(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE,
- ROAMING_DEFAULT, hint));
+ ROAMING_NO, hint));
assertEquals(2, stats.findIndexHinted(TEST_IFACE, 102, SET_DEFAULT, TAG_NONE,
- ROAMING_DEFAULT, hint));
+ ROAMING_NO, hint));
assertEquals(3, stats.findIndexHinted(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE,
- ROAMING_DEFAULT, hint));
+ ROAMING_NO, hint));
assertEquals(4, stats.findIndexHinted(TEST_IFACE2, 101, SET_DEFAULT, 0xF00D,
- ROAMING_DEFAULT, hint));
+ ROAMING_NO, hint));
assertEquals(5, stats.findIndexHinted(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE,
- ROAMING_DEFAULT, hint));
+ ROAMING_NO, hint));
assertEquals(6, stats.findIndexHinted(TEST_IFACE2, 102, SET_DEFAULT, TAG_NONE,
- ROAMING_ROAMING, hint));
+ ROAMING_YES, hint));
assertEquals(-1, stats.findIndexHinted(TEST_IFACE, 6, SET_DEFAULT, TAG_NONE,
- ROAMING_DEFAULT, hint));
+ ROAMING_NO, hint));
}
}
@@ -106,41 +106,41 @@
assertEquals(0, stats.size());
assertEquals(3, stats.internalSize());
- stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 1L, 1L, 2L,
+ stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_NO, 1L, 1L, 2L,
2L, 3);
- stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 2L, 2L, 2L,
+ stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_NO, 2L, 2L, 2L,
2L, 4);
- stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_ROAMING, 3L, 3L, 2L,
+ stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_YES, 3L, 3L, 2L,
2L, 5);
assertEquals(3, stats.size());
assertEquals(3, stats.internalSize());
- stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 4L, 40L, 4L,
+ stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_NO, 4L, 40L, 4L,
40L, 7);
- stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 5L, 50L, 4L,
+ stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_NO, 5L, 50L, 4L,
40L, 8);
- stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 6L, 60L, 5L,
+ stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_NO, 6L, 60L, 5L,
50L, 10);
- stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_ROAMING, 7L, 70L, 5L,
+ stats.addValues(TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_YES, 7L, 70L, 5L,
50L, 11);
assertEquals(7, stats.size());
assertTrue(stats.internalSize() >= 7);
- assertValues(stats, 0, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 1L, 1L,
+ assertValues(stats, 0, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_NO, 1L, 1L,
2L, 2L, 3);
- assertValues(stats, 1, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 2L, 2L,
+ assertValues(stats, 1, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_NO, 2L, 2L,
2L, 2L, 4);
- assertValues(stats, 2, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_ROAMING, 3L, 3L,
+ assertValues(stats, 2, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_YES, 3L, 3L,
2L, 2L, 5);
- assertValues(stats, 3, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 4L,
+ assertValues(stats, 3, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_NO, 4L,
40L, 4L, 40L, 7);
- assertValues(stats, 4, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 5L,
+ assertValues(stats, 4, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_NO, 5L,
50L, 4L, 40L, 8);
- assertValues(stats, 5, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 6L,
+ assertValues(stats, 5, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_NO, 6L,
60L, 5L, 50L, 10);
- assertValues(stats, 6, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_ROAMING, 7L,
+ assertValues(stats, 6, TEST_IFACE, TEST_UID, SET_DEFAULT, TAG_NONE, ROAMING_YES, 7L,
70L, 5L, 50L, 11);
}
@@ -152,19 +152,19 @@
stats.combineValues(TEST_IFACE, 1001, SET_DEFAULT, TAG_NONE, -128L, -1L,
-128L, -1L, -1);
- assertValues(stats, 0, TEST_IFACE, 1001, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 384L, 3L,
+ assertValues(stats, 0, TEST_IFACE, 1001, SET_DEFAULT, TAG_NONE, ROAMING_NO, 384L, 3L,
128L, 1L, 9);
- assertValues(stats, 1, TEST_IFACE, 1001, SET_DEFAULT, 0xff, ROAMING_DEFAULT, 128L, 1L, 128L,
+ assertValues(stats, 1, TEST_IFACE, 1001, SET_DEFAULT, 0xff, ROAMING_NO, 128L, 1L, 128L,
1L, 2);
// now try combining that should create row
stats.combineValues(TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, 128L, 1L,
128L, 1L, 3);
- assertValues(stats, 2, TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 128L, 1L,
+ assertValues(stats, 2, TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, ROAMING_NO, 128L, 1L,
128L, 1L, 3);
stats.combineValues(TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, 128L, 1L,
128L, 1L, 3);
- assertValues(stats, 2, TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 256L, 2L,
+ assertValues(stats, 2, TEST_IFACE, 5005, SET_DEFAULT, TAG_NONE, ROAMING_NO, 256L, 2L,
256L, 2L, 6);
}
@@ -180,9 +180,9 @@
final NetworkStats result = after.subtract(before);
// identical data should result in zero delta
- assertValues(result, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 0L, 0L, 0L,
+ assertValues(result, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 0L, 0L, 0L,
0L, 0);
- assertValues(result, 1, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 0L, 0L, 0L,
+ assertValues(result, 1, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_NO, 0L, 0L, 0L,
0L, 0);
}
@@ -198,9 +198,9 @@
final NetworkStats result = after.subtract(before);
// expect delta between measurements
- assertValues(result, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 1L, 1L, 2L,
+ assertValues(result, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 1L, 1L, 2L,
1L, 4);
- assertValues(result, 1, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 3L, 1L, 4L,
+ assertValues(result, 1, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_NO, 3L, 1L, 4L,
1L, 8);
}
@@ -217,11 +217,11 @@
final NetworkStats result = after.subtract(before);
// its okay to have new rows
- assertValues(result, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 0L, 0L, 0L,
+ assertValues(result, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 0L, 0L, 0L,
0L, 0);
- assertValues(result, 1, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 0L, 0L, 0L,
+ assertValues(result, 1, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_NO, 0L, 0L, 0L,
0L, 0);
- assertValues(result, 2, TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 1024L, 8L,
+ assertValues(result, 2, TEST_IFACE, 102, SET_DEFAULT, TAG_NONE, ROAMING_NO, 1024L, 8L,
1024L, 8L, 20);
}
@@ -237,7 +237,7 @@
// should silently drop omitted rows
assertEquals(1, result.size());
- assertValues(result, 0, TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 1L,
+ assertValues(result, 0, TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, ROAMING_NO, 1L,
2L, 3L, 4L, 0);
assertEquals(4L, result.getTotalBytes());
}
@@ -264,11 +264,11 @@
assertEquals(64L, uidTag.getTotalBytes());
final NetworkStats uidRoaming = new NetworkStats(TEST_START, 3)
- .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 32L, 0L, 0L, 0L,
+ .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 32L, 0L, 0L, 0L,
0L)
- .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 32L, 0L, 0L, 0L,
+ .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_NO, 32L, 0L, 0L, 0L,
0L)
- .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_ROAMING, 32L, 0L, 0L, 0L,
+ .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_YES, 32L, 0L, 0L, 0L,
0L);
assertEquals(96L, uidRoaming.getTotalBytes());
}
@@ -283,11 +283,11 @@
public void testGroupedByIfaceAll() throws Exception {
final NetworkStats uidStats = new NetworkStats(TEST_START, 3)
- .addValues(IFACE_ALL, 100, SET_ALL, TAG_NONE, ROAMING_DEFAULT, 128L, 8L, 0L, 2L,
+ .addValues(IFACE_ALL, 100, SET_ALL, TAG_NONE, ROAMING_NO, 128L, 8L, 0L, 2L,
20L)
- .addValues(IFACE_ALL, 101, SET_FOREGROUND, TAG_NONE, ROAMING_DEFAULT, 128L, 8L, 0L,
+ .addValues(IFACE_ALL, 101, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 128L, 8L, 0L,
2L, 20L)
- .addValues(IFACE_ALL, 101, SET_ALL, TAG_NONE, ROAMING_ROAMING, 128L, 8L, 0L, 2L,
+ .addValues(IFACE_ALL, 101, SET_ALL, TAG_NONE, ROAMING_YES, 128L, 8L, 0L, 2L,
20L);
final NetworkStats grouped = uidStats.groupedByIface();
@@ -300,19 +300,19 @@
public void testGroupedByIface() throws Exception {
final NetworkStats uidStats = new NetworkStats(TEST_START, 7)
- .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 128L, 8L, 0L,
+ .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 128L, 8L, 0L,
2L, 20L)
- .addValues(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 512L, 32L, 0L,
+ .addValues(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 512L, 32L, 0L,
0L, 0L)
- .addValues(TEST_IFACE2, 100, SET_DEFAULT, 0xF00D, ROAMING_DEFAULT, 64L, 4L, 0L, 0L,
+ .addValues(TEST_IFACE2, 100, SET_DEFAULT, 0xF00D, ROAMING_NO, 64L, 4L, 0L, 0L,
0L)
- .addValues(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, ROAMING_DEFAULT, 512L, 32L,
+ .addValues(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 512L, 32L,
0L, 0L, 0L)
- .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 128L, 8L, 0L,
+ .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_NO, 128L, 8L, 0L,
0L, 0L)
- .addValues(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, ROAMING_DEFAULT, 128L, 8L, 0L, 0L,
+ .addValues(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, ROAMING_NO, 128L, 8L, 0L, 0L,
0L)
- .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_ROAMING, 128L, 8L, 0L,
+ .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_YES, 128L, 8L, 0L,
0L, 0L);
final NetworkStats grouped = uidStats.groupedByIface();
@@ -328,49 +328,49 @@
public void testAddAllValues() {
final NetworkStats first = new NetworkStats(TEST_START, 5)
- .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 32L, 0L, 0L, 0L,
+ .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 32L, 0L, 0L, 0L,
0L)
- .addValues(TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, ROAMING_DEFAULT, 32L, 0L, 0L,
+ .addValues(TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 32L, 0L, 0L,
0L, 0L)
- .addValues(TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, ROAMING_ROAMING, 32L, 0L, 0L,
+ .addValues(TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, ROAMING_YES, 32L, 0L, 0L,
0L, 0L);
final NetworkStats second = new NetworkStats(TEST_START, 2)
- .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 32L, 0L, 0L, 0L,
+ .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 32L, 0L, 0L, 0L,
0L)
- .addValues(TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 32L, 0L,
+ .addValues(TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, ROAMING_NO, 32L, 0L,
0L, 0L, 0L)
- .addValues(TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, ROAMING_ROAMING, 32L, 0L, 0L,
+ .addValues(TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, ROAMING_YES, 32L, 0L, 0L,
0L, 0L);
first.combineAllValues(second);
assertEquals(4, first.size());
- assertValues(first, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 64L, 0L, 0L,
+ assertValues(first, 0, TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 64L, 0L, 0L,
0L, 0L);
- assertValues(first, 1, TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, ROAMING_DEFAULT, 32L, 0L,
+ assertValues(first, 1, TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 32L, 0L,
0L, 0L, 0L);
- assertValues(first, 2, TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, ROAMING_ROAMING, 64L, 0L,
+ assertValues(first, 2, TEST_IFACE, 100, SET_FOREGROUND, TAG_NONE, ROAMING_YES, 64L, 0L,
0L, 0L, 0L);
- assertValues(first, 3, TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 32L,
+ assertValues(first, 3, TEST_IFACE2, UID_ALL, SET_DEFAULT, TAG_NONE, ROAMING_NO, 32L,
0L, 0L, 0L, 0L);
}
public void testGetTotal() {
final NetworkStats stats = new NetworkStats(TEST_START, 7)
- .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 128L, 8L, 0L,
+ .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 128L, 8L, 0L,
2L, 20L)
- .addValues(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 512L, 32L, 0L,
+ .addValues(TEST_IFACE2, 100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 512L, 32L, 0L,
0L, 0L)
- .addValues(TEST_IFACE2, 100, SET_DEFAULT, 0xF00D, ROAMING_DEFAULT, 64L, 4L, 0L, 0L,
+ .addValues(TEST_IFACE2, 100, SET_DEFAULT, 0xF00D, ROAMING_NO, 64L, 4L, 0L, 0L,
0L)
- .addValues(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, ROAMING_DEFAULT, 512L, 32L,
+ .addValues(TEST_IFACE2, 100, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 512L, 32L,
0L, 0L, 0L)
- .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 128L, 8L, 0L,
+ .addValues(TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_NO, 128L, 8L, 0L,
0L, 0L)
- .addValues(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, ROAMING_DEFAULT, 128L, 8L, 0L, 0L,
+ .addValues(TEST_IFACE, 101, SET_DEFAULT, 0xF00D, ROAMING_NO, 128L, 8L, 0L, 0L,
0L)
- .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_ROAMING, 128L, 8L, 0L,
+ .addValues(TEST_IFACE, 100, SET_DEFAULT, TAG_NONE, ROAMING_YES, 128L, 8L, 0L,
0L, 0L);
assertValues(stats.getTotal(null), 1408L, 88L, 0L, 2L, 20L);
@@ -396,9 +396,9 @@
final NetworkStats after = before.withoutUids(new int[] { 100 });
assertEquals(6, before.size());
assertEquals(2, after.size());
- assertValues(after, 0, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 128L, 8L,
+ assertValues(after, 0, TEST_IFACE, 101, SET_DEFAULT, TAG_NONE, ROAMING_NO, 128L, 8L,
0L, 0L, 0L);
- assertValues(after, 1, TEST_IFACE, 101, SET_DEFAULT, 0xF00D, ROAMING_DEFAULT, 128L, 8L, 0L,
+ assertValues(after, 1, TEST_IFACE, 101, SET_DEFAULT, 0xF00D, ROAMING_NO, 128L, 8L, 0L,
0L, 0L);
}
@@ -457,53 +457,53 @@
assertEquals(21, delta.size());
// tunIface and TEST_IFACE entries are not changed.
- assertValues(delta, 0, tunIface, 10100, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT,
+ assertValues(delta, 0, tunIface, 10100, SET_DEFAULT, TAG_NONE, ROAMING_NO,
39605L, 46L, 12259L, 55L, 0L);
- assertValues(delta, 1, tunIface, 10100, SET_FOREGROUND, TAG_NONE, ROAMING_DEFAULT, 0L, 0L,
+ assertValues(delta, 1, tunIface, 10100, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 0L, 0L,
0L, 0L, 0L);
- assertValues(delta, 2, tunIface, 10120, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT,
+ assertValues(delta, 2, tunIface, 10120, SET_DEFAULT, TAG_NONE, ROAMING_NO,
72667L, 197L, 43909L, 241L, 0L);
- assertValues(delta, 3, tunIface, 10120, SET_FOREGROUND, TAG_NONE, ROAMING_DEFAULT,
+ assertValues(delta, 3, tunIface, 10120, SET_FOREGROUND, TAG_NONE, ROAMING_NO,
9297L, 17L, 4128L, 21L, 0L);
- assertValues(delta, 4, tunIface, tunUid, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT,
+ assertValues(delta, 4, tunIface, tunUid, SET_DEFAULT, TAG_NONE, ROAMING_NO,
4983L, 10L, 1801L, 12L, 0L);
- assertValues(delta, 5, tunIface, tunUid, SET_FOREGROUND, TAG_NONE, ROAMING_DEFAULT, 0L, 0L,
+ assertValues(delta, 5, tunIface, tunUid, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 0L, 0L,
0L, 0L, 0L);
- assertValues(delta, 6, tunIface, 10120, SET_DEFAULT, testTag1, ROAMING_DEFAULT,
+ assertValues(delta, 6, tunIface, 10120, SET_DEFAULT, testTag1, ROAMING_NO,
21691L, 41L, 13820L, 51L, 0L);
- assertValues(delta, 7, tunIface, 10120, SET_FOREGROUND, testTag1, ROAMING_DEFAULT, 1281L,
+ assertValues(delta, 7, tunIface, 10120, SET_FOREGROUND, testTag1, ROAMING_NO, 1281L,
2L, 665L, 2L, 0L);
- assertValues(delta, 8, TEST_IFACE, 10100, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 1685L, 5L,
+ assertValues(delta, 8, TEST_IFACE, 10100, SET_DEFAULT, TAG_NONE, ROAMING_NO, 1685L, 5L,
2070L, 6L, 0L);
// Existing underlying Iface entries are updated
- assertValues(delta, 9, underlyingIface, 10100, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT,
+ assertValues(delta, 9, underlyingIface, 10100, SET_DEFAULT, TAG_NONE, ROAMING_NO,
44783L, 54L, 13829L, 60L, 0L);
- assertValues(delta, 10, underlyingIface, 10100, SET_FOREGROUND, TAG_NONE, ROAMING_DEFAULT,
+ assertValues(delta, 10, underlyingIface, 10100, SET_FOREGROUND, TAG_NONE, ROAMING_NO,
0L, 0L, 0L, 0L, 0L);
// VPN underlying Iface entries are updated
- assertValues(delta, 11, underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT,
+ assertValues(delta, 11, underlyingIface, tunUid, SET_DEFAULT, TAG_NONE, ROAMING_NO,
28304L, 27L, 1719L, 12L, 0L);
- assertValues(delta, 12, underlyingIface, tunUid, SET_FOREGROUND, TAG_NONE, ROAMING_DEFAULT,
+ assertValues(delta, 12, underlyingIface, tunUid, SET_FOREGROUND, TAG_NONE, ROAMING_NO,
0L, 0L, 0L, 0L, 0L);
// New entries are added for new application's underlying Iface traffic
- assertContains(delta, underlyingIface, 10120, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT,
+ assertContains(delta, underlyingIface, 10120, SET_DEFAULT, TAG_NONE, ROAMING_NO,
72667L, 197L, 41872L, 219L, 0L);
- assertContains(delta, underlyingIface, 10120, SET_FOREGROUND, TAG_NONE, ROAMING_DEFAULT,
+ assertContains(delta, underlyingIface, 10120, SET_FOREGROUND, TAG_NONE, ROAMING_NO,
9297L, 17L, 3936, 19L, 0L);
- assertContains(delta, underlyingIface, 10120, SET_DEFAULT, testTag1, ROAMING_DEFAULT,
+ assertContains(delta, underlyingIface, 10120, SET_DEFAULT, testTag1, ROAMING_NO,
21691L, 41L, 13179L, 46L, 0L);
- assertContains(delta, underlyingIface, 10120, SET_FOREGROUND, testTag1, ROAMING_DEFAULT,
+ assertContains(delta, underlyingIface, 10120, SET_FOREGROUND, testTag1, ROAMING_NO,
1281L, 2L, 634L, 1L, 0L);
// New entries are added for debug purpose
- assertContains(delta, underlyingIface, 10100, SET_DBG_VPN_IN, TAG_NONE, ROAMING_DEFAULT,
+ assertContains(delta, underlyingIface, 10100, SET_DBG_VPN_IN, TAG_NONE, ROAMING_NO,
39605L, 46L, 11690, 49, 0);
- assertContains(delta, underlyingIface, 10120, SET_DBG_VPN_IN, TAG_NONE, ROAMING_DEFAULT,
+ assertContains(delta, underlyingIface, 10120, SET_DBG_VPN_IN, TAG_NONE, ROAMING_NO,
81964, 214, 45808, 238, 0);
- assertContains(delta, underlyingIface, tunUid, SET_DBG_VPN_IN, TAG_NONE, ROAMING_DEFAULT,
+ assertContains(delta, underlyingIface, tunUid, SET_DBG_VPN_IN, TAG_NONE, ROAMING_NO,
4983, 10, 1717, 10, 0);
assertContains(delta, underlyingIface, tunUid, SET_DBG_VPN_OUT, TAG_NONE, ROAMING_ALL,
126552, 270, 59215, 297, 0);
diff --git a/core/tests/coretests/src/com/android/internal/net/NetworkStatsFactoryTest.java b/core/tests/coretests/src/com/android/internal/net/NetworkStatsFactoryTest.java
index 12a75b8..327f3fd 100644
--- a/core/tests/coretests/src/com/android/internal/net/NetworkStatsFactoryTest.java
+++ b/core/tests/coretests/src/com/android/internal/net/NetworkStatsFactoryTest.java
@@ -16,7 +16,7 @@
package com.android.internal.net;
-import static android.net.NetworkStats.ROAMING_DEFAULT;
+import static android.net.NetworkStats.ROAMING_NO;
import static android.net.NetworkStats.SET_ALL;
import static android.net.NetworkStats.SET_DEFAULT;
import static android.net.NetworkStats.SET_FOREGROUND;
@@ -157,7 +157,7 @@
private static void assertStatsEntry(NetworkStats stats, String iface, int uid, int set,
int tag, long rxBytes, long txBytes) {
- final int i = stats.findIndex(iface, uid, set, tag, ROAMING_DEFAULT);
+ final int i = stats.findIndex(iface, uid, set, tag, ROAMING_NO);
final NetworkStats.Entry entry = stats.getValues(i, null);
assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes);
assertEquals("unexpected txBytes", txBytes, entry.txBytes);
@@ -165,7 +165,7 @@
private static void assertStatsEntry(NetworkStats stats, String iface, int uid, int set,
int tag, long rxBytes, long rxPackets, long txBytes, long txPackets) {
- final int i = stats.findIndex(iface, uid, set, tag, ROAMING_DEFAULT);
+ final int i = stats.findIndex(iface, uid, set, tag, ROAMING_NO);
final NetworkStats.Entry entry = stats.getValues(i, null);
assertEquals("unexpected rxBytes", rxBytes, entry.rxBytes);
assertEquals("unexpected rxPackets", rxPackets, entry.rxPackets);
diff --git a/libs/hwui/Android.mk b/libs/hwui/Android.mk
index f6e3b50..ca07738 100644
--- a/libs/hwui/Android.mk
+++ b/libs/hwui/Android.mk
@@ -255,6 +255,7 @@
ifeq (true, $(HWUI_NEW_OPS))
LOCAL_SRC_FILES += \
tests/unit/BakedOpDispatcherTests.cpp \
+ tests/unit/BakedOpRendererTests.cpp \
tests/unit/BakedOpStateTests.cpp \
tests/unit/FrameBuilderTests.cpp \
tests/unit/LeakCheckTests.cpp \
diff --git a/libs/hwui/BakedOpRenderer.cpp b/libs/hwui/BakedOpRenderer.cpp
index da5ecca..bb3ea3f 100644
--- a/libs/hwui/BakedOpRenderer.cpp
+++ b/libs/hwui/BakedOpRenderer.cpp
@@ -40,6 +40,16 @@
void BakedOpRenderer::startRepaintLayer(OffscreenBuffer* offscreenBuffer, const Rect& repaintRect) {
LOG_ALWAYS_FATAL_IF(mRenderTarget.offscreenBuffer, "already has layer...");
+ // subtract repaintRect from region, since it will be regenerated
+ if (repaintRect.contains(0, 0,
+ offscreenBuffer->viewportWidth, offscreenBuffer->viewportHeight)) {
+ // repaint full layer, so throw away entire region
+ offscreenBuffer->region.clear();
+ } else {
+ offscreenBuffer->region.subtractSelf(android::Rect(repaintRect.left, repaintRect.top,
+ repaintRect.right, repaintRect.bottom));
+ }
+
mRenderTarget.offscreenBuffer = offscreenBuffer;
// create and bind framebuffer
diff --git a/libs/hwui/ClipArea.cpp b/libs/hwui/ClipArea.cpp
index afe9807..f886dda 100644
--- a/libs/hwui/ClipArea.cpp
+++ b/libs/hwui/ClipArea.cpp
@@ -41,6 +41,10 @@
return transformedBounds;
}
+void ClipBase::dump() const {
+ ALOGD("mode %d" RECT_STRING, mode, RECT_ARGS(rect));
+}
+
/*
* TransformedRectangle
*/
diff --git a/libs/hwui/ClipArea.h b/libs/hwui/ClipArea.h
index 479796d..1654eb8 100644
--- a/libs/hwui/ClipArea.h
+++ b/libs/hwui/ClipArea.h
@@ -106,6 +106,8 @@
// Bounds of the clipping area, used to define the scissor, and define which
// portion of the stencil is updated/used
Rect rect;
+
+ void dump() const;
};
struct ClipRect : ClipBase {
diff --git a/libs/hwui/LayerBuilder.cpp b/libs/hwui/LayerBuilder.cpp
index c5af279..e6a95ff 100644
--- a/libs/hwui/LayerBuilder.cpp
+++ b/libs/hwui/LayerBuilder.cpp
@@ -349,8 +349,9 @@
}
void LayerBuilder::dump() const {
- ALOGD("LayerBuilder %p, %ux%u buffer %p, blo %p, rn %p",
- this, width, height, offscreenBuffer, beginLayerOp, renderNode);
+ ALOGD("LayerBuilder %p, %ux%u buffer %p, blo %p, rn %p (%s)",
+ this, width, height, offscreenBuffer, beginLayerOp,
+ renderNode, renderNode ? renderNode->getName() : "-");
for (const BatchBase* batch : mBatches) {
batch->dump();
}
diff --git a/libs/hwui/RecordingCanvas.cpp b/libs/hwui/RecordingCanvas.cpp
index f0c79d7..11eb825 100644
--- a/libs/hwui/RecordingCanvas.cpp
+++ b/libs/hwui/RecordingCanvas.cpp
@@ -356,11 +356,15 @@
}
void RecordingCanvas::drawRoundRect(float left, float top, float right, float bottom,
float rx, float ry, const SkPaint& paint) {
- addOp(alloc().create_trivial<RoundRectOp>(
- Rect(left, top, right, bottom),
- *(mState.currentSnapshot()->transform),
- getRecordedClip(),
- refPaint(&paint), rx, ry));
+ if (CC_LIKELY(MathUtils::isPositive(rx) || MathUtils::isPositive(ry))) {
+ addOp(alloc().create_trivial<RoundRectOp>(
+ Rect(left, top, right, bottom),
+ *(mState.currentSnapshot()->transform),
+ getRecordedClip(),
+ refPaint(&paint), rx, ry));
+ } else {
+ drawRect(left, top, right, bottom, paint);
+ }
}
void RecordingCanvas::drawRoundRect(
diff --git a/libs/hwui/debug/nullgles.cpp b/libs/hwui/debug/nullgles.cpp
index ffb0649..8689f98 100644
--- a/libs/hwui/debug/nullgles.cpp
+++ b/libs/hwui/debug/nullgles.cpp
@@ -133,6 +133,15 @@
}
}
+GLenum glCheckFramebufferStatus(GLenum target) {
+ switch (target) {
+ case GL_FRAMEBUFFER:
+ return GL_FRAMEBUFFER_COMPLETE;
+ default:
+ return 0; // error case
+ }
+}
+
const char* getString(GLenum name) {
switch (name) {
case GL_VENDOR:
diff --git a/libs/hwui/renderstate/OffscreenBufferPool.cpp b/libs/hwui/renderstate/OffscreenBufferPool.cpp
index 5f984b5..bb1a044 100644
--- a/libs/hwui/renderstate/OffscreenBufferPool.cpp
+++ b/libs/hwui/renderstate/OffscreenBufferPool.cpp
@@ -164,6 +164,9 @@
// resize in place
layer->viewportWidth = width;
layer->viewportHeight = height;
+
+ // entire area will be repainted (and may be smaller) so clear usage region
+ layer->region.clear();
return layer;
}
putOrDelete(layer);
diff --git a/libs/hwui/tests/unit/BakedOpRendererTests.cpp b/libs/hwui/tests/unit/BakedOpRendererTests.cpp
new file mode 100644
index 0000000..59bd75e
--- /dev/null
+++ b/libs/hwui/tests/unit/BakedOpRendererTests.cpp
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+#include <gtest/gtest.h>
+
+#include <BakedOpRenderer.h>
+#include <tests/common/TestUtils.h>
+
+using namespace android::uirenderer;
+
+const BakedOpRenderer::LightInfo sLightInfo = { 128, 128 };
+
+RENDERTHREAD_TEST(BakedOpRenderer, startRepaintLayer_clear) {
+ BakedOpRenderer renderer(Caches::getInstance(), renderThread.renderState(), true, sLightInfo);
+ OffscreenBuffer layer(renderThread.renderState(), Caches::getInstance(), 200u, 200u);
+
+ layer.dirty(Rect(200, 200));
+ {
+ renderer.startRepaintLayer(&layer, Rect(200, 200));
+ EXPECT_TRUE(layer.region.isEmpty()) << "Repaint full layer should clear region";
+ renderer.endLayer();
+ }
+
+ layer.dirty(Rect(200, 200));
+ {
+ renderer.startRepaintLayer(&layer, Rect(100, 200)); // repainting left side
+ EXPECT_TRUE(layer.region.isRect());
+ //ALOGD("bounds %d %d %d %d", RECT_ARGS(layer.region.getBounds()));
+ EXPECT_EQ(android::Rect(100, 0, 200, 200), layer.region.getBounds())
+ << "Left side being repainted, so right side should be clear";
+ renderer.endLayer();
+ }
+
+ // right side is now only dirty portion
+ {
+ renderer.startRepaintLayer(&layer, Rect(100, 0, 200, 200)); // repainting right side
+ EXPECT_TRUE(layer.region.isEmpty())
+ << "Now right side being repainted, so region should be entirely clear";
+ renderer.endLayer();
+ }
+}
diff --git a/libs/hwui/tests/unit/OffscreenBufferPoolTests.cpp b/libs/hwui/tests/unit/OffscreenBufferPoolTests.cpp
index 0c6eb57..37a485e 100644
--- a/libs/hwui/tests/unit/OffscreenBufferPoolTests.cpp
+++ b/libs/hwui/tests/unit/OffscreenBufferPoolTests.cpp
@@ -103,9 +103,11 @@
OffscreenBufferPool pool;
auto layer = pool.get(thread.renderState(), 64u, 64u);
+ layer->dirty(Rect(64, 64));
// resize in place
ASSERT_EQ(layer, pool.resize(layer, 60u, 55u));
+ EXPECT_TRUE(layer->region.isEmpty()) << "In place resize should clear usage region";
EXPECT_EQ(60u, layer->viewportWidth);
EXPECT_EQ(55u, layer->viewportHeight);
EXPECT_EQ(64u, layer->texture.width());
@@ -113,9 +115,13 @@
// resized to use different object in pool
auto layer2 = pool.get(thread.renderState(), 128u, 128u);
+ layer2->dirty(Rect(128, 128));
+ EXPECT_FALSE(layer2->region.isEmpty());
pool.putOrDelete(layer2);
ASSERT_EQ(1u, pool.getCount());
+
ASSERT_EQ(layer2, pool.resize(layer, 120u, 125u));
+ EXPECT_TRUE(layer2->region.isEmpty()) << "Swap resize should clear usage region";
EXPECT_EQ(120u, layer2->viewportWidth);
EXPECT_EQ(125u, layer2->viewportHeight);
EXPECT_EQ(128u, layer2->texture.width());
diff --git a/libs/hwui/tests/unit/RecordingCanvasTests.cpp b/libs/hwui/tests/unit/RecordingCanvasTests.cpp
index c3165bb..5e613fd 100644
--- a/libs/hwui/tests/unit/RecordingCanvasTests.cpp
+++ b/libs/hwui/tests/unit/RecordingCanvasTests.cpp
@@ -114,6 +114,23 @@
EXPECT_EQ(Rect(10, 20, 90, 180), op.unmappedBounds);
}
+TEST(RecordingCanvas, drawRoundRect) {
+ // Round case - stays rounded
+ auto dl = TestUtils::createDisplayList<RecordingCanvas>(100, 200, [](RecordingCanvas& canvas) {
+ canvas.drawRoundRect(0, 0, 100, 100, 10, 10, SkPaint());
+ });
+ ASSERT_EQ(1u, dl->getOps().size()) << "Must be exactly one op";
+ ASSERT_EQ(RecordedOpId::RoundRectOp, dl->getOps()[0]->opId);
+
+ // Non-rounded case - turned into drawRect
+ dl = TestUtils::createDisplayList<RecordingCanvas>(100, 200, [](RecordingCanvas& canvas) {
+ canvas.drawRoundRect(0, 0, 100, 100, 0, -1, SkPaint());
+ });
+ ASSERT_EQ(1u, dl->getOps().size()) << "Must be exactly one op";
+ ASSERT_EQ(RecordedOpId::RectOp, dl->getOps()[0]->opId)
+ << "Non-rounded rects should be converted";
+}
+
TEST(RecordingCanvas, drawText) {
auto dl = TestUtils::createDisplayList<RecordingCanvas>(200, 200, [](RecordingCanvas& canvas) {
SkPaint paint;
diff --git a/media/java/android/media/AudioRecord.java b/media/java/android/media/AudioRecord.java
index 3771474..0f82cfc 100644
--- a/media/java/android/media/AudioRecord.java
+++ b/media/java/android/media/AudioRecord.java
@@ -394,30 +394,48 @@
* value here as no error checking is or can be done.
*/
/*package*/ AudioRecord(long nativeRecordInJavaObj) {
- int[] session = { 0 };
- int[] rates = { 0 };
- //TODO: update native initialization when information about hardware init failure
- // due to capture device already open is available.
- // Note that for this native_setup, we are providing an already created/initialized
- // *Native* AudioRecord, so the attributes parameters to native_setup() are ignored.
- int initResult = native_setup(new WeakReference<AudioRecord>(this),
- null /*mAudioAttributes*/,
- rates /*mSampleRates*/,
- 0 /*mChannelMask*/,
- 0 /*mChannelIndexMask*/,
- 0 /*mAudioFormat*/,
- 0 /*mNativeBufferSizeInBytes*/,
- session,
- ActivityThread.currentOpPackageName(),
- nativeRecordInJavaObj);
- if (initResult != SUCCESS) {
- loge("Error code "+initResult+" when initializing native AudioRecord object.");
- return; // with mState == STATE_UNINITIALIZED
+ mNativeRecorderInJavaObj = 0;
+ mNativeCallbackCookie = 0;
+ mNativeDeviceCallback = 0;
+
+ // other initialization...
+ if (nativeRecordInJavaObj != 0) {
+ deferred_connect(nativeRecordInJavaObj);
+ } else {
+ mState = STATE_UNINITIALIZED;
}
+ }
- mSessionId = session[0];
+ /**
+ * @hide
+ */
+ /* package */ void deferred_connect(long nativeRecordInJavaObj) {
+ if (mState != STATE_INITIALIZED) {
+ int[] session = { 0 };
+ int[] rates = { 0 };
+ //TODO: update native initialization when information about hardware init failure
+ // due to capture device already open is available.
+ // Note that for this native_setup, we are providing an already created/initialized
+ // *Native* AudioRecord, so the attributes parameters to native_setup() are ignored.
+ int initResult = native_setup(new WeakReference<AudioRecord>(this),
+ null /*mAudioAttributes*/,
+ rates /*mSampleRates*/,
+ 0 /*mChannelMask*/,
+ 0 /*mChannelIndexMask*/,
+ 0 /*mAudioFormat*/,
+ 0 /*mNativeBufferSizeInBytes*/,
+ session,
+ ActivityThread.currentOpPackageName(),
+ nativeRecordInJavaObj);
+ if (initResult != SUCCESS) {
+ loge("Error code "+initResult+" when initializing native AudioRecord object.");
+ return; // with mState == STATE_UNINITIALIZED
+ }
- mState = STATE_INITIALIZED;
+ mSessionId = session[0];
+
+ mState = STATE_INITIALIZED;
+ }
}
/**
diff --git a/media/java/android/media/AudioTrack.java b/media/java/android/media/AudioTrack.java
index 2aac2b3..c5d1120 100644
--- a/media/java/android/media/AudioTrack.java
+++ b/media/java/android/media/AudioTrack.java
@@ -526,11 +526,18 @@
* the AudioTrackRoutingProxy subclass.
* @param nativeTrackInJavaObj a C/C++ pointer to a native AudioTrack
* (associated with an OpenSL ES player).
+ * IMPORTANT: For "N", this method is ONLY called to setup a Java routing proxy,
+ * i.e. IAndroidConfiguration::AcquireJavaProxy(). If we call with a 0 in nativeTrackInJavaObj
+ * it means that the OpenSL player interface hasn't been realized, so there is no native
+ * Audiotrack to connect to. In this case wait to call deferred_connect() until the
+ * OpenSLES interface is realized.
*/
/*package*/ AudioTrack(long nativeTrackInJavaObj) {
// "final"s
mAttributes = null;
mAppOps = null;
+ mNativeTrackInJavaObj = 0;
+ mJniData = 0;
// remember which looper is associated with the AudioTrack instantiation
Looper looper;
@@ -540,28 +547,41 @@
mInitializationLooper = looper;
// other initialization...
- // Note that for this native_setup, we are providing an already created/initialized
- // *Native* AudioTrack, so the attributes parameters to native_setup() are ignored.
- int[] session = { 0 };
- int[] rates = { 0 };
- int initResult = native_setup(new WeakReference<AudioTrack>(this),
- null /*mAttributes - NA*/,
- rates /*sampleRate - NA*/,
- 0 /*mChannelMask - NA*/,
- 0 /*mChannelIndexMask - NA*/,
- 0 /*mAudioFormat - NA*/,
- 0 /*mNativeBufferSizeInBytes - NA*/,
- 0 /*mDataLoadMode - NA*/,
- session,
- nativeTrackInJavaObj);
- if (initResult != SUCCESS) {
- loge("Error code "+initResult+" when initializing AudioTrack.");
- return; // with mState == STATE_UNINITIALIZED
+ if (nativeTrackInJavaObj != 0) {
+ deferred_connect(nativeTrackInJavaObj);
+ } else {
+ mState = STATE_UNINITIALIZED;
}
+ }
- mSessionId = session[0];
+ /**
+ * @hide
+ */
+ /* package */ void deferred_connect(long nativeTrackInJavaObj) {
+ if (mState != STATE_INITIALIZED) {
+ // Note that for this native_setup, we are providing an already created/initialized
+ // *Native* AudioTrack, so the attributes parameters to native_setup() are ignored.
+ int[] session = { 0 };
+ int[] rates = { 0 };
+ int initResult = native_setup(new WeakReference<AudioTrack>(this),
+ null /*mAttributes - NA*/,
+ rates /*sampleRate - NA*/,
+ 0 /*mChannelMask - NA*/,
+ 0 /*mChannelIndexMask - NA*/,
+ 0 /*mAudioFormat - NA*/,
+ 0 /*mNativeBufferSizeInBytes - NA*/,
+ 0 /*mDataLoadMode - NA*/,
+ session,
+ nativeTrackInJavaObj);
+ if (initResult != SUCCESS) {
+ loge("Error code "+initResult+" when initializing AudioTrack.");
+ return; // with mState == STATE_UNINITIALIZED
+ }
- mState = STATE_INITIALIZED;
+ mSessionId = session[0];
+
+ mState = STATE_INITIALIZED;
+ }
}
/**
diff --git a/packages/DocumentsUI/tests/src/com/android/documentsui/FilesActivityUiTest.java b/packages/DocumentsUI/tests/src/com/android/documentsui/FilesActivityUiTest.java
index 59dc232..e4afc3d 100644
--- a/packages/DocumentsUI/tests/src/com/android/documentsui/FilesActivityUiTest.java
+++ b/packages/DocumentsUI/tests/src/com/android/documentsui/FilesActivityUiTest.java
@@ -183,6 +183,7 @@
// We don't really need to test the entirety of download support
// since downloads is (almost) just another provider.
+ @Suppress
public void testDownload_Queued() throws Exception {
DownloadManager dm = (DownloadManager) context.getSystemService(
Context.DOWNLOAD_SERVICE);
@@ -194,6 +195,7 @@
bots.directory.assertDocumentsPresent("Queued");
}
+ @Suppress
public void testDownload_RetryUnsuccessful() throws Exception {
DownloadManager dm = (DownloadManager) context.getSystemService(
Context.DOWNLOAD_SERVICE);
diff --git a/packages/SystemUI/res/layout/tv_pip_onboarding.xml b/packages/SystemUI/res/layout/tv_pip_onboarding.xml
index f031bb4..b0814cf 100644
--- a/packages/SystemUI/res/layout/tv_pip_onboarding.xml
+++ b/packages/SystemUI/res/layout/tv_pip_onboarding.xml
@@ -37,10 +37,13 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
+ android:paddingStart="24dp"
+ android:paddingEnd="24dp"
android:fontFamily="sans-serif"
android:textSize="16sp"
android:textColor="#EEEEEE"
android:lineSpacingMultiplier="1.28"
+ android:gravity="top|center_horizontal"
android:text="@string/pip_onboarding_description" />
<Button
android:id="@+id/close"
diff --git a/packages/SystemUI/res/layout/tv_pip_overlay.xml b/packages/SystemUI/res/layout/tv_pip_overlay.xml
index 40c6fa1..1ba423b 100644
--- a/packages/SystemUI/res/layout/tv_pip_overlay.xml
+++ b/packages/SystemUI/res/layout/tv_pip_overlay.xml
@@ -24,13 +24,19 @@
<TextView
android:id="@+id/guide_overlay"
android:layout_width="match_parent"
- android:layout_height="32dp"
+ android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
+ android:paddingTop="6dp"
+ android:paddingBottom="6dp"
+ android:paddingStart="10dp"
+ android:paddingEnd="10dp"
android:textSize="14sp"
android:textColor="#EEEEEE"
android:fontFamily="sans-serif"
android:background="@drawable/tv_pip_overlay_background"
+ android:lineSpacingMultiplier="1.465"
android:gravity="center"
+ android:maxLines="2"
android:text="@string/pip_hold_home" />
<LinearLayout
android:id="@+id/guide_buttons"
diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index e50f975..6a9f456 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -178,7 +178,7 @@
<dimen name="qs_date_alarm_anim_translation">22dp</dimen>
<dimen name="qs_date_collapsed_text_size">14sp</dimen>
<dimen name="qs_date_text_size">16sp</dimen>
- <dimen name="qs_header_gear_translation">150dp</dimen>
+ <dimen name="qs_header_gear_translation">16dp</dimen>
<dimen name="qs_page_indicator_size">12dp</dimen>
<dimen name="qs_tile_icon_size">24dp</dimen>
<dimen name="qs_tile_text_size">12sp</dimen>
diff --git a/packages/SystemUI/res/values/strings_tv.xml b/packages/SystemUI/res/values/strings_tv.xml
index b35038d..0e1fe8f 100644
--- a/packages/SystemUI/res/values/strings_tv.xml
+++ b/packages/SystemUI/res/values/strings_tv.xml
@@ -27,13 +27,12 @@
<string name="pip_play">Play</string>
<!-- Button to pause the current media on picture-in-picture (PIP) [CHAR LIMIT=16] -->
<string name="pip_pause">Pause</string>
- <!-- Overlay text on picture-in-picture (PIP) to indicate that longpress HOME key to control PIP [CHAR LIMIT=25] -->
+ <!-- Overlay text on picture-in-picture (PIP) to indicate that longpress HOME key to control PIP [CHAR LIMIT=52] -->
<string name="pip_hold_home">Hold <b>HOME</b> to control PIP</string>
<!-- Picture-in-Picture (PIP) onboarding screen -->
<eat-comment />
- <!-- Description for picture-in-picture (PIP) onboarding screen to indicate that longpress HOME key to control PIP.
- Line break is needed as if we have CHAR LIMIT=25. [CHAR LIMIT=NONE] -->
- <string name="pip_onboarding_description">Press and hold the HOME\nbutton to control PIP</string>
+ <!-- Description for picture-in-picture (PIP) onboarding screen to indicate that longpress HOME key to control PIP. [CHAR LIMIT=NONE] -->
+ <string name="pip_onboarding_description">Press and hold the HOME button to control PIP</string>
<!-- Button to close picture-in-picture (PIP) onboarding screen. -->
<string name="pip_onboarding_button">Got it</string>
<!-- Font for Recents -->
diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
index f601f90..88b6caa 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/QSAnimator.java
@@ -41,6 +41,7 @@
private static final String MOVE_FULL_ROWS = "sysui_qs_move_whole_rows";
public static final float EXPANDED_TILE_DELAY = .7f;
+ private static final float LAST_ROW_EXPANDED_DELAY = .84f;
private final ArrayList<View> mAllViews = new ArrayList<>();
private final ArrayList<View> mTopFiveQs = new ArrayList<>();
@@ -56,6 +57,7 @@
private TouchAnimator mTranslationXAnimator;
private TouchAnimator mTranslationYAnimator;
private TouchAnimator mNonfirstPageAnimator;
+ private TouchAnimator mLastRowAnimator;
private boolean mOnKeyguard;
@@ -129,20 +131,20 @@
TouchAnimator.Builder firstPageBuilder = new Builder();
TouchAnimator.Builder translationXBuilder = new Builder();
TouchAnimator.Builder translationYBuilder = new Builder();
- TouchAnimator.Builder firstPageDelayedBuilder = new Builder();
+ TouchAnimator.Builder lastRowBuilder = new Builder();
+
Collection<QSTile<?>> tiles = mQsPanel.getHost().getTiles();
int count = 0;
int[] loc1 = new int[2];
int[] loc2 = new int[2];
int lastYDiff = 0;
- firstPageDelayedBuilder.setStartDelay(EXPANDED_TILE_DELAY);
- firstPageBuilder.setListener(this);
- // Fade in the tiles/labels as we reach the final position.
- firstPageDelayedBuilder.addFloat(mQsPanel.getTileLayout(), "alpha", 0, 1);
+
clearAnimationState();
mAllViews.clear();
mTopFiveQs.clear();
+
mAllViews.add((View) mQsPanel.getTileLayout());
+
for (QSTile<?> tile : tiles) {
QSTileBaseView tileView = mQsPanel.getTileView(tile);
final TextView label = ((QSTileView) tileView).getLabel();
@@ -171,22 +173,30 @@
mTopFiveQs.add(tileIcon);
mAllViews.add(tileIcon);
- mAllViews.add(label);
mAllViews.add(quickTileView);
} else if (mFullRows && isIconInAnimatedRow(count)) {
firstPageBuilder.addFloat(tileView, "translationY", mQsPanel.getHeight(), 0);
translationYBuilder.addFloat(label, "translationY", -lastYDiff, 0);
translationYBuilder.addFloat(tileIcon, "translationY", -lastYDiff, 0);
mAllViews.add(tileIcon);
- mAllViews.add(label);
+ } else {
+ lastRowBuilder.addFloat(tileView, "alpha", 0, 1);
}
mAllViews.add(tileView);
mAllViews.add(label);
count++;
}
if (mAllowFancy) {
- mFirstPageAnimator = firstPageBuilder.build();
- mFirstPageDelayedAnimator = firstPageDelayedBuilder.build();
+ mFirstPageAnimator = firstPageBuilder
+ .setListener(this)
+ .build();
+ // Fade in the tiles/labels as we reach the final position.
+ mFirstPageDelayedAnimator = new TouchAnimator.Builder()
+ .setStartDelay(EXPANDED_TILE_DELAY)
+ .addFloat(mQsPanel.getTileLayout(), "alpha", 0, 1).build();
+ mLastRowAnimator = lastRowBuilder
+ .setStartDelay(LAST_ROW_EXPANDED_DELAY)
+ .build();
Path path = new Path();
path.moveTo(0, 0);
path.cubicTo(0, 0, 0, 1, 1, 1);
@@ -235,6 +245,7 @@
mFirstPageDelayedAnimator.setPosition(position);
mTranslationXAnimator.setPosition(position);
mTranslationYAnimator.setPosition(position);
+ mLastRowAnimator.setPosition(position);
} else {
mNonfirstPageAnimator.setPosition(position);
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
index 93cb952..246f15e 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/ExpandableNotificationRow.java
@@ -745,6 +745,9 @@
public Animator getTranslateViewAnimator(final float leftTarget,
AnimatorUpdateListener listener) {
+ if (mTranslateAnim != null) {
+ mTranslateAnim.cancel();
+ }
if (areGutsExposed()) {
// No translation if guts are exposed.
return null;
@@ -769,19 +772,27 @@
if (listener != null) {
translateAnim.addUpdateListener(listener);
}
- }
- translateAnim.addListener(new AnimatorListenerAdapter() {
- @Override
- public void onAnimationEnd(Animator anim) {
- if (mSettingsIconRow != null && leftTarget == 0) {
- mSettingsIconRow.resetState();
+ translateAnim.addListener(new AnimatorListenerAdapter() {
+ boolean cancelled = false;
+
+ @Override
+ public void onAnimationCancel(Animator anim) {
+ cancelled = true;
}
- mTranslateAnim = null;
- }
- });
+
+ @Override
+ public void onAnimationEnd(Animator anim) {
+ if (!cancelled && mSettingsIconRow != null && leftTarget == 0) {
+ mSettingsIconRow.resetState();
+ mTranslateAnim = null;
+ }
+ }
+ });
+ }
set.play(translateAnim);
}
}
+ mTranslateAnim = set;
return set;
}
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java
index b29c807..8f329c4 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/QuickStatusBarHeader.java
@@ -83,7 +83,6 @@
private float mDateScaleFactor;
private float mGearTranslation;
- private TouchAnimator mAnimator;
private TouchAnimator mSecondHalfAnimator;
private TouchAnimator mFirstHalfAnimator;
private TouchAnimator mDateSizeAnimator;
@@ -154,12 +153,7 @@
mDateScaleFactor = dateExpandedSize / dateCollapsedSize;
updateDateTimePosition();
- mAnimator = new TouchAnimator.Builder()
- .addFloat(mSettingsContainer, "translationY", -mGearTranslation, 0)
- .addFloat(mMultiUserSwitch, "translationY", -mGearTranslation, 0)
- .build();
mSecondHalfAnimator = new TouchAnimator.Builder()
- .addFloat(mSettingsButton, "rotation", -180, 0)
.addFloat(mAlarmStatus, "alpha", 0, 1)
.addFloat(mEmergencyOnly, "alpha", 0, 1)
.setStartDelay(.5f)
@@ -174,6 +168,9 @@
.setStartDelay(.36f)
.build();
mSettingsAlpha = new TouchAnimator.Builder()
+ .addFloat(mSettingsContainer, "translationY", -mGearTranslation, 0)
+ .addFloat(mMultiUserSwitch, "translationY", -mGearTranslation, 0)
+ .addFloat(mSettingsButton, "rotation", -90, 0)
.addFloat(mSettingsContainer, "alpha", 0, 1)
.addFloat(mMultiUserSwitch, "alpha", 0, 1)
.setStartDelay(QSAnimator.EXPANDED_TILE_DELAY)
@@ -211,7 +208,6 @@
@Override
public void setExpansion(float headerExpansionFraction) {
mExpansionAmount = headerExpansionFraction;
- mAnimator.setPosition(headerExpansionFraction);
mSecondHalfAnimator.setPosition(headerExpansionFraction);
mFirstHalfAnimator.setPosition(headerExpansionFraction);
mDateSizeAnimator.setPosition(headerExpansionFraction);
diff --git a/services/core/java/com/android/server/BluetoothManagerService.java b/services/core/java/com/android/server/BluetoothManagerService.java
index e241a4a..799a763 100644
--- a/services/core/java/com/android/server/BluetoothManagerService.java
+++ b/services/core/java/com/android/server/BluetoothManagerService.java
@@ -761,6 +761,11 @@
if (mEnableExternal && isBluetoothPersistedStateOnBluetooth()) {
if (DBG) Slog.d(TAG, "Auto-enabling Bluetooth.");
sendEnableMsg(mQuietEnableExternal);
+ } else if (!isNameAndAddressSet()) {
+ if (DBG) Slog.d(TAG, "Getting adapter name and address");
+ enable();
+ waitForOnOff(true, false);
+ disable(true);
}
}
@@ -1001,6 +1006,7 @@
}
}
}
+
// mAddress is accessed from outside.
// It is alright without a lock. Here, bluetooth is off, no other thread is
// changing mAddress
@@ -1181,6 +1187,15 @@
Slog.e(TAG,"Unable to call configHciSnoopLog", e);
}
+ if (!isNameAndAddressSet()) {
+ try {
+ storeNameAndAddress(mBluetooth.getName(),
+ mBluetooth.getAddress());
+ } catch (RemoteException re) {
+ Slog.e(TAG, "Unable to grab names", re);
+ }
+ }
+
//Register callback object
try {
mBluetooth.registerCallback(mBluetoothCallback);
diff --git a/services/core/java/com/android/server/content/SyncManager.java b/services/core/java/com/android/server/content/SyncManager.java
index e1d208e..e5342ce 100644
--- a/services/core/java/com/android/server/content/SyncManager.java
+++ b/services/core/java/com/android/server/content/SyncManager.java
@@ -78,8 +78,9 @@
import android.util.Log;
import android.util.Pair;
import android.util.Slog;
-import android.util.SparseArray;
+import com.android.server.LocalServices;
+import com.android.server.job.JobSchedulerInternal;
import com.google.android.collect.Lists;
import com.google.android.collect.Maps;
@@ -113,9 +114,7 @@
* All scheduled syncs will be passed on to JobScheduler as jobs
* (See {@link #scheduleSyncOperationH(SyncOperation, long)}. This function schedules a job
* with JobScheduler with appropriate delay and constraints (according to backoffs and extras).
- * A local copy of each scheduled SyncOperation object is stored in {@link mScheduledSyncs}.This
- * acts as a cache, so that we don't have to query JobScheduler every time we want to get a list of
- * all scheduled operations. The scheduleSyncOperationH function also assigns a unique jobId to each
+ * The scheduleSyncOperationH function also assigns a unique jobId to each
* SyncOperation.
*
* Periodic Syncs:
@@ -129,14 +128,6 @@
* run at a later time. Similarly, when a sync succeeds, backoff is cleared and all associated syncs
* are rescheduled. A rescheduled sync will get a new jobId.
*
- * State of {@link mScheduledSyncs}:
- * Every one-off SyncOperation will be put into this SparseArray when it is scheduled with
- * JobScheduler. And it will be removed once JobScheduler has started the job. Periodic syncs work
- * differently. They will always be present in mScheduledSyncs until the periodic sync is removed.
- * This is to ensure that if a request to add a periodic sync comes in, we add a new one only if a
- * duplicate doesn't exist. At every point of time, mScheduledSyncs and JobScheduler will show the
- * same pending syncs.
- *
* @hide
*/
public class SyncManager {
@@ -220,6 +211,7 @@
private final NotificationManager mNotificationMgr;
private final IBatteryStats mBatteryStats;
private JobScheduler mJobScheduler;
+ private JobSchedulerInternal mJobSchedulerInternal;
private SyncJobService mSyncJobService;
private SyncStorageEngine mSyncStorageEngine;
@@ -235,14 +227,13 @@
protected SyncAdaptersCache mSyncAdapters;
- // Cache of all operations scheduled on the JobScheduler so that JobScheduler doesn't have
- // to be queried often.
- private SparseArray<SyncOperation> mScheduledSyncs = new SparseArray<SyncOperation>(32);
private final Random mRand;
- private boolean isJobIdInUseLockedH(int jobId) {
- if (mScheduledSyncs.indexOfKey(jobId) >= 0) {
- return true;
+ private boolean isJobIdInUseLockedH(int jobId, List<JobInfo> pendingJobs) {
+ for (JobInfo job: pendingJobs) {
+ if (job.getId() == jobId) {
+ return true;
+ }
}
for (ActiveSyncContext asc: mActiveSyncContexts) {
if (asc.mSyncOperation.jobId == jobId) {
@@ -253,35 +244,25 @@
}
private int getUnusedJobIdH() {
- synchronized (mScheduledSyncs) {
- int newJobId;
- do {
- newJobId = MIN_SYNC_JOB_ID + mRand.nextInt(MAX_SYNC_JOB_ID - MIN_SYNC_JOB_ID);
- } while (isJobIdInUseLockedH(newJobId));
- return newJobId;
- }
+ int newJobId;
+ do {
+ newJobId = MIN_SYNC_JOB_ID + mRand.nextInt(MAX_SYNC_JOB_ID - MIN_SYNC_JOB_ID);
+ } while (isJobIdInUseLockedH(newJobId,
+ mJobSchedulerInternal.getSystemScheduledPendingJobs()));
+ return newJobId;
}
- private void addSyncOperationToCache(SyncOperation op) {
- synchronized (mScheduledSyncs) {
- mScheduledSyncs.put(op.jobId, op);
- }
- }
-
- private void removeSyncOperationFromCache(int jobId) {
- synchronized (mScheduledSyncs) {
- mScheduledSyncs.remove(jobId);
- }
- }
-
- private List<SyncOperation> getAllPendingSyncsFromCache() {
- synchronized (mScheduledSyncs) {
- List<SyncOperation> pending = new ArrayList<SyncOperation>(mScheduledSyncs.size());
- for (int i=0; i<mScheduledSyncs.size(); i++) {
- pending.add(mScheduledSyncs.valueAt(i));
+ private List<SyncOperation> getAllPendingSyncs() {
+ verifyJobScheduler();
+ List<JobInfo> pendingJobs = mJobSchedulerInternal.getSystemScheduledPendingJobs();
+ List<SyncOperation> pendingSyncs = new ArrayList<SyncOperation>(pendingJobs.size());
+ for (JobInfo job: pendingJobs) {
+ SyncOperation op = SyncOperation.maybeCreateFromJobExtras(job.getExtras());
+ if (op != null) {
+ pendingSyncs.add(op);
}
- return pending;
}
+ return pendingSyncs;
}
private final BroadcastReceiver mStorageIntentReceiver =
@@ -443,7 +424,7 @@
mSyncHandler.postAtFrontOfQueue(new Runnable() {
@Override
public void run() {
- List<SyncOperation> ops = getAllPendingSyncsFromCache();
+ List<SyncOperation> ops = getAllPendingSyncs();
Set<String> cleanedKeys = new HashSet<String>();
for (SyncOperation opx: ops) {
if (cleanedKeys.contains(opx.key)) {
@@ -455,7 +436,6 @@
continue;
}
if (opx.key.equals(opy.key)) {
- removeSyncOperationFromCache(opy.jobId);
mJobScheduler.cancel(opy.jobId);
}
}
@@ -473,18 +453,16 @@
}
mJobScheduler = (JobScheduler) mContext.getSystemService(
Context.JOB_SCHEDULER_SERVICE);
+ mJobSchedulerInternal = LocalServices.getService(JobSchedulerInternal.class);
// Get all persisted syncs from JobScheduler
List<JobInfo> pendingJobs = mJobScheduler.getAllPendingJobs();
- synchronized (mScheduledSyncs) {
- for (JobInfo job : pendingJobs) {
- SyncOperation op = SyncOperation.maybeCreateFromJobExtras(job.getExtras());
- if (op != null) {
- mScheduledSyncs.put(op.jobId, op);
- if (!op.isPeriodic) {
- // Set the pending status of this EndPoint to true. Pending icon is
- // shown on the settings activity.
- mSyncStorageEngine.markPending(op.target, true);
- }
+ for (JobInfo job : pendingJobs) {
+ SyncOperation op = SyncOperation.maybeCreateFromJobExtras(job.getExtras());
+ if (op != null) {
+ if (!op.isPeriodic) {
+ // Set the pending status of this EndPoint to true. Pending icon is
+ // shown on the settings activity.
+ mSyncStorageEngine.markPending(op.target, true);
}
}
}
@@ -707,7 +685,7 @@
}
private void setAuthorityPendingState(EndPoint info) {
- List<SyncOperation> ops = getAllPendingSyncsFromCache();
+ List<SyncOperation> ops = getAllPendingSyncs();
for (SyncOperation op: ops) {
if (!op.isPeriodic && op.target.matchesSpec(info)) {
getSyncStorageEngine().markPending(info, true);
@@ -927,11 +905,10 @@
private void removeSyncsForAuthority(EndPoint info) {
verifyJobScheduler();
- List<SyncOperation> ops = getAllPendingSyncsFromCache();
+ List<SyncOperation> ops = getAllPendingSyncs();
for (SyncOperation op: ops) {
if (op.target.matchesSpec(info)) {
- removeSyncOperationFromCache(op.jobId);
- getJobScheduler().cancel(op.jobId);
+ getJobScheduler().cancel(op.jobId);
}
}
}
@@ -961,7 +938,7 @@
* Get a list of periodic syncs corresponding to the given target.
*/
public List<PeriodicSync> getPeriodicSyncs(EndPoint target) {
- List<SyncOperation> ops = getAllPendingSyncsFromCache();
+ List<SyncOperation> ops = getAllPendingSyncs();
List<PeriodicSync> periodicSyncs = new ArrayList<PeriodicSync>();
for (SyncOperation op: ops) {
@@ -1145,12 +1122,11 @@
* to current backoff and delayUntil values of this EndPoint.
*/
private void rescheduleSyncs(EndPoint target) {
- List<SyncOperation> ops = getAllPendingSyncsFromCache();
+ List<SyncOperation> ops = getAllPendingSyncs();
int count = 0;
for (SyncOperation op: ops) {
if (!op.isPeriodic && op.target.matchesSpec(target)) {
count++;
- removeSyncOperationFromCache(op.jobId);
getJobScheduler().cancel(op.jobId);
postScheduleSyncMessage(op);
}
@@ -1251,7 +1227,7 @@
int duplicatesCount = 0;
long now = SystemClock.elapsedRealtime();
syncOperation.expectedRuntime = now + minDelay;
- List<SyncOperation> pending = getAllPendingSyncsFromCache();
+ List<SyncOperation> pending = getAllPendingSyncs();
SyncOperation opWithLeastExpectedRuntime = syncOperation;
for (SyncOperation op : pending) {
if (op.isPeriodic) {
@@ -1276,7 +1252,6 @@
if (isLoggable) {
Slog.v(TAG, "Cancelling duplicate sync " + op);
}
- removeSyncOperationFromCache(op.jobId);
getJobScheduler().cancel(op.jobId);
}
}
@@ -1294,7 +1269,6 @@
if (syncOperation.jobId == SyncOperation.NO_JOB_ID) {
syncOperation.jobId = getUnusedJobIdH();
}
- addSyncOperationToCache(syncOperation);
if (isLoggable) {
Slog.v(TAG, "scheduling sync operation " + syncOperation.toString());
@@ -1335,10 +1309,9 @@
* have null account/provider info to specify all accounts/providers.
*/
public void clearScheduledSyncOperations(SyncStorageEngine.EndPoint info) {
- List<SyncOperation> ops = getAllPendingSyncsFromCache();
+ List<SyncOperation> ops = getAllPendingSyncs();
for (SyncOperation op: ops) {
if (!op.isPeriodic && op.target.matchesSpec(info)) {
- removeSyncOperationFromCache(op.jobId);
getJobScheduler().cancel(op.jobId);
getSyncStorageEngine().markPending(op.target, false);
}
@@ -1353,11 +1326,10 @@
* @param extras extras bundle to uniquely identify sync.
*/
public void cancelScheduledSyncOperation(SyncStorageEngine.EndPoint info, Bundle extras) {
- List<SyncOperation> ops = getAllPendingSyncsFromCache();
+ List<SyncOperation> ops = getAllPendingSyncs();
for (SyncOperation op: ops) {
if (!op.isPeriodic && op.target.matchesSpec(info)
&& syncExtrasEquals(extras, op.extras, false)) {
- removeSyncOperationFromCache(op.jobId);
getJobScheduler().cancel(op.jobId);
}
}
@@ -1466,10 +1438,9 @@
// Clean up the storage engine database
mSyncStorageEngine.doDatabaseCleanup(new Account[0], userId);
- List<SyncOperation> ops = getAllPendingSyncsFromCache();
+ List<SyncOperation> ops = getAllPendingSyncs();
for (SyncOperation op: ops) {
if (op.target.userId == userId) {
- removeSyncOperationFromCache(op.jobId);
getJobScheduler().cancel(op.jobId);
}
}
@@ -1635,7 +1606,7 @@
protected void dumpPendingSyncs(PrintWriter pw) {
pw.println("Pending Syncs:");
- List<SyncOperation> pendingSyncs = getAllPendingSyncsFromCache();
+ List<SyncOperation> pendingSyncs = getAllPendingSyncs();
int count = 0;
for (SyncOperation op: pendingSyncs) {
if (!op.isPeriodic) {
@@ -1649,7 +1620,7 @@
protected void dumpPeriodicSyncs(PrintWriter pw) {
pw.println("Periodic Syncs:");
- List<SyncOperation> pendingSyncs = getAllPendingSyncsFromCache();
+ List<SyncOperation> pendingSyncs = getAllPendingSyncs();
int count = 0;
for (SyncOperation op: pendingSyncs) {
if (op.isPeriodic) {
@@ -2259,10 +2230,6 @@
private boolean tryEnqueueMessageUntilReadyToRun(Message msg) {
synchronized (this) {
if (!mBootCompleted || !mProvisioned) {
- if (msg.what == MESSAGE_START_SYNC) {
- SyncOperation op = (SyncOperation) msg.obj;
- addSyncOperationToCache(op);
- }
// Need to copy the message bc looper will recycle it.
Message m = Message.obtain(msg);
mUnreadyQueue.add(m);
@@ -2479,7 +2446,6 @@
if (op.isPeriodic) {
scheduleSyncOperationH(op.createOneTimeSyncOperation(), delay);
} else {
- removeSyncOperationFromCache(op.jobId);
scheduleSyncOperationH(op, delay);
}
}
@@ -2489,7 +2455,6 @@
if (op.isPeriodic) {
scheduleSyncOperationH(op.createOneTimeSyncOperation(), delay);
} else {
- removeSyncOperationFromCache(op.jobId);
scheduleSyncOperationH(op, delay);
}
}
@@ -2515,7 +2480,7 @@
if (op.isPeriodic) {
// Don't allow this periodic to run if a previous instance failed and is currently
// scheduled according to some backoff criteria.
- List<SyncOperation> ops = getAllPendingSyncsFromCache();
+ List<SyncOperation> ops = getAllPendingSyncs();
for (SyncOperation syncOperation: ops) {
if (syncOperation.sourcePeriodicId == op.jobId) {
mSyncJobService.callJobFinished(op.jobId, false);
@@ -2535,9 +2500,6 @@
deferSyncH(op, 0 /* No minimum delay */);
return;
}
- } else {
- // Remove SyncOperation entry from mScheduledSyncs cache for non periodic jobs.
- removeSyncOperationFromCache(op.jobId);
}
// Check for conflicting syncs.
@@ -2616,10 +2578,9 @@
}
}
- List<SyncOperation> ops = getAllPendingSyncsFromCache();
+ List<SyncOperation> ops = getAllPendingSyncs();
for (SyncOperation op: ops) {
if (!containsAccountAndUser(accounts, op.target.account, op.target.userId)) {
- removeSyncOperationFromCache(op.jobId);
getJobScheduler().cancel(op.jobId);
}
}
@@ -2665,7 +2626,7 @@
+ " flexMillis: " + flex
+ " extras: " + extras.toString());
}
- List<SyncOperation> ops = getAllPendingSyncsFromCache();
+ List<SyncOperation> ops = getAllPendingSyncs();
for (SyncOperation op: ops) {
if (op.isPeriodic && op.target.matchesSpec(target)
&& syncExtrasEquals(op.extras, extras, true /* includeSyncSettings */)) {
@@ -2704,7 +2665,7 @@
*/
private void removePeriodicSyncInternalH(SyncOperation syncOperation) {
// Remove this periodic sync and all one-off syncs initiated by it.
- List<SyncOperation> ops = getAllPendingSyncsFromCache();
+ List<SyncOperation> ops = getAllPendingSyncs();
for (SyncOperation op: ops) {
if (op.sourcePeriodicId == syncOperation.jobId || op.jobId == syncOperation.jobId) {
ActiveSyncContext asc = findActiveSyncContextH(syncOperation.jobId);
@@ -2712,7 +2673,6 @@
mSyncJobService.callJobFinished(syncOperation.jobId, false);
runSyncFinishedOrCanceledH(null, asc);
}
- removeSyncOperationFromCache(op.jobId);
getJobScheduler().cancel(op.jobId);
}
}
@@ -2720,7 +2680,7 @@
private void removePeriodicSyncH(EndPoint target, Bundle extras) {
verifyJobScheduler();
- List<SyncOperation> ops = getAllPendingSyncsFromCache();
+ List<SyncOperation> ops = getAllPendingSyncs();
for (SyncOperation op: ops) {
if (op.isPeriodic && op.target.matchesSpec(target)
&& syncExtrasEquals(op.extras, extras, true /* includeSyncSettings */)) {
@@ -2896,7 +2856,7 @@
private void reschedulePeriodicSyncH(SyncOperation syncOperation) {
// Ensure that the periodic sync wasn't removed.
SyncOperation periodicSync = null;
- List<SyncOperation> ops = getAllPendingSyncsFromCache();
+ List<SyncOperation> ops = getAllPendingSyncs();
for (SyncOperation op: ops) {
if (op.isPeriodic && syncOperation.matchesPeriodicOperation(op)) {
periodicSync = op;
diff --git a/services/core/java/com/android/server/job/JobSchedulerInternal.java b/services/core/java/com/android/server/job/JobSchedulerInternal.java
new file mode 100644
index 0000000..75170ec
--- /dev/null
+++ b/services/core/java/com/android/server/job/JobSchedulerInternal.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2016 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 com.android.server.job;
+
+import android.app.job.JobInfo;
+
+import java.util.List;
+
+/**
+ * JobScheduler local system service interface.
+ * {@hide} Only for use within the system server.
+ */
+public interface JobSchedulerInternal {
+
+ /**
+ * Returns a list of pending jobs scheduled by the system service.
+ */
+ List<JobInfo> getSystemScheduledPendingJobs();
+}
diff --git a/services/core/java/com/android/server/job/JobSchedulerService.java b/services/core/java/com/android/server/job/JobSchedulerService.java
index d2b77aa..cee46195 100644
--- a/services/core/java/com/android/server/job/JobSchedulerService.java
+++ b/services/core/java/com/android/server/job/JobSchedulerService.java
@@ -45,6 +45,7 @@
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
+import android.os.Process;
import android.os.PowerManager;
import android.os.RemoteException;
import android.os.ResultReceiver;
@@ -505,6 +506,7 @@
@Override
public void onStart() {
+ publishLocalService(JobSchedulerInternal.class, new LocalService());
publishBinderService(Context.JOB_SCHEDULER_SERVICE, mJobSchedulerStub);
}
@@ -1178,6 +1180,28 @@
return -1;
}
+ final class LocalService implements JobSchedulerInternal {
+
+ /**
+ * Returns a list of all pending jobs. A running job is not considered pending. Periodic
+ * jobs are always considered pending.
+ */
+ public List<JobInfo> getSystemScheduledPendingJobs() {
+ synchronized (mLock) {
+ final List<JobInfo> pendingJobs = new ArrayList<JobInfo>();
+ mJobs.forEachJob(Process.SYSTEM_UID, new JobStatusFunctor() {
+ @Override
+ public void process(JobStatus job) {
+ if (job.getJob().isPeriodic() || !isCurrentlyActiveLocked(job)) {
+ pendingJobs.add(job.getJob());
+ }
+ }
+ });
+ return pendingJobs;
+ }
+ }
+ }
+
/**
* Binder stub trampoline implementation
*/
diff --git a/services/core/java/com/android/server/job/JobStore.java b/services/core/java/com/android/server/job/JobStore.java
index 9837a56..55f37b8 100644
--- a/services/core/java/com/android/server/job/JobStore.java
+++ b/services/core/java/com/android/server/job/JobStore.java
@@ -210,6 +210,10 @@
mJobSet.forEachJob(functor);
}
+ public void forEachJob(int uid, JobStatusFunctor functor) {
+ mJobSet.forEachJob(uid, functor);
+ }
+
public interface JobStatusFunctor {
public void process(JobStatus jobStatus);
}
@@ -870,5 +874,14 @@
}
}
}
+
+ public void forEachJob(int uid, JobStatusFunctor functor) {
+ ArraySet<JobStatus> jobs = mJobs.get(uid);
+ if (jobs != null) {
+ for (int i = jobs.size() - 1; i >= 0; i--) {
+ functor.process(jobs.valueAt(i));
+ }
+ }
+ }
}
}
diff --git a/services/core/java/com/android/server/net/NetworkStatsCollection.java b/services/core/java/com/android/server/net/NetworkStatsCollection.java
index d986e94b..673dd8f 100644
--- a/services/core/java/com/android/server/net/NetworkStatsCollection.java
+++ b/services/core/java/com/android/server/net/NetworkStatsCollection.java
@@ -17,8 +17,8 @@
package com.android.server.net;
import static android.net.NetworkStats.IFACE_ALL;
-import static android.net.NetworkStats.ROAMING_DEFAULT;
-import static android.net.NetworkStats.ROAMING_ROAMING;
+import static android.net.NetworkStats.ROAMING_NO;
+import static android.net.NetworkStats.ROAMING_YES;
import static android.net.NetworkStats.SET_ALL;
import static android.net.NetworkStats.SET_DEFAULT;
import static android.net.NetworkStats.TAG_NONE;
@@ -242,7 +242,7 @@
entry.uid = key.uid;
entry.set = key.set;
entry.tag = key.tag;
- entry.roaming = key.ident.isAnyMemberRoaming() ? ROAMING_ROAMING : ROAMING_DEFAULT;
+ entry.roaming = key.ident.isAnyMemberRoaming() ? ROAMING_YES : ROAMING_NO;
entry.rxBytes = historyEntry.rxBytes;
entry.rxPackets = historyEntry.rxPackets;
entry.txBytes = historyEntry.txBytes;
diff --git a/services/core/java/com/android/server/pm/LauncherAppsService.java b/services/core/java/com/android/server/pm/LauncherAppsService.java
index b7cd318..6cc0544 100644
--- a/services/core/java/com/android/server/pm/LauncherAppsService.java
+++ b/services/core/java/com/android/server/pm/LauncherAppsService.java
@@ -99,6 +99,15 @@
mShortcutServiceInternal.addListener(mPackageMonitor);
}
+ @VisibleForTesting
+ int injectBinderCallingUid() {
+ return getCallingUid();
+ }
+
+ private int getCallingUserId() {
+ return UserHandle.getUserId(injectBinderCallingUid());
+ }
+
/*
* @see android.content.pm.ILauncherApps#addOnAppsChangedListener(
* android.content.pm.IOnAppsChangedListener)
@@ -296,17 +305,21 @@
}
}
- private void enforceShortcutPermission(UserHandle user) {
+ private void ensureShortcutPermission(@NonNull String callingPackage, UserHandle user) {
+ verifyCallingPackage(callingPackage);
ensureInUserProfiles(user, "Cannot start activity for unrelated profile " + user);
- // STOPSHIP Implement it
+
+ if (!mShortcutServiceInternal.hasShortcutHostPermission(callingPackage,
+ user.getIdentifier())) {
+ throw new SecurityException("Caller can't access shortcut information");
+ }
}
@Override
public ParceledListSlice getShortcuts(String callingPackage, long changedSince,
String packageName, ComponentName componentName, int flags, UserHandle user)
throws RemoteException {
- enforceShortcutPermission(user);
- verifyCallingPackage(callingPackage);
+ ensureShortcutPermission(callingPackage, user);
return new ParceledListSlice<>(
mShortcutServiceInternal.getShortcuts(callingPackage, changedSince, packageName,
@@ -316,8 +329,7 @@
@Override
public ParceledListSlice getShortcutInfo(String callingPackage, String packageName,
List<String> ids, UserHandle user) throws RemoteException {
- enforceShortcutPermission(user);
- verifyCallingPackage(callingPackage);
+ ensureShortcutPermission(callingPackage, user);
return new ParceledListSlice<>(
mShortcutServiceInternal.getShortcutInfo(callingPackage, packageName,
@@ -327,8 +339,7 @@
@Override
public void pinShortcuts(String callingPackage, String packageName, List<String> ids,
UserHandle user) throws RemoteException {
- enforceShortcutPermission(user);
- verifyCallingPackage(callingPackage);
+ ensureShortcutPermission(callingPackage, user);
mShortcutServiceInternal.pinShortcuts(callingPackage, packageName,
ids, user.getIdentifier());
@@ -337,8 +348,7 @@
@Override
public int getShortcutIconResId(String callingPackage, ShortcutInfo shortcut,
UserHandle user) {
- enforceShortcutPermission(user);
- verifyCallingPackage(callingPackage);
+ ensureShortcutPermission(callingPackage, user);
return mShortcutServiceInternal.getShortcutIconResId(callingPackage, shortcut,
user.getIdentifier());
@@ -347,19 +357,24 @@
@Override
public ParcelFileDescriptor getShortcutIconFd(String callingPackage, ShortcutInfo shortcut,
UserHandle user) {
- enforceShortcutPermission(user);
- verifyCallingPackage(callingPackage);
+ ensureShortcutPermission(callingPackage, user);
return mShortcutServiceInternal.getShortcutIconFd(callingPackage, shortcut,
user.getIdentifier());
}
@Override
+ public boolean hasShortcutHostPermission(String callingPackage) throws RemoteException {
+ verifyCallingPackage(callingPackage);
+ return mShortcutServiceInternal.hasShortcutHostPermission(callingPackage,
+ getCallingUserId());
+ }
+
+ @Override
public boolean startShortcut(String callingPackage, String packageName, String shortcutId,
Rect sourceBounds, Bundle startActivityOptions, UserHandle user)
throws RemoteException {
- enforceShortcutPermission(user);
- verifyCallingPackage(callingPackage);
+ ensureShortcutPermission(callingPackage, user);
final Intent intent = mShortcutServiceInternal.createShortcutIntent(callingPackage,
packageName, shortcutId, user.getIdentifier());
@@ -656,6 +671,9 @@
IOnAppsChangedListener listener = mListeners.getBroadcastItem(i);
UserHandle listeningUser = (UserHandle) mListeners.getBroadcastCookie(i);
if (!isEnabledProfileOf(user, listeningUser, "onShortcutChanged")) continue;
+
+ // STOPSHIP Skip if the receiver doesn't have the permission.
+
try {
listener.onShortcutChanged(user, packageName,
new ParceledListSlice<>(shortcuts));
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index f8221b3..b624087 100644
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -6891,7 +6891,8 @@
// Extract pacakges only if profile-guided compilation is enabled because
// otherwise BackgroundDexOptService will not dexopt them later.
- if (!isUpgrade()) {
+ boolean prunedCache = VMRuntime.didPruneDalvikCache();
+ if (!isUpgrade() && !prunedCache) {
return;
}
@@ -6919,8 +6920,11 @@
}
if (PackageDexOptimizer.canOptimizePackage(pkg)) {
+ // If the cache was pruned, any compiled odex files will likely be out of date
+ // and would have to be patched (would be SELF_PATCHOAT, which is deprecated).
+ // Instead, force the extraction in this case.
performDexOpt(pkg.packageName, null /* instructionSet */,
- false /* useProfiles */, true /* extractOnly */, false /* force */);
+ false /* useProfiles */, true /* extractOnly */, prunedCache);
}
}
}
@@ -16452,14 +16456,17 @@
@Override
public ComponentName getHomeActivities(List<ResolveInfo> allHomeCandidates) {
+ return getHomeActivitiesAsUser(allHomeCandidates, UserHandle.getCallingUserId());
+ }
+
+ ComponentName getHomeActivitiesAsUser(List<ResolveInfo> allHomeCandidates,
+ int userId) {
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
-
- final int callingUserId = UserHandle.getCallingUserId();
List<ResolveInfo> list = queryIntentActivitiesInternal(intent, null,
- PackageManager.GET_META_DATA, callingUserId);
+ PackageManager.GET_META_DATA, userId);
ResolveInfo preferred = findPreferredActivity(intent, null, 0, list, 0,
- true, false, false, callingUserId);
+ true, false, false, userId);
allHomeCandidates.clear();
if (list != null) {
@@ -19248,6 +19255,12 @@
public ApplicationInfo getApplicationInfo(String packageName, int userId) {
return PackageManagerService.this.getApplicationInfo(packageName, 0 /*flags*/, userId);
}
+
+ @Override
+ public ComponentName getHomeActivitiesAsUser(List<ResolveInfo> allHomeCandidates,
+ int userId) {
+ return PackageManagerService.this.getHomeActivitiesAsUser(allHomeCandidates, userId);
+ }
}
@Override
diff --git a/services/core/java/com/android/server/pm/ShortcutService.java b/services/core/java/com/android/server/pm/ShortcutService.java
index 0b0f7ab..f3c63ee 100644
--- a/services/core/java/com/android/server/pm/ShortcutService.java
+++ b/services/core/java/com/android/server/pm/ShortcutService.java
@@ -28,7 +28,9 @@
import android.content.pm.LauncherApps.ShortcutQuery;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.PackageManagerInternal;
import android.content.pm.ParceledListSlice;
+import android.content.pm.ResolveInfo;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutServiceInternal;
import android.content.pm.ShortcutServiceInternal.ShortcutChangeListener;
@@ -71,6 +73,7 @@
import com.android.server.SystemService;
import libcore.io.IoUtils;
+import libcore.util.Objects;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
@@ -88,7 +91,6 @@
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
-import java.util.Map;
import java.util.function.Predicate;
/**
@@ -112,7 +114,7 @@
public class ShortcutService extends IShortcutService.Stub {
static final String TAG = "ShortcutService";
- static final boolean DEBUG = false; // STOPSHIP if true
+ static final boolean DEBUG = true; // STOPSHIP if true
static final boolean DEBUG_LOAD = false; // STOPSHIP if true
@VisibleForTesting
@@ -156,6 +158,7 @@
static final String TAG_INTENT_EXTRAS = "intent-extras";
static final String TAG_EXTRAS = "extras";
static final String TAG_SHORTCUT = "shortcut";
+ static final String TAG_LAUNCHER = "launcher";
static final String ATTR_VALUE = "value";
static final String ATTR_NAME = "name";
@@ -251,10 +254,13 @@
private CompressFormat mIconPersistFormat;
private int mIconPersistQuality;
+ private final PackageManagerInternal mPackageManagerInternal;
+
public ShortcutService(Context context) {
mContext = Preconditions.checkNotNull(context);
LocalServices.addService(ShortcutServiceInternal.class, new LocalService());
mHandler = new Handler(BackgroundThread.get().getLooper());
+ mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class);
}
/**
@@ -460,6 +466,11 @@
writeTagValue(out, tag, Long.toString(value));
}
+ static void writeTagValue(XmlSerializer out, String tag, ComponentName name) throws IOException {
+ if (name == null) return;
+ writeTagValue(out, tag, name.flattenToString());
+ }
+
static void writeTagExtra(XmlSerializer out, String tag, PersistableBundle bundle)
throws IOException, XmlPullParserException {
if (bundle == null) return;
@@ -658,7 +669,7 @@
}
// TODO Actually make it async.
- private void scheduleSaveUser(@UserIdInt int userId) {
+ void scheduleSaveUser(@UserIdInt int userId) {
synchronized (mLock) {
saveUserLocked(userId);
}
@@ -1289,6 +1300,87 @@
Slog.i(TAG, "ShortcutManager: throttling counter reset");
}
+ // We override this method in unit tests to do a simpler check.
+ boolean hasShortcutHostPermission(@NonNull String callingPackage, int userId) {
+ return hasShortcutHostPermissionInner(callingPackage, userId);
+ }
+
+ // This method is extracted so we can directly call this method from unit tests,
+ // even when hasShortcutPermission() is overridden.
+ @VisibleForTesting
+ boolean hasShortcutHostPermissionInner(@NonNull String callingPackage, int userId) {
+ synchronized (mLock) {
+ long start = 0;
+ if (DEBUG) {
+ start = System.currentTimeMillis();
+ }
+
+ final UserShortcuts user = getUserShortcutsLocked(userId);
+
+ final List<ResolveInfo> allHomeCandidates = new ArrayList<>();
+
+ // Default launcher from package manager.
+ final ComponentName defaultLauncher = injectPackageManagerInternal()
+ .getHomeActivitiesAsUser(allHomeCandidates, userId);
+
+ ComponentName detected;
+ if (defaultLauncher != null) {
+ detected = defaultLauncher;
+ if (DEBUG) {
+ Slog.v(TAG, "Default launcher from PM: " + detected);
+ }
+ } else {
+ detected = user.getLauncherComponent();
+
+ // TODO: Make sure it's still enabled.
+ if (DEBUG) {
+ Slog.v(TAG, "Cached launcher: " + detected);
+ }
+ }
+
+ if (detected == null) {
+ // If we reach here, that means it's the first check since the user was created,
+ // and there's already multiple launchers and there's no default set.
+ // Find the system one with the highest priority.
+ // (We need to check the priority too because of FallbackHome in Settings.)
+ // If there's no system launcher yet, then no one can access shortcuts, until
+ // the user explicitly
+ final int size = allHomeCandidates.size();
+
+ int lastPriority = Integer.MIN_VALUE;
+ for (int i = 0; i < size; i++) {
+ final ResolveInfo ri = allHomeCandidates.get(i);
+ if (!ri.activityInfo.applicationInfo.isSystemApp()) {
+ continue;
+ }
+ if (DEBUG) {
+ Slog.d(TAG, String.format("hasShortcutPermissionInner: pkg=%s prio=%d",
+ ri.activityInfo.getComponentName(), ri.priority));
+ }
+ if (ri.priority < lastPriority) {
+ continue;
+ }
+ detected = ri.activityInfo.getComponentName();
+ lastPriority = ri.priority;
+ }
+ }
+ if (DEBUG) {
+ long end = System.currentTimeMillis();
+ Slog.v(TAG, String.format("hasShortcutPermission took %d ms", end - start));
+ }
+ if (detected != null) {
+ if (DEBUG) {
+ Slog.v(TAG, "Detected launcher: " + detected);
+ }
+ user.setLauncherComponent(this, detected);
+ return detected.getPackageName().equals(callingPackage);
+ } else {
+ // Default launcher not found.
+ return false;
+ }
+ }
+ }
+
/**
* Entry point from {@link LauncherApps}.
*/
@@ -1434,6 +1526,11 @@
}
}
}
+
+ @Override
+ public boolean hasShortcutHostPermission(@NonNull String callingPackage, int userId) {
+ return ShortcutService.this.hasShortcutHostPermission(callingPackage, userId);
+ }
}
// === Dump ===
@@ -1512,37 +1609,74 @@
(new MyShellCommand()).exec(this, in, out, err, args, resultReceiver);
}
+ static class CommandException extends Exception {
+ public CommandException(String message) {
+ super(message);
+ }
+ }
+
/**
* Handle "adb shell cmd".
*/
private class MyShellCommand extends ShellCommand {
+
+ private int mUserId = UserHandle.USER_SYSTEM;
+
+ private void parseOptions(boolean takeUser)
+ throws CommandException {
+ String opt;
+ while ((opt = getNextOption()) != null) {
+ switch (opt) {
+ case "--user":
+ if (takeUser) {
+ mUserId = UserHandle.parseUserArg(getNextArgRequired());
+ break;
+ }
+ // fallthrough
+ default:
+ throw new CommandException("Unknown option: " + opt);
+ }
+ }
+ }
+
@Override
public int onCommand(String cmd) {
if (cmd == null) {
return handleDefaultCommands(cmd);
}
final PrintWriter pw = getOutPrintWriter();
- int ret = 1;
- switch (cmd) {
- case "reset-package-throttling":
- ret = handleResetPackageThrottling();
- break;
- case "reset-throttling":
- ret = handleResetThrottling();
- break;
- case "override-config":
- ret = handleOverrideConfig();
- break;
- case "reset-config":
- ret = handleResetConfig();
- break;
- default:
- return handleDefaultCommands(cmd);
+ try {
+ switch (cmd) {
+ case "reset-package-throttling":
+ handleResetPackageThrottling();
+ break;
+ case "reset-throttling":
+ handleResetThrottling();
+ break;
+ case "override-config":
+ handleOverrideConfig();
+ break;
+ case "reset-config":
+ handleResetConfig();
+ break;
+ case "clear-default-launcher":
+ handleClearDefaultLauncher();
+ break;
+ case "get-default-launcher":
+ handleGetDefaultLauncher();
+ break;
+ case "refresh-default-launcher":
+ handleRefreshDefaultLauncher();
+ break;
+ default:
+ return handleDefaultCommands(cmd);
+ }
+ } catch (CommandException e) {
+ pw.println("Error: " + e.getMessage());
+ return 1;
}
- if (ret == 0) {
- pw.println("Success");
- }
- return ret;
+ pw.println("Success");
+ return 0;
}
@Override
@@ -1562,6 +1696,15 @@
pw.println("cmd shortcut reset-config");
pw.println(" Reset the configuration set with \"update-config\"");
pw.println();
+ pw.println("cmd shortcut clear-default-launcher [--user USER_ID]");
+ pw.println(" Clear the cached default launcher");
+ pw.println();
+ pw.println("cmd shortcut get-default-launcher [--user USER_ID]");
+ pw.println(" Show the cached default launcher");
+ pw.println();
+ pw.println("cmd shortcut refresh-default-launcher [--user USER_ID]");
+ pw.println(" Refresh the cached default launcher");
+ pw.println();
}
private int handleResetThrottling() {
@@ -1569,49 +1712,67 @@
return 0;
}
- private int handleResetPackageThrottling() {
- final PrintWriter pw = getOutPrintWriter();
+ private void handleResetPackageThrottling() throws CommandException {
+ parseOptions(/* takeUser =*/ true);
- int userId = UserHandle.USER_SYSTEM;
- String opt;
- while ((opt = getNextOption()) != null) {
- switch (opt) {
- case "--user":
- userId = UserHandle.parseUserArg(getNextArgRequired());
- break;
- default:
- pw.println("Error: Unknown option: " + opt);
- return 1;
- }
- }
final String packageName = getNextArgRequired();
synchronized (mLock) {
- getPackageShortcutsLocked(packageName, userId).resetRateLimitingForCommandLine();
- saveUserLocked(userId);
+ getPackageShortcutsLocked(packageName, mUserId).resetRateLimitingForCommandLine();
+ saveUserLocked(mUserId);
}
-
- return 0;
}
- private int handleOverrideConfig() {
- final PrintWriter pw = getOutPrintWriter();
+ private void handleOverrideConfig() throws CommandException {
final String config = getNextArgRequired();
synchronized (mLock) {
if (!updateConfigurationLocked(config)) {
- pw.println("override-config failed. See logcat for details.");
- return 1;
+ throw new CommandException("override-config failed. See logcat for details.");
}
}
- return 0;
}
- private int handleResetConfig() {
+ private void handleResetConfig() {
synchronized (mLock) {
loadConfigurationLocked();
}
- return 0;
+ }
+
+ private void clearLauncher() {
+ synchronized (mLock) {
+ getUserShortcutsLocked(mUserId).setLauncherComponent(
+ ShortcutService.this, null);
+ }
+ }
+
+ private void showLauncher() {
+ synchronized (mLock) {
+ // This ensures to set the cached launcher. Package name doesn't matter.
+ hasShortcutHostPermissionInner("-", mUserId);
+
+ getOutPrintWriter().println("Launcher: "
+ + getUserShortcutsLocked(mUserId).getLauncherComponent());
+ }
+ }
+
+ private void handleClearDefaultLauncher() throws CommandException {
+ parseOptions(/* takeUser =*/ true);
+
+ clearLauncher();
+ }
+
+ private void handleGetDefaultLauncher() throws CommandException {
+ parseOptions(/* takeUser =*/ true);
+
+ showLauncher();
+ }
+
+ private void handleRefreshDefaultLauncher() throws CommandException {
+ parseOptions(/* takeUser =*/ true);
+
+ clearLauncher();
+ showLauncher();
}
}
@@ -1640,6 +1801,10 @@
return ActivityManager.isLowRamDeviceStatic();
}
+ PackageManagerInternal injectPackageManagerInternal() {
+ return mPackageManagerInternal;
+ }
+
File getUserBitmapFilePath(@UserIdInt int userId) {
return new File(injectUserDataPath(userId), DIRECTORY_BITMAPS);
}
@@ -1687,6 +1852,9 @@
}
}
+/**
+ * Per-user information.
+ */
class UserShortcuts {
private static final String TAG = ShortcutService.TAG;
@@ -1695,6 +1863,8 @@
private final ArrayMap<String, PackageShortcuts> mPackages = new ArrayMap<>();
+ private ComponentName mLauncherComponent;
+
public UserShortcuts(int userId) {
mUserId = userId;
}
@@ -1706,11 +1876,11 @@
public void saveToXml(XmlSerializer out) throws IOException, XmlPullParserException {
out.startTag(null, ShortcutService.TAG_USER);
- for (int i = 0; i < mPackages.size(); i++) {
- final String packageName = mPackages.keyAt(i);
- final PackageShortcuts packageShortcuts = mPackages.valueAt(i);
+ ShortcutService.writeTagValue(out, ShortcutService.TAG_LAUNCHER,
+ mLauncherComponent);
- packageShortcuts.saveToXml(out);
+ for (int i = 0; i < mPackages.size(); i++) {
+ mPackages.valueAt(i).saveToXml(out);
}
out.endTag(null, ShortcutService.TAG_USER);
@@ -1730,6 +1900,10 @@
final int depth = parser.getDepth();
final String tag = parser.getName();
switch (tag) {
+ case ShortcutService.TAG_LAUNCHER:
+ ret.mLauncherComponent = ShortcutService.parseComponentNameAttribute(
+ parser, ShortcutService.ATTR_VALUE);
+ continue;
case ShortcutService.TAG_PACKAGE:
final PackageShortcuts shortcuts = PackageShortcuts.loadFromXml(parser, userId);
@@ -1742,12 +1916,30 @@
return ret;
}
+ public ComponentName getLauncherComponent() {
+ return mLauncherComponent;
+ }
+
+ public void setLauncherComponent(ShortcutService s, ComponentName launcherComponent) {
+ if (Objects.equal(mLauncherComponent, launcherComponent)) {
+ return;
+ }
+ mLauncherComponent = launcherComponent;
+ s.scheduleSaveUser(mUserId);
+ }
+
public void dump(@NonNull ShortcutService s, @NonNull PrintWriter pw, @NonNull String prefix) {
- pw.print(" ");
+ pw.print(prefix);
pw.print("User: ");
pw.print(mUserId);
pw.println();
+ pw.print(prefix);
+ pw.print(" ");
+ pw.print("Default launcher: ");
+ pw.print(mLauncherComponent);
+ pw.println();
+
for (int i = 0; i < mPackages.size(); i++) {
mPackages.valueAt(i).dump(s, pw, prefix + " ");
}
diff --git a/services/core/java/com/android/server/policy/PhoneWindowManager.java b/services/core/java/com/android/server/policy/PhoneWindowManager.java
index 9af1304..0115a08 100644
--- a/services/core/java/com/android/server/policy/PhoneWindowManager.java
+++ b/services/core/java/com/android/server/policy/PhoneWindowManager.java
@@ -4635,7 +4635,9 @@
}
// TYPE_SYSTEM_ERROR is above the NavigationBar so it can't be allowed to extend over it.
- if ((fl & FLAG_LAYOUT_NO_LIMITS) != 0 && attrs.type != TYPE_SYSTEM_ERROR) {
+ // Also, we don't allow windows in multi-window mode to extend out of the screen.
+ if ((fl & FLAG_LAYOUT_NO_LIMITS) != 0 && attrs.type != TYPE_SYSTEM_ERROR
+ && !win.inMultiWindowMode()) {
df.left = df.top = -10000;
df.right = df.bottom = 10000;
if (attrs.type != TYPE_WALLPAPER) {
diff --git a/services/core/java/com/android/server/wm/AppWindowAnimator.java b/services/core/java/com/android/server/wm/AppWindowAnimator.java
index 55b3c7b..3a5dec9 100644
--- a/services/core/java/com/android/server/wm/AppWindowAnimator.java
+++ b/services/core/java/com/android/server/wm/AppWindowAnimator.java
@@ -171,17 +171,21 @@
transformation.setAlpha(mAppToken.isVisible() ? 1 : 0);
}
+ void setNullAnimation() {
+ animation = null;
+ usingTransferredAnimation = false;
+ }
+
public void clearAnimation() {
if (animation != null) {
- animation = null;
animating = true;
}
clearThumbnail();
+ setNullAnimation();
if (mAppToken.deferClearAllDrawn) {
mAppToken.allDrawn = false;
mAppToken.deferClearAllDrawn = false;
}
- usingTransferredAnimation = false;
}
public boolean isAnimating() {
@@ -202,9 +206,9 @@
if (animation != null) {
toAppAnimator.animation = animation;
- animation = null;
toAppAnimator.animating = animating;
toAppAnimator.animLayerAdjustment = animLayerAdjustment;
+ setNullAnimation();
animLayerAdjustment = 0;
toAppAnimator.updateLayers();
updateLayers();
@@ -311,7 +315,7 @@
if (mProlongAnimation == PROLONG_ANIMATION_AT_END) {
hasMoreFrames = true;
} else {
- animation = null;
+ setNullAnimation();
clearThumbnail();
if (DEBUG_ANIM) Slog.v(TAG, "Finished animation in " + mAppToken + " @ "
+ currentTime);
diff --git a/services/core/java/com/android/server/wm/AppWindowToken.java b/services/core/java/com/android/server/wm/AppWindowToken.java
index 9795c93..4ec297e 100644
--- a/services/core/java/com/android/server/wm/AppWindowToken.java
+++ b/services/core/java/com/android/server/wm/AppWindowToken.java
@@ -322,23 +322,6 @@
}
}
- void setWindowsExiting(boolean exiting) {
- for (int i = allAppWindows.size() - 1; i >= 0; i--) {
- WindowState win = allAppWindows.get(i);
- // If the app already requested to remove its window, we don't modify
- // its exiting state. Otherwise the stale window won't get removed on
- // exit and could cause focus to be given to the wrong window.
- if (!(win.mRemoveOnExit && win.mAnimatingExit)) {
- win.mAnimatingExit = exiting;
- }
- // If we're no longer exiting, remove the window from destroying list
- if (!win.mAnimatingExit && win.mDestroying) {
- win.mDestroying = false;
- service.mDestroySurface.remove(win);
- }
- }
- }
-
// Here we destroy surfaces which have been marked as eligible by the animator, taking care
// to ensure the client has finished with them. If the client could still be using them
// we will skip destruction and try again when the client has stopped.
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 304449dd..ab6e94c 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -2626,7 +2626,8 @@
}
// Odd choice but less odd than embedding in copyFrom()
- if ((attrs.flags & WindowManager.LayoutParams.PRIVATE_FLAG_PRESERVE_GEOMETRY) != 0) {
+ if ((attrs.privateFlags & WindowManager.LayoutParams.PRIVATE_FLAG_PRESERVE_GEOMETRY)
+ != 0) {
attrs.x = win.mAttrs.x;
attrs.y = win.mAttrs.y;
attrs.width = win.mAttrs.width;
@@ -2825,10 +2826,12 @@
if (win.isWinVisibleLw() && winAnimator.applyAnimationLocked(transit, false)) {
focusMayChange = isDefaultDisplay;
win.mAnimatingExit = true;
+ win.mWinAnimator.mAnimating = true;
} else if (win.mWinAnimator.isAnimating()) {
// Currently in a hide animation... turn this into
// an exit.
win.mAnimatingExit = true;
+ win.mWinAnimator.mAnimating = true;
} else if (mWallpaperControllerLocked.isWallpaperTarget(win)) {
// If the wallpaper is currently behind this
// window, we need to change both of them inside
@@ -4085,7 +4088,7 @@
if (transit != AppTransition.TRANSIT_UNSET) {
if (wtoken.mAppAnimator.animation == AppWindowAnimator.sDummyAnimation) {
- wtoken.mAppAnimator.animation = null;
+ wtoken.mAppAnimator.setNullAnimation();
}
if (applyAnimationLocked(wtoken, lp, transit, visible, isVoiceInteraction)) {
delayed = runningAppAnimation = true;
@@ -4195,7 +4198,7 @@
void updateTokenInPlaceLocked(AppWindowToken wtoken, int transit) {
if (transit != AppTransition.TRANSIT_UNSET) {
if (wtoken.mAppAnimator.animation == AppWindowAnimator.sDummyAnimation) {
- wtoken.mAppAnimator.animation = null;
+ wtoken.mAppAnimator.setNullAnimation();
}
applyAnimationLocked(wtoken, null, transit, false, false);
}
@@ -4255,7 +4258,6 @@
if (DEBUG_ADD_REMOVE) Slog.v(
TAG_WM, "No longer Stopped: " + wtoken);
wtoken.mAppStopped = false;
- wtoken.setWindowsExiting(false);
mOpeningApps.add(wtoken);
wtoken.startingMoved = false;
@@ -4287,6 +4289,11 @@
// animation is going on (in this case an application transition). If the animation
// was transferred from another application/animator, no dummy animator should be
// created since an animation is already in progress.
+ if (wtoken.mAppAnimator.usingTransferredAnimation
+ && wtoken.mAppAnimator.animation == null) {
+ Slog.wtf(TAG_WM, "Will NOT set dummy animation on: " + wtoken
+ + ", using null transfered animation!");
+ }
if (!wtoken.mAppAnimator.usingTransferredAnimation &&
(!wtoken.startingDisplayed || mSkipAppTransitionAnimation)) {
if (DEBUG_APP_TRANSITIONS) Slog.v(
@@ -4297,7 +4304,6 @@
if (visible) {
wtoken.mEnteringAnimation = true;
} else {
- wtoken.setWindowsExiting(true);
mClosingApps.add(wtoken);
wtoken.mEnteringAnimation = false;
}
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index 910788e..cd771ba 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -642,7 +642,7 @@
mHaveFrame = true;
final Task task = getTask();
- final boolean fullscreenTask = task == null || task.isFullscreen();
+ final boolean fullscreenTask = !inMultiWindowMode();
final boolean windowsAreFloating = task != null && task.isFloating();
if (fullscreenTask || (isChildWindow()
@@ -670,8 +670,8 @@
}
if (windowsAreFloating) {
- // In floating modes (e.g. freeform, pinned) we have only to set the rectangle
- // if it wasn't set already. No need to intersect it with the (visible)
+ // In floating modes (e.g. freeform, pinned) we have only to set the rectangle
+ // if it wasn't set already. No need to intersect it with the (visible)
// "content frame" since it is allowed to be outside the visible desktop.
if (mContainingFrame.isEmpty()) {
mContainingFrame.set(cf);
@@ -2215,6 +2215,12 @@
return task != null && task.inFreeformWorkspace();
}
+ @Override
+ public boolean inMultiWindowMode() {
+ final Task task = getTask();
+ return task != null && !task.isFullscreen();
+ }
+
boolean isDragResizeChanged() {
return mDragResizing != computeDragResizing();
}
@@ -2506,9 +2512,8 @@
final int pw = mContainingFrame.width();
final int ph = mContainingFrame.height();
final Task task = getTask();
- final boolean nonFullscreenTask = task != null && !task.isFullscreen();
- final boolean fitToDisplay = task != null &&
- !task.isFloating();
+ final boolean nonFullscreenTask = inMultiWindowMode();
+ final boolean fitToDisplay = task != null && !task.isFloating();
float x, y;
int w,h;
diff --git a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
index 8ada2f1..5ad771f 100644
--- a/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
+++ b/services/core/java/com/android/server/wm/WindowSurfacePlacer.java
@@ -1158,7 +1158,7 @@
if (!appAnimator.usingTransferredAnimation) {
appAnimator.clearThumbnail();
- appAnimator.animation = null;
+ appAnimator.setNullAnimation();
}
wtoken.inPendingTransaction = false;
@@ -1231,7 +1231,7 @@
final AppWindowAnimator appAnimator = wtoken.mAppAnimator;
if (DEBUG_APP_TRANSITIONS) Slog.v(TAG, "Now closing app " + wtoken);
appAnimator.clearThumbnail();
- appAnimator.animation = null;
+ appAnimator.setNullAnimation();
wtoken.inPendingTransaction = false;
mService.setTokenVisibilityLocked(wtoken, animLp, false, transit, false,
voiceInteraction);
@@ -1494,7 +1494,7 @@
if (DEBUG_APP_TRANSITIONS)
Slog.v(TAG, "Now animating app in place " + wtoken);
appAnimator.clearThumbnail();
- appAnimator.animation = null;
+ appAnimator.setNullAnimation();
mService.updateTokenInPlaceLocked(wtoken, transit);
wtoken.updateReportedVisibilityLocked();
diff --git a/services/tests/servicestests/src/com/android/server/net/NetworkStatsObserversTest.java b/services/tests/servicestests/src/com/android/server/net/NetworkStatsObserversTest.java
index b9e9aa9..82c6b6d 100644
--- a/services/tests/servicestests/src/com/android/server/net/NetworkStatsObserversTest.java
+++ b/services/tests/servicestests/src/com/android/server/net/NetworkStatsObserversTest.java
@@ -25,7 +25,7 @@
import static org.mockito.Mockito.when;
import static android.net.NetworkStats.SET_DEFAULT;
-import static android.net.NetworkStats.ROAMING_DEFAULT;
+import static android.net.NetworkStats.ROAMING_NO;
import static android.net.NetworkStats.TAG_NONE;
import static android.net.NetworkTemplate.buildTemplateMobileAll;
import static android.net.NetworkTemplate.buildTemplateWifiWildcard;
@@ -447,7 +447,7 @@
// Baseline
NetworkStats xtSnapshot = null;
NetworkStats uidSnapshot = new NetworkStats(TEST_START, 2 /* initialSize */)
- .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT,
+ .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO,
BASE_BYTES, 2L, BASE_BYTES, 2L, 0L);
mStatsObservers.updateStats(
xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
@@ -455,7 +455,7 @@
// Delta
uidSnapshot = new NetworkStats(TEST_START+ 2 * MINUTE_IN_MILLIS, 2 /* initialSize */)
- .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT,
+ .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO,
BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L);
mStatsObservers.updateStats(
xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
@@ -487,7 +487,7 @@
// Baseline
NetworkStats xtSnapshot = null;
NetworkStats uidSnapshot = new NetworkStats(TEST_START, 2 /* initialSize */)
- .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT,
+ .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO,
BASE_BYTES, 2L, BASE_BYTES, 2L, 0L);
mStatsObservers.updateStats(
xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
@@ -495,7 +495,7 @@
// Delta
uidSnapshot = new NetworkStats(TEST_START+ 2 * MINUTE_IN_MILLIS, 2 /* initialSize */)
- .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT,
+ .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO,
BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L);
mStatsObservers.updateStats(
xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
@@ -527,7 +527,7 @@
// Baseline
NetworkStats xtSnapshot = null;
NetworkStats uidSnapshot = new NetworkStats(TEST_START, 2 /* initialSize */)
- .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT,
+ .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO,
BASE_BYTES, 2L, BASE_BYTES, 2L, 0L);
mStatsObservers.updateStats(
xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
@@ -535,7 +535,7 @@
// Delta
uidSnapshot = new NetworkStats(TEST_START+ 2 * MINUTE_IN_MILLIS, 2 /* initialSize */)
- .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT,
+ .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO,
BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L);
mStatsObservers.updateStats(
xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
@@ -567,7 +567,7 @@
// Baseline
NetworkStats xtSnapshot = null;
NetworkStats uidSnapshot = new NetworkStats(TEST_START, 2 /* initialSize */)
- .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT,
+ .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO,
BASE_BYTES, 2L, BASE_BYTES, 2L, 0L);
mStatsObservers.updateStats(
xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
@@ -575,7 +575,7 @@
// Delta
uidSnapshot = new NetworkStats(TEST_START+ 2 * MINUTE_IN_MILLIS, 2 /* initialSize */)
- .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT,
+ .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO,
BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L);
mStatsObservers.updateStats(
xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
@@ -607,7 +607,7 @@
// Baseline
NetworkStats xtSnapshot = null;
NetworkStats uidSnapshot = new NetworkStats(TEST_START, 2 /* initialSize */)
- .addValues(TEST_IFACE, UID_ANOTHER_USER, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT,
+ .addValues(TEST_IFACE, UID_ANOTHER_USER, SET_DEFAULT, TAG_NONE, ROAMING_NO,
BASE_BYTES, 2L, BASE_BYTES, 2L, 0L);
mStatsObservers.updateStats(
xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
@@ -615,7 +615,7 @@
// Delta
uidSnapshot = new NetworkStats(TEST_START+ 2 * MINUTE_IN_MILLIS, 2 /* initialSize */)
- .addValues(TEST_IFACE, UID_ANOTHER_USER, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT,
+ .addValues(TEST_IFACE, UID_ANOTHER_USER, SET_DEFAULT, TAG_NONE, ROAMING_NO,
BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L);
mStatsObservers.updateStats(
xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
diff --git a/services/tests/servicestests/src/com/android/server/net/NetworkStatsServiceTest.java b/services/tests/servicestests/src/com/android/server/net/NetworkStatsServiceTest.java
index 4f6c7b9..74c1984 100644
--- a/services/tests/servicestests/src/com/android/server/net/NetworkStatsServiceTest.java
+++ b/services/tests/servicestests/src/com/android/server/net/NetworkStatsServiceTest.java
@@ -23,8 +23,8 @@
import static android.net.ConnectivityManager.TYPE_WIMAX;
import static android.net.NetworkStats.IFACE_ALL;
import static android.net.NetworkStats.ROAMING_ALL;
-import static android.net.NetworkStats.ROAMING_DEFAULT;
-import static android.net.NetworkStats.ROAMING_ROAMING;
+import static android.net.NetworkStats.ROAMING_NO;
+import static android.net.NetworkStats.ROAMING_YES;
import static android.net.NetworkStats.SET_ALL;
import static android.net.NetworkStats.SET_DEFAULT;
import static android.net.NetworkStats.SET_FOREGROUND;
@@ -321,8 +321,8 @@
// verify service recorded history
assertNetworkTotal(sTemplateWifi, 1024L, 8L, 2048L, 16L, 0);
assertUidTotal(sTemplateWifi, UID_RED, 1024L, 8L, 512L, 4L, 10);
- assertUidTotal(sTemplateWifi, UID_RED, SET_DEFAULT, ROAMING_DEFAULT, 512L, 4L, 256L, 2L, 4);
- assertUidTotal(sTemplateWifi, UID_RED, SET_FOREGROUND, ROAMING_DEFAULT, 512L, 4L, 256L, 2L,
+ assertUidTotal(sTemplateWifi, UID_RED, SET_DEFAULT, ROAMING_NO, 512L, 4L, 256L, 2L, 4);
+ assertUidTotal(sTemplateWifi, UID_RED, SET_FOREGROUND, ROAMING_NO, 512L, 4L, 256L, 2L,
6);
assertUidTotal(sTemplateWifi, UID_BLUE, 128L, 1L, 128L, 1L, 0);
verifyAndReset();
@@ -357,8 +357,8 @@
// after systemReady(), we should have historical stats loaded again
assertNetworkTotal(sTemplateWifi, 1024L, 8L, 2048L, 16L, 0);
assertUidTotal(sTemplateWifi, UID_RED, 1024L, 8L, 512L, 4L, 10);
- assertUidTotal(sTemplateWifi, UID_RED, SET_DEFAULT, ROAMING_DEFAULT, 512L, 4L, 256L, 2L, 4);
- assertUidTotal(sTemplateWifi, UID_RED, SET_FOREGROUND, ROAMING_DEFAULT, 512L, 4L, 256L, 2L,
+ assertUidTotal(sTemplateWifi, UID_RED, SET_DEFAULT, ROAMING_NO, 512L, 4L, 256L, 2L, 4);
+ assertUidTotal(sTemplateWifi, UID_RED, SET_FOREGROUND, ROAMING_NO, 512L, 4L, 256L, 2L,
6);
assertUidTotal(sTemplateWifi, UID_BLUE, 128L, 1L, 128L, 1L, 0);
verifyAndReset();
@@ -711,11 +711,11 @@
NetworkStats stats = mSession.getSummaryForAllUid(
sTemplateWifi, Long.MIN_VALUE, Long.MAX_VALUE, true);
assertEquals(3, stats.size());
- assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 50L, 5L,
+ assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO, 50L, 5L,
50L, 5L, 1);
- assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_DEFAULT, 10L, 1L, 10L,
+ assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_NO, 10L, 1L, 10L,
1L, 1);
- assertValues(stats, IFACE_ALL, UID_BLUE, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 2048L, 16L,
+ assertValues(stats, IFACE_ALL, UID_BLUE, SET_DEFAULT, TAG_NONE, ROAMING_NO, 2048L, 16L,
1024L, 8L, 0);
// now verify that recent history only contains one uid
@@ -723,7 +723,7 @@
stats = mSession.getSummaryForAllUid(
sTemplateWifi, currentTime - HOUR_IN_MILLIS, currentTime, true);
assertEquals(1, stats.size());
- assertValues(stats, IFACE_ALL, UID_BLUE, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 1024L, 8L,
+ assertValues(stats, IFACE_ALL, UID_BLUE, SET_DEFAULT, TAG_NONE, ROAMING_NO, 1024L, 8L,
512L, 4L, 0);
verifyAndReset();
@@ -787,13 +787,13 @@
final NetworkStats stats = mSession.getSummaryForAllUid(
sTemplateWifi, Long.MIN_VALUE, Long.MAX_VALUE, true);
assertEquals(4, stats.size());
- assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 128L, 2L,
+ assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO, 128L, 2L,
128L, 2L, 1);
- assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_DEFAULT, 64L, 1L, 64L,
+ assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_NO, 64L, 1L, 64L,
1L, 1);
- assertValues(stats, IFACE_ALL, UID_RED, SET_FOREGROUND, TAG_NONE, ROAMING_DEFAULT, 32L, 2L,
+ assertValues(stats, IFACE_ALL, UID_RED, SET_FOREGROUND, TAG_NONE, ROAMING_NO, 32L, 2L,
32L, 2L, 1);
- assertValues(stats, IFACE_ALL, UID_RED, SET_FOREGROUND, 0xFAAD, ROAMING_DEFAULT, 1L, 1L, 1L,
+ assertValues(stats, IFACE_ALL, UID_RED, SET_FOREGROUND, 0xFAAD, ROAMING_NO, 1L, 1L, 1L,
1L, 1);
verifyAndReset();
@@ -818,13 +818,13 @@
expectCurrentTime();
expectDefaultSettings();
expectNetworkStatsSummary(buildEmptyStats());
- // Note that all traffic from NetworkManagementService is tagged as ROAMING_DEFAULT, because
+ // Note that all traffic from NetworkManagementService is tagged as ROAMING_NO, because
// roaming isn't tracked at that layer. We layer it on top by inspecting the iface
// properties.
expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
- .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 128L, 2L,
+ .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO, 128L, 2L,
128L, 2L, 0L)
- .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_DEFAULT, 64L, 1L, 64L,
+ .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_NO, 64L, 1L, 64L,
1L, 0L));
expectNetworkStatsPoll();
@@ -838,9 +838,9 @@
final NetworkStats stats = mSession.getSummaryForAllUid(
sTemplateImsi1, Long.MIN_VALUE, Long.MAX_VALUE, true);
assertEquals(2, stats.size());
- assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_ROAMING, 128L, 2L,
+ assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_YES, 128L, 2L,
128L, 2L, 0);
- assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_ROAMING, 64L, 1L, 64L,
+ assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_YES, 64L, 1L, 64L,
1L, 0);
verifyAndReset();
@@ -1073,9 +1073,9 @@
expectDefaultSettings();
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
- .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, 128L, 2L,
+ .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO, 128L, 2L,
128L, 2L, 0L)
- .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_DEFAULT, 64L, 1L, 64L,
+ .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_NO, 64L, 1L, 64L,
1L, 0L));
expectNetworkStatsPoll();
@@ -1089,9 +1089,9 @@
NetworkStats stats = mSession.getSummaryForAllUid(
sTemplateImsi1, Long.MIN_VALUE, Long.MAX_VALUE, true);
assertEquals(2, stats.size());
- assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_ROAMING, 128L, 2L,
+ assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_YES, 128L, 2L,
128L, 2L, 0);
- assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_ROAMING, 64L, 1L, 64L,
+ assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_YES, 64L, 1L, 64L,
1L, 0);
verifyAndReset();
@@ -1106,9 +1106,9 @@
expectDefaultSettings();
expectNetworkStatsSummary(buildEmptyStats());
expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
- .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT,
+ .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO,
128000000L, 2L, 128000000L, 2L, 0L)
- .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_DEFAULT,
+ .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_NO,
64000000L, 1L, 64000000L, 1L, 0L));
expectNetworkStatsPoll();
@@ -1122,9 +1122,9 @@
stats = mSession.getSummaryForAllUid(
sTemplateImsi1, Long.MIN_VALUE, Long.MAX_VALUE, true);
assertEquals(2, stats.size());
- assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_ROAMING,
+ assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_YES,
128000000L, 2L, 128000000L, 2L, 0);
- assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_ROAMING,
+ assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_YES,
64000000L, 1L, 64000000L, 1L, 0);
verifyAndReset();
@@ -1180,7 +1180,7 @@
// verify summary API
final NetworkStats stats = mSession.getSummaryForNetwork(template, start, end);
- assertValues(stats, IFACE_ALL, UID_ALL, SET_DEFAULT, TAG_NONE, ROAMING_DEFAULT, rxBytes,
+ assertValues(stats, IFACE_ALL, UID_ALL, SET_DEFAULT, TAG_NONE, ROAMING_NO, rxBytes,
rxPackets, txBytes, txPackets, operations);
}
@@ -1312,11 +1312,11 @@
}
List<Integer> roamings = new ArrayList<>();
- if (roaming == ROAMING_DEFAULT || roaming == ROAMING_ALL) {
- roamings.add(ROAMING_DEFAULT);
+ if (roaming == ROAMING_NO || roaming == ROAMING_ALL) {
+ roamings.add(ROAMING_NO);
}
- if (roaming == ROAMING_ROAMING || roaming == ROAMING_ALL) {
- roamings.add(ROAMING_ROAMING);
+ if (roaming == ROAMING_YES || roaming == ROAMING_ALL) {
+ roamings.add(ROAMING_YES);
}
for (int s : sets) {
diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest.java
index f2c42db..caadbf9 100644
--- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest.java
+++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest.java
@@ -16,6 +16,7 @@
package com.android.server.pm;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
import android.annotation.NonNull;
import android.annotation.UserIdInt;
@@ -27,6 +28,7 @@
import android.content.pm.LauncherApps;
import android.content.pm.LauncherApps.ShortcutQuery;
import android.content.pm.PackageManager;
+import android.content.pm.PackageManagerInternal;
import android.content.pm.ShortcutInfo;
import android.content.pm.ShortcutManager;
import android.content.pm.ShortcutServiceInternal;
@@ -191,6 +193,17 @@
boolean injectIsLowRamDevice() {
return mInjectdIsLowRamDevice;
}
+
+ @Override
+ PackageManagerInternal injectPackageManagerInternal() {
+ return mMockPackageManagerInternal;
+ }
+
+ @Override
+ boolean hasShortcutHostPermission(@NonNull String callingPackage, int userId) {
+ // Sort of hack; do a simpler check.
+ return LAUNCHER_1.equals(callingPackage) || LAUNCHER_2.equals(callingPackage);
+ }
}
/** ShortcutManager with injection override methods. */
@@ -258,6 +271,7 @@
private Map<String, Integer> mInjectedPackageUidMap;
private PackageManager mMockPackageManager;
+ private PackageManagerInternal mMockPackageManagerInternal;
private UserManager mMockUserManager;
private static final String CALLING_PACKAGE_1 = "com.android.test.1";
@@ -298,6 +312,7 @@
mClientContext = new ClientContext();
mMockPackageManager = mock(PackageManager.class);
+ mMockPackageManagerInternal = mock(PackageManagerInternal.class);
mMockUserManager = mock(UserManager.class);
// Prepare injection values.
@@ -1889,6 +1904,9 @@
assertEquals(2, mManager.getRemainingCallCount());
});
+ mService.getShortcutsForTest().get(UserHandle.USER_SYSTEM).setLauncherComponent(
+ mService, new ComponentName("pkg1", "class"));
+
// Restore.
initService();
@@ -1918,6 +1936,9 @@
assertEquals("title2-2", getCallerShortcut("s2").getTitle());
});
+ assertEquals("pkg1", mService.getShortcutsForTest().get(UserHandle.USER_SYSTEM)
+ .getLauncherComponent().getPackageName());
+
// Start another user
mService.onStartUserLocked(USER_10);
@@ -1932,6 +1953,7 @@
assertEquals("title10-1-1", getCallerShortcut("s1").getTitle());
assertEquals("title10-1-2", getCallerShortcut("s2").getTitle());
});
+ assertNull(mService.getShortcutsForTest().get(USER_10).getLauncherComponent());
// Try stopping the user
mService.onCleanupUserInner(USER_10);
@@ -1941,4 +1963,8 @@
// TODO Check all other fields
}
+
+ // TODO Detailed test for hasShortcutPermissionInner().
+
+ // TODO Add tests for the command line functions too.
}
diff --git a/services/usage/java/com/android/server/usage/AppIdleHistory.java b/services/usage/java/com/android/server/usage/AppIdleHistory.java
index 3e2b43d..a3313c9 100644
--- a/services/usage/java/com/android/server/usage/AppIdleHistory.java
+++ b/services/usage/java/com/android/server/usage/AppIdleHistory.java
@@ -274,6 +274,11 @@
- (idle ? mScreenOnTimeThreshold : 0) - 1000 /* just a second more */;
}
+ public void clearUsageLocked(String packageName, int userId) {
+ ArrayMap<String, PackageHistory> userHistory = getUserHistoryLocked(userId);
+ userHistory.remove(packageName);
+ }
+
private boolean hasPassedThresholdsLocked(PackageHistory packageHistory, long elapsedRealtime) {
return (packageHistory.lastUsedScreenTime
<= getScreenOnTimeLocked(elapsedRealtime) - mScreenOnTimeThreshold)
diff --git a/services/usage/java/com/android/server/usage/UsageStatsService.java b/services/usage/java/com/android/server/usage/UsageStatsService.java
index 8da1785..beec40f 100644
--- a/services/usage/java/com/android/server/usage/UsageStatsService.java
+++ b/services/usage/java/com/android/server/usage/UsageStatsService.java
@@ -180,6 +180,7 @@
IntentFilter packageFilter = new IntentFilter();
packageFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
packageFilter.addAction(Intent.ACTION_PACKAGE_CHANGED);
+ packageFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
packageFilter.addDataScheme("package");
getContext().registerReceiverAsUser(new PackageReceiver(), UserHandle.ALL, packageFilter,
@@ -266,6 +267,12 @@
|| Intent.ACTION_PACKAGE_CHANGED.equals(action)) {
clearCarrierPrivilegedApps();
}
+ if ((Intent.ACTION_PACKAGE_REMOVED.equals(action) ||
+ Intent.ACTION_PACKAGE_ADDED.equals(action))
+ && !intent.getBooleanExtra(Intent.EXTRA_REPLACING, false)) {
+ clearAppIdleForPackage(intent.getData().getSchemeSpecificPart(),
+ getSendingUserId());
+ }
}
}
@@ -332,6 +339,12 @@
}
}
+ void clearAppIdleForPackage(String packageName, int userId) {
+ synchronized (mLock) {
+ mAppIdleHistory.clearUsageLocked(packageName, userId);
+ }
+ }
+
private void cleanUpRemovedUsersLocked() {
final List<UserInfo> users = mUserManager.getUsers(true);
if (users == null || users.size() == 0) {
diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java
index 7f90731..4f0e036 100644
--- a/telephony/java/com/android/internal/telephony/RILConstants.java
+++ b/telephony/java/com/android/internal/telephony/RILConstants.java
@@ -97,6 +97,12 @@
int NETWORK_REJECT = 53; /* Request is rejected by network */
int OPERATION_NOT_ALLOWED = 54; /* Not allowed the request now */
int EMPTY_RECORD = 55; /* The request record is empty */
+ int INVALID_SMS_FORMAT = 56; /* Invalid sms format */
+ int ENCODING_ERR = 57; /* Message not encoded properly */
+ int INVALID_SMSC_ADDRESS = 58; /* SMSC address specified is invalid */
+ int NO_SUCH_ENTRY = 59; /* No such entry present to perform the request */
+ int NETWORK_NOT_READY = 60; /* Network is not ready to perform the request */
+ int NOT_PROVISIONED = 61; /* Device doesnot have this value provisioned */
// Below is list of OEM specific error codes which can by used by OEMs in case they don't want to
// reveal particular replacement for Generic failure
int OEM_ERROR_1 = 501;
diff --git a/tests/SoundTriggerTests/Android.mk b/tests/SoundTriggerTests/Android.mk
index ac562b9..e67134d 100644
--- a/tests/SoundTriggerTests/Android.mk
+++ b/tests/SoundTriggerTests/Android.mk
@@ -27,6 +27,7 @@
LOCAL_SRC_FILES := src/android/hardware/soundtrigger/SoundTriggerTest.java
endif
+LOCAL_STATIC_JAVA_LIBRARIES := mockito-target
LOCAL_JAVA_LIBRARIES := android.test.runner
LOCAL_PACKAGE_NAME := SoundTriggerTests
diff --git a/tests/SoundTriggerTests/AndroidManifest.xml b/tests/SoundTriggerTests/AndroidManifest.xml
index e8b9dd3..f7454c7 100644
--- a/tests/SoundTriggerTests/AndroidManifest.xml
+++ b/tests/SoundTriggerTests/AndroidManifest.xml
@@ -17,7 +17,8 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="android.hardware.soundtrigger">
<uses-permission android:name="android.permission.MANAGE_SOUND_TRIGGER" />
-
+ <uses-permission android:name="android.permission.INTERNET" />
+
<application>
<uses-library android:name="android.test.runner" />
</application>
diff --git a/tests/SoundTriggerTests/src/android/hardware/soundtrigger/stubhal/GenericSoundModelTest.java b/tests/SoundTriggerTests/src/android/hardware/soundtrigger/stubhal/GenericSoundModelTest.java
index 7acb472..ad02d2b 100644
--- a/tests/SoundTriggerTests/src/android/hardware/soundtrigger/stubhal/GenericSoundModelTest.java
+++ b/tests/SoundTriggerTests/src/android/hardware/soundtrigger/stubhal/GenericSoundModelTest.java
@@ -16,70 +16,180 @@
package android.hardware.soundtrigger;
-import java.util.Random;
-import java.util.UUID;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.timeout;
+import static org.mockito.Mockito.verify;
import android.content.Context;
+import android.hardware.soundtrigger.SoundTrigger.GenericRecognitionEvent;
import android.hardware.soundtrigger.SoundTrigger.GenericSoundModel;
+import android.hardware.soundtrigger.SoundTrigger.KeyphraseRecognitionEvent;
+import android.hardware.soundtrigger.SoundTrigger.RecognitionConfig;
import android.media.soundtrigger.SoundTriggerManager;
import android.os.ParcelUuid;
import android.os.ServiceManager;
import android.test.AndroidTestCase;
+import android.test.suitebuilder.annotation.LargeTest;
import android.test.suitebuilder.annotation.SmallTest;
import com.android.internal.app.ISoundTriggerService;
-import java.util.Arrays;
+import java.io.DataOutputStream;
+import java.net.InetAddress;
+import java.net.Socket;
+import java.util.ArrayList;
import java.util.Random;
import java.util.UUID;
+import org.mockito.MockitoAnnotations;
+
public class GenericSoundModelTest extends AndroidTestCase {
- private Random mRandom = new Random();
+ static final int MSG_DETECTION_ERROR = -1;
+ static final int MSG_DETECTION_RESUME = 0;
+ static final int MSG_DETECTION_PAUSE = 1;
+ static final int MSG_KEYPHRASE_TRIGGER = 2;
+ static final int MSG_GENERIC_TRIGGER = 4;
+
+ private Random random = new Random();
+ private ArrayList<UUID> loadedModelUuids;
+ private ISoundTriggerService soundTriggerService;
+ private SoundTriggerManager soundTriggerManager;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+ MockitoAnnotations.initMocks(this);
+
+ Context context = getContext();
+ soundTriggerService = ISoundTriggerService.Stub.asInterface(
+ ServiceManager.getService(Context.SOUND_TRIGGER_SERVICE));
+ soundTriggerManager = (SoundTriggerManager) context.getSystemService(
+ Context.SOUND_TRIGGER_SERVICE);
+
+ loadedModelUuids = new ArrayList<UUID>();
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ for (UUID modelUuid : loadedModelUuids) {
+ soundTriggerService.deleteSoundModel(new ParcelUuid(modelUuid));
+ }
+ super.tearDown();
+ }
+
+ GenericSoundModel new_sound_model() {
+ // Create sound model
+ byte[] data = new byte[1024];
+ random.nextBytes(data);
+ UUID modelUuid = UUID.randomUUID();
+ UUID mVendorUuid = UUID.randomUUID();
+ return new GenericSoundModel(modelUuid, mVendorUuid, data);
+ }
@SmallTest
public void testUpdateGenericSoundModel() throws Exception {
- Context context = getContext();
- ISoundTriggerService mSoundTriggerService = ISoundTriggerService.Stub.asInterface(
- ServiceManager.getService(Context.SOUND_TRIGGER_SERVICE));
- SoundTriggerManager mSoundTriggerManager = (SoundTriggerManager) context.getSystemService(
- Context.SOUND_TRIGGER_SERVICE);
+ GenericSoundModel model = new_sound_model();
- byte[] data = new byte[1024];
- mRandom.nextBytes(data);
- UUID modelUuid = UUID.randomUUID();
- UUID mVendorUuid = UUID.randomUUID();
- GenericSoundModel model = new GenericSoundModel(modelUuid, mVendorUuid, data);
+ // Update sound model
+ soundTriggerService.updateSoundModel(model);
+ loadedModelUuids.add(model.uuid);
- mSoundTriggerService.updateSoundModel(model);
+ // Confirm it was updated
GenericSoundModel returnedModel =
- mSoundTriggerService.getSoundModel(new ParcelUuid(modelUuid));
-
+ soundTriggerService.getSoundModel(new ParcelUuid(model.uuid));
assertEquals(model, returnedModel);
-
- // Cleanup sound model
- mSoundTriggerService.deleteSoundModel(new ParcelUuid(modelUuid));
}
-
@SmallTest
public void testDeleteGenericSoundModel() throws Exception {
- Context context = getContext();
- ISoundTriggerService mSoundTriggerService = ISoundTriggerService.Stub.asInterface(
- ServiceManager.getService(Context.SOUND_TRIGGER_SERVICE));
- SoundTriggerManager mSoundTriggerManager = (SoundTriggerManager) context.getSystemService(
- Context.SOUND_TRIGGER_SERVICE);
+ GenericSoundModel model = new_sound_model();
- byte[] data = new byte[1024];
- mRandom.nextBytes(data);
- UUID modelUuid = UUID.randomUUID();
- UUID mVendorUuid = UUID.randomUUID();
- GenericSoundModel model = new GenericSoundModel(modelUuid, mVendorUuid, data);
+ // Update sound model
+ soundTriggerService.updateSoundModel(model);
+ loadedModelUuids.add(model.uuid);
- mSoundTriggerService.updateSoundModel(model);
- mSoundTriggerService.deleteSoundModel(new ParcelUuid(modelUuid));
+ // Delete sound model
+ soundTriggerService.deleteSoundModel(new ParcelUuid(model.uuid));
+ loadedModelUuids.remove(model.uuid);
+ // Confirm it was deleted
GenericSoundModel returnedModel =
- mSoundTriggerService.getSoundModel(new ParcelUuid(modelUuid));
+ soundTriggerService.getSoundModel(new ParcelUuid(model.uuid));
assertEquals(null, returnedModel);
}
+
+ @LargeTest
+ public void testStartStopGenericSoundModel() throws Exception {
+ GenericSoundModel model = new_sound_model();
+
+ boolean captureTriggerAudio = true;
+ boolean allowMultipleTriggers = true;
+ RecognitionConfig config = new RecognitionConfig(captureTriggerAudio, allowMultipleTriggers,
+ null, null);
+ TestRecognitionStatusCallback spyCallback = spy(new TestRecognitionStatusCallback());
+
+ // Update and start sound model recognition
+ soundTriggerService.updateSoundModel(model);
+ loadedModelUuids.add(model.uuid);
+ int r = soundTriggerService.startRecognition(new ParcelUuid(model.uuid), spyCallback,
+ config);
+ assertEquals("Could Not Start Recognition with code: " + r,
+ android.hardware.soundtrigger.SoundTrigger.STATUS_OK, r);
+
+ // Stop recognition
+ r = soundTriggerService.stopRecognition(new ParcelUuid(model.uuid), spyCallback);
+ assertEquals("Could Not Stop Recognition with code: " + r,
+ android.hardware.soundtrigger.SoundTrigger.STATUS_OK, r);
+ }
+
+ @LargeTest
+ public void testTriggerGenericSoundModel() throws Exception {
+ GenericSoundModel model = new_sound_model();
+
+ boolean captureTriggerAudio = true;
+ boolean allowMultipleTriggers = true;
+ RecognitionConfig config = new RecognitionConfig(captureTriggerAudio, allowMultipleTriggers,
+ null, null);
+ TestRecognitionStatusCallback spyCallback = spy(new TestRecognitionStatusCallback());
+
+ // Update and start sound model
+ soundTriggerService.updateSoundModel(model);
+ loadedModelUuids.add(model.uuid);
+ soundTriggerService.startRecognition(new ParcelUuid(model.uuid), spyCallback, config);
+
+ // Send trigger to stub HAL
+ Socket socket = new Socket(InetAddress.getLocalHost(), 14035);
+ DataOutputStream out = new DataOutputStream(socket.getOutputStream());
+ out.writeBytes("trig " + model.uuid.toString() + "\r\n");
+ out.flush();
+ socket.close();
+
+ // Verify trigger was received
+ verify(spyCallback, timeout(100)).onGenericSoundTriggerDetected(any());
+ }
+
+
+ public class TestRecognitionStatusCallback extends IRecognitionStatusCallback.Stub {
+ @Override
+ public void onGenericSoundTriggerDetected(GenericRecognitionEvent recognitionEvent) {
+ }
+
+ @Override
+ public void onKeyphraseDetected(KeyphraseRecognitionEvent recognitionEvent) {
+ }
+
+ @Override
+ public void onError(int status) {
+ }
+
+ @Override
+ public void onRecognitionPaused() {
+ }
+
+ @Override
+ public void onRecognitionResumed() {
+ }
+ }
}