| /* |
| * Copyright (C) 2020 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.wallpaper.widget; |
| |
| import android.graphics.Canvas; |
| import android.graphics.ColorFilter; |
| import android.graphics.Paint; |
| import android.graphics.PixelFormat; |
| import android.graphics.PorterDuff; |
| import android.graphics.PorterDuffXfermode; |
| import android.graphics.Rect; |
| import android.graphics.RectF; |
| import android.graphics.drawable.Drawable; |
| import android.view.ViewOverlay; |
| |
| import androidx.annotation.Nullable; |
| |
| /** |
| * Translucent Drawable to be rendered on a {@link ViewOverlay} to allow the window background |
| * to be seen through it. |
| */ |
| public class LiveTileOverlay extends Drawable { |
| |
| public static final LiveTileOverlay INSTANCE = new LiveTileOverlay(); |
| |
| private final Paint mPaint = new Paint(); |
| private final Rect mBoundsRect = new Rect(); |
| |
| private RectF mCurrentRect; |
| private float mCornerRadius; |
| |
| private boolean mIsAttached; |
| |
| private Drawable mForegroundDrawable; |
| |
| private LiveTileOverlay() { |
| mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); |
| } |
| |
| /** |
| * Update the position and radius of the overlay. |
| */ |
| public void update(RectF currentRect, float cornerRadius) { |
| invalidateSelf(); |
| |
| mCurrentRect = currentRect; |
| mCornerRadius = cornerRadius; |
| |
| mCurrentRect.roundOut(mBoundsRect); |
| setBounds(mBoundsRect); |
| invalidateSelf(); |
| } |
| |
| @Override |
| public void draw(Canvas canvas) { |
| if (mCurrentRect != null) { |
| canvas.drawRoundRect(mCurrentRect, mCornerRadius, mCornerRadius, mPaint); |
| if (mForegroundDrawable != null) { |
| mForegroundDrawable.draw(canvas); |
| } |
| } |
| } |
| |
| @Override |
| public void setAlpha(int i) { } |
| |
| @Override |
| public void setColorFilter(ColorFilter colorFilter) { } |
| |
| @Override |
| public int getOpacity() { |
| return PixelFormat.TRANSLUCENT; |
| } |
| |
| /** |
| * Attach this drawable to a given {@link ViewOverlay} |
| * @return true if the drawable was newly attached, false if it was already attached or it |
| * couldn't be attached |
| */ |
| public boolean attach(ViewOverlay overlay) { |
| if (overlay != null && !mIsAttached) { |
| overlay.add(this); |
| mIsAttached = true; |
| return true; |
| } |
| |
| return false; |
| } |
| |
| /** |
| * Detach this drawable from the given overlay |
| * @param overlay |
| */ |
| public void detach(ViewOverlay overlay) { |
| if (overlay != null) { |
| overlay.remove(this); |
| mIsAttached = false; |
| } |
| } |
| |
| /** |
| * Set a drawable to be drawn on top of this one. |
| */ |
| public void setForegroundDrawable(@Nullable Drawable foregroundDrawable) { |
| mForegroundDrawable = foregroundDrawable; |
| invalidateSelf(); |
| } |
| } |