Merge "DisplayCutout: Properly letterbox bottom-only cutouts" into pi-dev
diff --git a/api/current.txt b/api/current.txt
index e0c45e0..414491c 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -13612,6 +13612,7 @@
method public void close();
method public static android.graphics.ImageDecoder.Source createSource(android.content.res.Resources, int);
method public static android.graphics.ImageDecoder.Source createSource(android.content.ContentResolver, android.net.Uri);
+ method public static android.graphics.ImageDecoder.Source createSource(android.content.res.AssetManager, java.lang.String);
method public static android.graphics.ImageDecoder.Source createSource(java.nio.ByteBuffer);
method public static android.graphics.ImageDecoder.Source createSource(java.io.File);
method public static android.graphics.Bitmap decodeBitmap(android.graphics.ImageDecoder.Source, android.graphics.ImageDecoder.OnHeaderDecodedListener) throws java.io.IOException;
diff --git a/api/system-current.txt b/api/system-current.txt
index a6b70fd..0e33c17 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -276,8 +276,8 @@
field public static final java.lang.String OPSTR_AUDIO_NOTIFICATION_VOLUME = "android:audio_notification_volume";
field public static final java.lang.String OPSTR_AUDIO_RING_VOLUME = "android:audio_ring_volume";
field public static final java.lang.String OPSTR_AUDIO_VOICE_VOLUME = "android:audio_voice_volume";
- field public static final java.lang.String OPSTR_BIND_ACCESSIBILITY_SERVICE = "bind_accessibility_service";
- field public static final java.lang.String OPSTR_CHANGE_WIFI_STATE = "change_wifi_state";
+ field public static final java.lang.String OPSTR_BIND_ACCESSIBILITY_SERVICE = "android:bind_accessibility_service";
+ field public static final java.lang.String OPSTR_CHANGE_WIFI_STATE = "android:change_wifi_state";
field public static final java.lang.String OPSTR_GET_ACCOUNTS = "android:get_accounts";
field public static final java.lang.String OPSTR_GPS = "android:gps";
field public static final java.lang.String OPSTR_INSTANT_APP_START_FOREGROUND = "android:instant_app_start_foreground";
@@ -289,7 +289,7 @@
field public static final java.lang.String OPSTR_READ_CLIPBOARD = "android:read_clipboard";
field public static final java.lang.String OPSTR_READ_ICC_SMS = "android:read_icc_sms";
field public static final java.lang.String OPSTR_RECEIVE_EMERGENCY_BROADCAST = "android:receive_emergency_broadcast";
- field public static final java.lang.String OPSTR_REQUEST_DELETE_PACKAGES = "request_delete_packages";
+ field public static final java.lang.String OPSTR_REQUEST_DELETE_PACKAGES = "android:request_delete_packages";
field public static final java.lang.String OPSTR_REQUEST_INSTALL_PACKAGES = "android:request_install_packages";
field public static final java.lang.String OPSTR_RUN_ANY_IN_BACKGROUND = "android:run_any_in_background";
field public static final java.lang.String OPSTR_RUN_IN_BACKGROUND = "android:run_in_background";
diff --git a/api/test-current.txt b/api/test-current.txt
index e4caf9e..e8d27a1 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -74,8 +74,8 @@
field public static final java.lang.String OPSTR_AUDIO_NOTIFICATION_VOLUME = "android:audio_notification_volume";
field public static final java.lang.String OPSTR_AUDIO_RING_VOLUME = "android:audio_ring_volume";
field public static final java.lang.String OPSTR_AUDIO_VOICE_VOLUME = "android:audio_voice_volume";
- field public static final java.lang.String OPSTR_BIND_ACCESSIBILITY_SERVICE = "bind_accessibility_service";
- field public static final java.lang.String OPSTR_CHANGE_WIFI_STATE = "change_wifi_state";
+ field public static final java.lang.String OPSTR_BIND_ACCESSIBILITY_SERVICE = "android:bind_accessibility_service";
+ field public static final java.lang.String OPSTR_CHANGE_WIFI_STATE = "android:change_wifi_state";
field public static final java.lang.String OPSTR_GET_ACCOUNTS = "android:get_accounts";
field public static final java.lang.String OPSTR_GPS = "android:gps";
field public static final java.lang.String OPSTR_INSTANT_APP_START_FOREGROUND = "android:instant_app_start_foreground";
@@ -87,7 +87,7 @@
field public static final java.lang.String OPSTR_READ_CLIPBOARD = "android:read_clipboard";
field public static final java.lang.String OPSTR_READ_ICC_SMS = "android:read_icc_sms";
field public static final java.lang.String OPSTR_RECEIVE_EMERGENCY_BROADCAST = "android:receive_emergency_broadcast";
- field public static final java.lang.String OPSTR_REQUEST_DELETE_PACKAGES = "request_delete_packages";
+ field public static final java.lang.String OPSTR_REQUEST_DELETE_PACKAGES = "android:request_delete_packages";
field public static final java.lang.String OPSTR_REQUEST_INSTALL_PACKAGES = "android:request_install_packages";
field public static final java.lang.String OPSTR_RUN_ANY_IN_BACKGROUND = "android:run_any_in_background";
field public static final java.lang.String OPSTR_RUN_IN_BACKGROUND = "android:run_in_background";
diff --git a/core/java/android/app/AppOpsManager.java b/core/java/android/app/AppOpsManager.java
index 14edd31..4690211 100644
--- a/core/java/android/app/AppOpsManager.java
+++ b/core/java/android/app/AppOpsManager.java
@@ -499,13 +499,14 @@
public static final String OPSTR_RUN_ANY_IN_BACKGROUND = "android:run_any_in_background";
/** @hide */
@SystemApi @TestApi
- public static final String OPSTR_CHANGE_WIFI_STATE = "change_wifi_state";
+ public static final String OPSTR_CHANGE_WIFI_STATE = "android:change_wifi_state";
/** @hide */
@SystemApi @TestApi
- public static final String OPSTR_REQUEST_DELETE_PACKAGES = "request_delete_packages";
+ public static final String OPSTR_REQUEST_DELETE_PACKAGES = "android:request_delete_packages";
/** @hide */
@SystemApi @TestApi
- public static final String OPSTR_BIND_ACCESSIBILITY_SERVICE = "bind_accessibility_service";
+ public static final String OPSTR_BIND_ACCESSIBILITY_SERVICE =
+ "android:bind_accessibility_service";
// Warning: If an permission is added here it also has to be added to
// com.android.packageinstaller.permission.utils.EventLogger
diff --git a/graphics/java/android/graphics/ImageDecoder.java b/graphics/java/android/graphics/ImageDecoder.java
index 8196d66..5e81c37 100644
--- a/graphics/java/android/graphics/ImageDecoder.java
+++ b/graphics/java/android/graphics/ImageDecoder.java
@@ -26,6 +26,7 @@
import android.annotation.Nullable;
import android.content.ContentResolver;
import android.content.res.AssetFileDescriptor;
+import android.content.res.AssetManager;
import android.content.res.AssetManager.AssetInputStream;
import android.content.res.Resources;
import android.graphics.drawable.AnimatedImageDrawable;
@@ -294,25 +295,13 @@
@Override
public ImageDecoder createImageDecoder() throws IOException {
- ImageDecoder decoder = null;
synchronized (this) {
if (mAssetInputStream == null) {
throw new IOException("Cannot reuse AssetInputStreamSource");
}
AssetInputStream ais = mAssetInputStream;
mAssetInputStream = null;
- try {
- long asset = ais.getNativeAsset();
- decoder = nCreate(asset);
- } finally {
- if (decoder == null) {
- IoUtils.closeQuietly(ais);
- } else {
- decoder.mInputStream = ais;
- decoder.mOwnsInputStream = true;
- }
- }
- return decoder;
+ return createFromAsset(ais);
}
}
}
@@ -336,31 +325,53 @@
@Override
public ImageDecoder createImageDecoder() throws IOException {
- // This is just used in order to access the underlying Asset and
- // keep it alive. FIXME: Can we skip creating this object?
- InputStream is = null;
- ImageDecoder decoder = null;
TypedValue value = new TypedValue();
- try {
- is = mResources.openRawResource(mResId, value);
+ // This is just used in order to access the underlying Asset and
+ // keep it alive.
+ InputStream is = mResources.openRawResource(mResId, value);
- if (value.density == TypedValue.DENSITY_DEFAULT) {
- mResDensity = DisplayMetrics.DENSITY_DEFAULT;
- } else if (value.density != TypedValue.DENSITY_NONE) {
- mResDensity = value.density;
- }
-
- long asset = ((AssetInputStream) is).getNativeAsset();
- decoder = nCreate(asset);
- } finally {
- if (decoder == null) {
- IoUtils.closeQuietly(is);
- } else {
- decoder.mInputStream = is;
- decoder.mOwnsInputStream = true;
- }
+ if (value.density == TypedValue.DENSITY_DEFAULT) {
+ mResDensity = DisplayMetrics.DENSITY_DEFAULT;
+ } else if (value.density != TypedValue.DENSITY_NONE) {
+ mResDensity = value.density;
}
- return decoder;
+
+ return createFromAsset((AssetInputStream) is);
+ }
+ }
+
+ /**
+ * ImageDecoder will own the AssetInputStream.
+ */
+ private static ImageDecoder createFromAsset(AssetInputStream ais) throws IOException {
+ ImageDecoder decoder = null;
+ try {
+ long asset = ais.getNativeAsset();
+ decoder = nCreate(asset);
+ } finally {
+ if (decoder == null) {
+ IoUtils.closeQuietly(ais);
+ } else {
+ decoder.mInputStream = ais;
+ decoder.mOwnsInputStream = true;
+ }
+ }
+ return decoder;
+ }
+
+ private static class AssetSource extends Source {
+ AssetSource(@NonNull AssetManager assets, @NonNull String fileName) {
+ mAssets = assets;
+ mFileName = fileName;
+ }
+
+ private final AssetManager mAssets;
+ private final String mFileName;
+
+ @Override
+ public ImageDecoder createImageDecoder() throws IOException {
+ InputStream is = mAssets.open(mFileName);
+ return createFromAsset((AssetInputStream) is);
}
}
@@ -581,6 +592,14 @@
}
/**
+ * Create a new {@link Source} from a file in the "assets" directory.
+ */
+ @NonNull
+ public static Source createSource(@NonNull AssetManager assets, @NonNull String fileName) {
+ return new AssetSource(assets, fileName);
+ }
+
+ /**
* Create a new {@link Source} from a byte array.
*
* @param data byte array of compressed image data.
diff --git a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java
index 8d99303..ae99786 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/external/CustomTile.java
@@ -348,7 +348,7 @@
return ComponentName.unflattenFromString(action);
}
- public static QSTile create(QSTileHost host, String spec) {
+ public static CustomTile create(QSTileHost host, String spec) {
if (spec == null || !spec.startsWith(PREFIX) || !spec.endsWith(")")) {
throw new IllegalArgumentException("Bad custom tile spec: " + spec);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java
index 77c3bfa..8d488903 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSFactoryImpl.java
@@ -52,6 +52,14 @@
}
public QSTile createTile(String tileSpec) {
+ QSTileImpl tile = createTileInternal(tileSpec);
+ if (tile != null) {
+ tile.handleStale(); // Tile was just created, must be stale.
+ }
+ return tile;
+ }
+
+ private QSTileImpl createTileInternal(String tileSpec) {
if (tileSpec.equals("wifi")) return new WifiTile(mHost);
else if (tileSpec.equals("bt")) return new BluetoothTile(mHost);
else if (tileSpec.equals("cell")) return new CellularTile(mHost);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
index 24ddafc..40b8d78 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tileimpl/QSTileImpl.java
@@ -103,7 +103,6 @@
protected QSTileImpl(QSHost host) {
mHost = host;
mContext = host.getContext();
- handleStale(); // Tile was just created, must be stale.
}
/**
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
index 3b79db7..06183e9 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/BluetoothTile.java
@@ -78,7 +78,6 @@
@Override
public void handleSetListening(boolean listening) {
- if (mController == null) return;
if (listening) {
mController.addCallback(mCallback);
} else {
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
index 678aa71..ed78048 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/CastTile.java
@@ -83,7 +83,6 @@
@Override
public void handleSetListening(boolean listening) {
- if (mController == null) return;
if (DEBUG) Log.d(TAG, "handleSetListening " + listening);
if (listening) {
mController.addCallback(mCallback);
@@ -98,7 +97,6 @@
@Override
protected void handleUserSwitch(int newUserId) {
super.handleUserSwitch(newUserId);
- if (mController == null) return;
mController.setCurrentUserId(newUserId);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
index 8427e32..7dcf5c0 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/DndTile.java
@@ -259,7 +259,6 @@
public void handleSetListening(boolean listening) {
if (mListening == listening) return;
mListening = listening;
- if (mController == null) return;
if (mListening) {
mController.addCallback(mZenCallback);
Prefs.registerListener(mContext, mPrefListener);
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/IntentTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/IntentTile.java
index 4f4004c..3c565ef 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/IntentTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/IntentTile.java
@@ -64,7 +64,7 @@
mContext.unregisterReceiver(mReceiver);
}
- public static QSTile create(QSHost host, String spec) {
+ public static IntentTile create(QSHost host, String spec) {
if (spec == null || !spec.startsWith(PREFIX) || !spec.endsWith(")")) {
throw new IllegalArgumentException("Bad intent tile spec: " + spec);
}
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java
index 60422ee..28b047b 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/RotationLockTile.java
@@ -51,7 +51,6 @@
}
public void handleSetListening(boolean listening) {
- if (mController == null) return;
if (listening) {
mController.addCallback(mCallback);
} else {
@@ -66,7 +65,6 @@
@Override
protected void handleClick() {
- if (mController == null) return;
final boolean newState = !mState.value;
mController.setRotationLocked(!newState);
refreshState(newState);
@@ -79,7 +77,6 @@
@Override
protected void handleUpdateState(BooleanState state, Object arg) {
- if (mController == null) return;
final boolean rotationLocked = mController.isRotationLocked();
state.value = !rotationLocked;
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
index 3ad3940..28fdc11 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/WifiTile.java
@@ -76,7 +76,6 @@
@Override
public void handleSetListening(boolean listening) {
- if (mController == null) return;
if (listening) {
mController.addCallback(mSignalCallback);
} else {