From 70168dde6e1da06042818350fc6e258188d001ae Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Wed, 30 Mar 2016 21:47:16 -0600 Subject: [PATCH 1/2] Make Parcelable classes final, API cleanup. Remove some Context methods that leaked through. Add lint rule to recommend using List instead of Parcelable[]. Bug: 27932224, 27930145, 27932911 Change-Id: Ia302de46cdb0c5101fa175a09316df91aeefcf0d --- api/current.txt | 8 ++------ api/system-current.txt | 8 ++------ api/test-current.txt | 8 ++------ core/java/android/content/ContextWrapper.java | 2 ++ core/java/android/content/pm/ShortcutInfo.java | 2 +- core/java/android/os/health/TimerStat.java | 2 +- test-runner/src/android/test/mock/MockContext.java | 2 ++ tools/apilint/apilint.py | 11 +++++++++++ 8 files changed, 23 insertions(+), 20 deletions(-) diff --git a/api/current.txt b/api/current.txt index c4160443380f0..97ac8ea2a3f59 100644 --- a/api/current.txt +++ b/api/current.txt @@ -8222,8 +8222,6 @@ package android.content { method public java.lang.String getPackageResourcePath(); method public android.content.res.Resources getResources(); method public android.content.SharedPreferences getSharedPreferences(java.lang.String, int); - method public android.content.SharedPreferences getSharedPreferences(java.io.File, int); - method public java.io.File getSharedPreferencesPath(java.lang.String); method public java.lang.Object getSystemService(java.lang.String); method public java.lang.String getSystemServiceName(java.lang.Class); method public android.content.res.Resources.Theme getTheme(); @@ -9991,7 +9989,7 @@ package android.content.pm { field public java.lang.String permission; } - public class ShortcutInfo implements android.os.Parcelable { + public final class ShortcutInfo implements android.os.Parcelable { method public int describeContents(); method public android.content.ComponentName getActivityComponent(); method public android.os.PersistableBundle getExtras(); @@ -29481,7 +29479,7 @@ package android.os.health { method public android.os.health.HealthStats[] takeUidSnapshots(int[]); } - public class TimerStat implements android.os.Parcelable { + public final class TimerStat implements android.os.Parcelable { ctor public TimerStat(); ctor public TimerStat(int, long); ctor public TimerStat(android.os.Parcel); @@ -37954,8 +37952,6 @@ package android.test.mock { method public java.lang.String getPackageResourcePath(); method public android.content.res.Resources getResources(); method public android.content.SharedPreferences getSharedPreferences(java.lang.String, int); - method public android.content.SharedPreferences getSharedPreferences(java.io.File, int); - method public java.io.File getSharedPreferencesPath(java.lang.String); method public java.lang.Object getSystemService(java.lang.String); method public java.lang.String getSystemServiceName(java.lang.Class); method public android.content.res.Resources.Theme getTheme(); diff --git a/api/system-current.txt b/api/system-current.txt index e372d98a92a17..1b3761969248f 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -8532,8 +8532,6 @@ package android.content { method public java.lang.String getPackageResourcePath(); method public android.content.res.Resources getResources(); method public android.content.SharedPreferences getSharedPreferences(java.lang.String, int); - method public android.content.SharedPreferences getSharedPreferences(java.io.File, int); - method public java.io.File getSharedPreferencesPath(java.lang.String); method public java.lang.Object getSystemService(java.lang.String); method public java.lang.String getSystemServiceName(java.lang.Class); method public android.content.res.Resources.Theme getTheme(); @@ -10389,7 +10387,7 @@ package android.content.pm { field public java.lang.String permission; } - public class ShortcutInfo implements android.os.Parcelable { + public final class ShortcutInfo implements android.os.Parcelable { method public int describeContents(); method public android.content.ComponentName getActivityComponent(); method public android.os.PersistableBundle getExtras(); @@ -31794,7 +31792,7 @@ package android.os.health { method public android.os.health.HealthStats[] takeUidSnapshots(int[]); } - public class TimerStat implements android.os.Parcelable { + public final class TimerStat implements android.os.Parcelable { ctor public TimerStat(); ctor public TimerStat(int, long); ctor public TimerStat(android.os.Parcel); @@ -40670,8 +40668,6 @@ package android.test.mock { method public java.lang.String getPackageResourcePath(); method public android.content.res.Resources getResources(); method public android.content.SharedPreferences getSharedPreferences(java.lang.String, int); - method public android.content.SharedPreferences getSharedPreferences(java.io.File, int); - method public java.io.File getSharedPreferencesPath(java.lang.String); method public java.lang.Object getSystemService(java.lang.String); method public java.lang.String getSystemServiceName(java.lang.Class); method public android.content.res.Resources.Theme getTheme(); diff --git a/api/test-current.txt b/api/test-current.txt index e4153f126cb88..e385aa02d8c5e 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -8228,8 +8228,6 @@ package android.content { method public java.lang.String getPackageResourcePath(); method public android.content.res.Resources getResources(); method public android.content.SharedPreferences getSharedPreferences(java.lang.String, int); - method public android.content.SharedPreferences getSharedPreferences(java.io.File, int); - method public java.io.File getSharedPreferencesPath(java.lang.String); method public java.lang.Object getSystemService(java.lang.String); method public java.lang.String getSystemServiceName(java.lang.Class); method public android.content.res.Resources.Theme getTheme(); @@ -10001,7 +9999,7 @@ package android.content.pm { field public java.lang.String permission; } - public class ShortcutInfo implements android.os.Parcelable { + public final class ShortcutInfo implements android.os.Parcelable { method public int describeContents(); method public android.content.ComponentName getActivityComponent(); method public android.os.PersistableBundle getExtras(); @@ -29547,7 +29545,7 @@ package android.os.health { method public android.os.health.HealthStats[] takeUidSnapshots(int[]); } - public class TimerStat implements android.os.Parcelable { + public final class TimerStat implements android.os.Parcelable { ctor public TimerStat(); ctor public TimerStat(int, long); ctor public TimerStat(android.os.Parcel); @@ -38026,8 +38024,6 @@ package android.test.mock { method public java.lang.String getPackageResourcePath(); method public android.content.res.Resources getResources(); method public android.content.SharedPreferences getSharedPreferences(java.lang.String, int); - method public android.content.SharedPreferences getSharedPreferences(java.io.File, int); - method public java.io.File getSharedPreferencesPath(java.lang.String); method public java.lang.Object getSystemService(java.lang.String); method public java.lang.String getSystemServiceName(java.lang.Class); method public android.content.res.Resources.Theme getTheme(); diff --git a/core/java/android/content/ContextWrapper.java b/core/java/android/content/ContextWrapper.java index b2df207f8eb10..087ac47818033 100644 --- a/core/java/android/content/ContextWrapper.java +++ b/core/java/android/content/ContextWrapper.java @@ -164,6 +164,7 @@ public class ContextWrapper extends Context { return mBase.getSharedPreferences(name, mode); } + /** @removed */ @Override public SharedPreferences getSharedPreferences(File file, int mode) { return mBase.getSharedPreferences(file, mode); @@ -201,6 +202,7 @@ public class ContextWrapper extends Context { return mBase.getFileStreamPath(name); } + /** @removed */ @Override public File getSharedPreferencesPath(String name) { return mBase.getSharedPreferencesPath(name); diff --git a/core/java/android/content/pm/ShortcutInfo.java b/core/java/android/content/pm/ShortcutInfo.java index ae75e3f9a1565..7cb3af9b474d8 100644 --- a/core/java/android/content/pm/ShortcutInfo.java +++ b/core/java/android/content/pm/ShortcutInfo.java @@ -47,7 +47,7 @@ import java.lang.annotation.RetentionPolicy; * * We will disallow byte[] icons, because they can easily go over binder size limit. */ -public class ShortcutInfo implements Parcelable { +public final class ShortcutInfo implements Parcelable { /* @hide */ public static final int FLAG_DYNAMIC = 1 << 0; diff --git a/core/java/android/os/health/TimerStat.java b/core/java/android/os/health/TimerStat.java index fc51b60ff5318..b9d8874e89385 100644 --- a/core/java/android/os/health/TimerStat.java +++ b/core/java/android/os/health/TimerStat.java @@ -27,7 +27,7 @@ import android.os.Parcelable; * object to be constructed, even internally, but the getTimers method on * {@link android.os.health.HealthStats} does require TimerStat objects. */ -public class TimerStat implements Parcelable { +public final class TimerStat implements Parcelable { private int mCount; private long mTime; diff --git a/test-runner/src/android/test/mock/MockContext.java b/test-runner/src/android/test/mock/MockContext.java index b739eadc8862b..c7cbf977d7d71 100644 --- a/test-runner/src/android/test/mock/MockContext.java +++ b/test-runner/src/android/test/mock/MockContext.java @@ -145,6 +145,7 @@ public class MockContext extends Context { throw new UnsupportedOperationException(); } + /** @removed */ @Override public SharedPreferences getSharedPreferences(File file, int mode) { throw new UnsupportedOperationException(); @@ -180,6 +181,7 @@ public class MockContext extends Context { throw new UnsupportedOperationException(); } + /** @removed */ @Override public File getSharedPreferencesPath(String name) { throw new UnsupportedOperationException(); diff --git a/tools/apilint/apilint.py b/tools/apilint/apilint.py index a8a8c5c7236a3..ca2d2e75ee89a 100644 --- a/tools/apilint/apilint.py +++ b/tools/apilint/apilint.py @@ -980,6 +980,16 @@ def verify_files(clazz): warn(clazz, m, "M10", "Methods accepting File should also accept FileDescriptor or streams") +def verify_manager_list(clazz): + """Verifies that managers return List instead of arrays.""" + + if not clazz.name.endswith("Manager"): return + + for m in clazz.methods: + if m.typ.startswith("android.") and m.typ.endswith("[]"): + warn(clazz, m, None, "Methods should return List instead of Parcelable[] to support ParceledListSlice under the hood") + + def examine_clazz(clazz): """Find all style issues in the given class.""" if clazz.pkg.name.startswith("java"): return @@ -1025,6 +1035,7 @@ def examine_clazz(clazz): verify_listener_last(clazz) verify_resource_names(clazz) verify_files(clazz) + verify_manager_list(clazz) def examine_stream(stream): From 0436b1d5a21a2f42d77992a4429f01601676d3e8 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Wed, 30 Mar 2016 23:41:10 -0600 Subject: [PATCH 2/2] Make preferred activities direct-boot aware. When matching a list of ResolveInfo against the preferred activity list, we shouldn't mutate the preferred set based on activities that might be hidden due to the user being locked. Bug: 25578136 Change-Id: Ifecff4f11c7fddef3eed04325d396f7c43d6703a --- .../java/com/android/server/pm/PackageManagerService.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 442643a976e24..d7d38d5c20e05 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -4944,8 +4944,10 @@ public class PackageManagerService extends IPackageManager.Stub { if (DEBUG_PREFERRED || debug) Slog.v(TAG, "Skipping mAlways=false entry"); continue; } - final ActivityInfo ai = getActivityInfo(pa.mPref.mComponent, - flags | MATCH_DISABLED_COMPONENTS, userId); + final ActivityInfo ai = getActivityInfo( + pa.mPref.mComponent, flags | MATCH_DISABLED_COMPONENTS + | MATCH_DIRECT_BOOT_AWARE | MATCH_DIRECT_BOOT_UNAWARE, + userId); if (DEBUG_PREFERRED || debug) { Slog.v(TAG, "Found preferred activity:"); if (ai != null) {