summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSunny Goyal <sunnygoyal@google.com>2020-01-17 10:05:50 -0800
committerSunny Goyal <sunnygoyal@google.com>2020-01-21 16:17:49 -0800
commit77a2416924c1a58945bd29c272efa336ee1274f7 (patch)
treefb15934ca567523b6e38ce4fcd973fa70de5b8b0
parentd26218b6d7ffb01b177642c1463ef77cd588f4ef (diff)
Adding API to check if an icon returned by PackageManager
is a fallback icon Bug: 141588119 Test: atest PackageManagerTest Change-Id: I9ae5a74dd0b0c0c49a078d46914986ecb0d27a94
-rw-r--r--api/current.txt1
-rw-r--r--core/java/android/content/pm/PackageManager.java16
-rw-r--r--graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java15
3 files changed, 32 insertions, 0 deletions
diff --git a/api/current.txt b/api/current.txt
index d5ece2e7301c..6d0c51030175 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -11842,6 +11842,7 @@ package android.content.pm {
method public boolean hasSigningCertificate(int, @NonNull byte[], int);
method public abstract boolean hasSystemFeature(@NonNull String);
method public abstract boolean hasSystemFeature(@NonNull String, int);
+ method public boolean isDefaultApplicationIcon(@NonNull android.graphics.drawable.Drawable);
method public boolean isDeviceUpgrading();
method public abstract boolean isInstantApp();
method public abstract boolean isInstantApp(@NonNull String);
diff --git a/core/java/android/content/pm/PackageManager.java b/core/java/android/content/pm/PackageManager.java
index 1f502a101290..05e42bf0b2c0 100644
--- a/core/java/android/content/pm/PackageManager.java
+++ b/core/java/android/content/pm/PackageManager.java
@@ -50,6 +50,7 @@ import android.content.pm.dex.ArtManager;
import android.content.res.Resources;
import android.content.res.XmlResourceParser;
import android.graphics.Rect;
+import android.graphics.drawable.AdaptiveIconDrawable;
import android.graphics.drawable.Drawable;
import android.net.wifi.WifiManager;
import android.os.Build;
@@ -7619,4 +7620,19 @@ public abstract class PackageManager {
"sendDeviceCustomizationReadyBroadcast not implemented in subclass");
}
+ /**
+ * Returns if the provided drawable represents the default activity icon provided by the system.
+ *
+ * PackageManager provides a default icon for any package/activity if the app itself does not
+ * define one or if the system encountered any error when loading the icon.
+ *
+ * @return true if the drawable represents the default activity icon, false otherwise
+ * @see #getDefaultActivityIcon()
+ */
+ public boolean isDefaultApplicationIcon(@NonNull Drawable drawable) {
+ int resId = drawable instanceof AdaptiveIconDrawable
+ ? ((AdaptiveIconDrawable) drawable).getSourceDrawableResId() : Resources.ID_NULL;
+ return resId == com.android.internal.R.drawable.sym_def_app_icon
+ || resId == com.android.internal.R.drawable.sym_app_on_sd_unavailable_icon;
+ }
}
diff --git a/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java b/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java
index fab96a1e9fbd..928e607abbbe 100644
--- a/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java
+++ b/graphics/java/android/graphics/drawable/AdaptiveIconDrawable.java
@@ -16,6 +16,7 @@
package android.graphics.drawable;
+import android.annotation.DrawableRes;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.TestApi;
@@ -223,6 +224,7 @@ public class AdaptiveIconDrawable extends Drawable implements Drawable.Callback
final int deviceDensity = Drawable.resolveDensity(r, 0);
state.setDensity(deviceDensity);
state.mSrcDensityOverride = mSrcDensityOverride;
+ state.mSourceDrawableId = Resources.getAttributeSetSourceResId(attrs);
final ChildDrawable[] array = state.mChildren;
for (int i = 0; i < state.mChildren.length; i++) {
@@ -446,6 +448,17 @@ public class AdaptiveIconDrawable extends Drawable implements Drawable.Callback
}
/**
+ * If the drawable was inflated from XML, this returns the resource ID for the drawable
+ *
+ * @hide
+ */
+ @DrawableRes
+ public int getSourceDrawableResId() {
+ final LayerState state = mLayerState;
+ return state == null ? Resources.ID_NULL : state.mSourceDrawableId;
+ }
+
+ /**
* Inflates child layers using the specified parser.
*/
private void inflateLayers(@NonNull Resources r, @NonNull XmlPullParser parser,
@@ -944,6 +957,8 @@ public class AdaptiveIconDrawable extends Drawable implements Drawable.Callback
@Config int mChangingConfigurations;
@Config int mChildrenChangingConfigurations;
+ @DrawableRes int mSourceDrawableId = Resources.ID_NULL;
+
private boolean mCheckedOpacity;
private int mOpacity;