diff --git a/core/java/com/android/internal/widget/DisableImageView.java b/core/java/com/android/internal/widget/DisableImageView.java new file mode 100644 index 0000000000000..0d9bf7168ebfd --- /dev/null +++ b/core/java/com/android/internal/widget/DisableImageView.java @@ -0,0 +1,68 @@ +/* + * Copyright (C) 2021 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.internal.widget; + +import android.annotation.Nullable; +import android.content.Context; +import android.graphics.ColorMatrix; +import android.graphics.ColorMatrixColorFilter; +import android.util.AttributeSet; +import android.widget.ImageView; +import android.widget.RemoteViews; + +/** + * ImageView which applies a saturation image filter, used by AppWidgets to represent disabled icon + */ +@RemoteViews.RemoteView +public class DisableImageView extends ImageView { + + public DisableImageView(Context context) { + this(context, null, 0, 0); + } + + public DisableImageView(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0, 0); + } + + public DisableImageView(Context context, @Nullable AttributeSet attrs, + int defStyleAttr) { + this(context, attrs, defStyleAttr, 0); + } + + public DisableImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, + int defStyleRes) { + super(context, attrs, defStyleAttr, defStyleRes); + + // Apply the disabled filter + ColorMatrix brightnessMatrix = new ColorMatrix(); + float brightnessF = 0.5f; + int brightnessI = (int) (255 * brightnessF); + // Brightness: C-new = C-old*(1-amount) + amount + float scale = 1f - brightnessF; + float[] mat = brightnessMatrix.getArray(); + mat[0] = scale; + mat[6] = scale; + mat[12] = scale; + mat[4] = brightnessI; + mat[9] = brightnessI; + mat[14] = brightnessI; + + ColorMatrix filterMatrix = new ColorMatrix(); + filterMatrix.setSaturation(0); + filterMatrix.preConcat(brightnessMatrix); + setColorFilter(new ColorMatrixColorFilter(filterMatrix)); + } +} diff --git a/core/res/res/layout/work_widget_mask_view.xml b/core/res/res/layout/work_widget_mask_view.xml index 39e1bbb467b42..9e1692f23a1e9 100644 --- a/core/res/res/layout/work_widget_mask_view.xml +++ b/core/res/res/layout/work_widget_mask_view.xml @@ -22,7 +22,8 @@ Copyright (C) 2015 The Android Open Source Project android:importantForAccessibility="noHideDescendants" android:clickable="true"> - 0 && sourceHeight > 0) { - // There are intrinsic sizes. - if (width < sourceWidth || height < sourceHeight) { - // It's too big, scale it down. - final float ratio = (float) sourceWidth / sourceHeight; - if (sourceWidth > sourceHeight) { - height = (int) (width / ratio); - } else if (sourceHeight > sourceWidth) { - width = (int) (height * ratio); - } - } else if (sourceWidth < width && sourceHeight < height) { - // It's small, use the size they gave us. - width = sourceWidth; - height = sourceHeight; - } - } - - // no intrinsic size --> use default size - int textureWidth = mIconTextureWidth; - int textureHeight = mIconTextureHeight; - - final Bitmap bitmap = Bitmap.createBitmap(textureWidth, textureHeight, - Bitmap.Config.ARGB_8888); - final Canvas canvas = mCanvas; - canvas.setBitmap(bitmap); - - final int left = (textureWidth-width) / 2; - final int top = (textureHeight-height) / 2; - - mOldBounds.set(icon.getBounds()); - icon.setBounds(left, top, left+width, top+height); - icon.draw(canvas); - icon.setBounds(mOldBounds); - - return bitmap; - } - - public ColorFilter getDisabledColorFilter() { - if (mDisabledColorFilter != null) { - return mDisabledColorFilter; - } - ColorMatrix brightnessMatrix = new ColorMatrix(); - float brightnessF = 0.5f; - int brightnessI = (int) (255 * brightnessF); - // Brightness: C-new = C-old*(1-amount) + amount - float scale = 1f - brightnessF; - float[] mat = brightnessMatrix.getArray(); - mat[0] = scale; - mat[6] = scale; - mat[12] = scale; - mat[4] = brightnessI; - mat[9] = brightnessI; - mat[14] = brightnessI; - - ColorMatrix filterMatrix = new ColorMatrix(); - filterMatrix.setSaturation(0); - filterMatrix.preConcat(brightnessMatrix); - - mDisabledColorFilter = new ColorMatrixColorFilter(filterMatrix); - return mDisabledColorFilter; - } -} diff --git a/services/core/java/com/android/server/wm/AlertWindowNotification.java b/services/core/java/com/android/server/wm/AlertWindowNotification.java index fde0369502452..c589feae56ca2 100644 --- a/services/core/java/com/android/server/wm/AlertWindowNotification.java +++ b/services/core/java/com/android/server/wm/AlertWindowNotification.java @@ -39,7 +39,7 @@ import android.net.Uri; import android.os.Bundle; import com.android.internal.R; -import com.android.server.policy.IconUtilities; +import com.android.internal.util.ImageUtils; /** Displays an ongoing notification for a process displaying an alert window */ class AlertWindowNotification { @@ -54,7 +54,6 @@ class AlertWindowNotification { private final NotificationManager mNotificationManager; private final String mPackageName; private boolean mPosted; - private IconUtilities mIconUtilities; AlertWindowNotification(WindowManagerService service, String packageName) { mService = service; @@ -63,7 +62,6 @@ class AlertWindowNotification { (NotificationManager) mService.mContext.getSystemService(NOTIFICATION_SERVICE); mNotificationTag = CHANNEL_PREFIX + mPackageName; mRequestCode = sNextRequestCode++; - mIconUtilities = new IconUtilities(mService.mContext); } void post() { @@ -126,8 +124,9 @@ class AlertWindowNotification { if (aInfo != null) { final Drawable drawable = pm.getApplicationIcon(aInfo); - if (drawable != null) { - final Bitmap bitmap = mIconUtilities.createIconBitmap(drawable); + int size = context.getResources().getDimensionPixelSize(android.R.dimen.app_icon_size); + final Bitmap bitmap = ImageUtils.buildScaledBitmap(drawable, size, size); + if (bitmap != null) { builder.setLargeIcon(bitmap); } }