| /* |
| * Copyright (C) 2017 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.module; |
| |
| import static android.app.WallpaperManager.FLAG_LOCK; |
| import static android.app.WallpaperManager.FLAG_SYSTEM; |
| import static android.app.WallpaperManager.SetWallpaperFlags; |
| |
| import android.graphics.Bitmap; |
| import android.graphics.Point; |
| import android.graphics.Rect; |
| |
| import androidx.annotation.IntDef; |
| import androidx.annotation.NonNull; |
| import androidx.annotation.Nullable; |
| |
| import com.android.wallpaper.asset.Asset; |
| import com.android.wallpaper.model.StaticWallpaperPrefMetadata; |
| import com.android.wallpaper.model.WallpaperInfo; |
| |
| import java.io.InputStream; |
| import java.util.List; |
| import java.util.Map; |
| |
| /** |
| * Interface for classes which persist wallpapers to the system. |
| */ |
| public interface WallpaperPersister { |
| |
| int DEST_HOME_SCREEN = 0; |
| int DEST_LOCK_SCREEN = 1; |
| int DEST_BOTH = 2; |
| |
| /** |
| * Sets a static individual wallpaper to the system via the WallpaperManager. |
| * |
| * @param wallpaper Wallpaper model object. Wallpaper image will be set from the asset provided |
| * to this method. |
| * @param asset Wallpaper asset from which to retrieve image data. |
| * @param cropRect Desired crop area of the wallpaper in post-scale units. If null, then the |
| * wallpaper image will be set without any scaling or cropping. |
| * @param scale Scaling factor applied to the source image before setting the wallpaper to the |
| * device. |
| * @param destination The destination - where to set the wallpaper to. |
| * @param callback Called once the wallpaper was set or if an error occurred. |
| */ |
| void setIndividualWallpaper(WallpaperInfo wallpaper, Asset asset, @Nullable Rect cropRect, |
| float scale, @Destination int destination, SetWallpaperCallback callback); |
| |
| /** |
| * Sets an individual wallpaper to the system as the wallpaper in the current rotation along with |
| * its metadata. Prevents automatic wallpaper backup to conserve user data. |
| * <p> |
| * This method should only be called off the main UI thread because it will compress and set the |
| * bitmap on the same thread as the caller. |
| * |
| * @param wallpaperBitmap Cropped and scaled wallpaper bitmap. This bitmap will be persisted as-is |
| * with no additional processing. |
| * @param attributions List of attribution items. |
| * @param actionUrl The action or "explore" URL for the wallpaper. |
| * @param collectionId ID of this wallpaper's collection. |
| * @param remoteId Remote ID of this wallpaper |
| * @return Whether the set wallpaper operation was successful. |
| */ |
| boolean setWallpaperInRotation(Bitmap wallpaperBitmap, List<String> attributions, |
| String actionUrl, String collectionId, String remoteId); |
| |
| /** |
| * Sets only the bitmap of a rotating wallpaper of the next rotation to the system and stores |
| * the given static wallpaper data in the recent wallpapers list (and not metadata). |
| * This function is used for the very first time setting the rotation wallpaper. It is called |
| * after the user initiates rotation wallpaper and the first wallpaper is downloaded. |
| * |
| * @param wallpaperBitmap The rotating wallpaper's bitmap. |
| * @param attributions List of attribution items. |
| * @param actionUrl The action or "explore" URL for the wallpaper. |
| * @param collectionId ID of this wallpaper's collection. |
| * @return wallpaper ID, which is a positive integer if the set wallpaper operation was |
| * successful, or 0 otherwise. On Android versions prior to N, this method will always return |
| * 1 if the operation was successful because wallpaper IDs are not supported prior to N. |
| */ |
| int setWallpaperBitmapInNextRotation(Bitmap wallpaperBitmap, List<String> attributions, |
| String actionUrl, String collectionId); |
| |
| /** |
| * Persists rotating wallpaper metadata for the next rotation and finalizes the preview wallpaper |
| * image so that it's visible as the actual device wallpaper. |
| * |
| * @param attributions List of attribution items. |
| * @param actionUrl The action or "explore" URL for the wallpaper. |
| * @param collectionId ID of this wallpaper's collection. |
| * @param wallpaperId Wallpaper ID that on Android N and later uniquely identifies the wallpaper |
| * image. |
| * @param remoteId Remote ID of this wallpaper. |
| * @return Whether the operation succeeded. |
| */ |
| boolean finalizeWallpaperForNextRotation(List<String> attributions, String actionUrl, |
| String collectionId, int wallpaperId, String remoteId); |
| |
| /** |
| * Finalizes wallpaper metadata by persisting them to SharedPreferences and finalizes the |
| * wallpaper image for live rotating components by copying the "preview" image to the "final" |
| * image file location. |
| * |
| * @param attributions List of attribution items. |
| * @param actionUrl The action or "explore" URL for the wallpaper. |
| * @param collectionId ID of this wallpaper's collection. |
| * @param wallpaperId ID that uniquely identifies a wallpaper set to the |
| * {@link android.app.WallpaperManager}. |
| * @param remoteId Remote ID of this wallpaper. |
| * @param destination Lock, home screen or both. |
| * @return Whether the operation was successful. |
| */ |
| boolean saveStaticWallpaperMetadata(List<String> attributions, |
| String actionUrl, |
| String collectionId, |
| int wallpaperId, |
| String remoteId, |
| @Destination int destination |
| ); |
| |
| /** |
| * Save static image wallpaper's meta to the system preferences. |
| */ |
| boolean saveStaticWallpaperToPreferences(int destination, |
| StaticWallpaperPrefMetadata metadata); |
| |
| /** |
| * @return the flag indicating which wallpaper to set when we're trying to set a wallpaper with |
| * no user intervention. The idea is that if there's a static wallpaper on lock, we will only |
| * override home, otherwise both |
| */ |
| int getDefaultWhichWallpaper(); |
| |
| /** |
| * Sets a wallpaper bitmap to the {@link android.app.WallpaperManager}. |
| * |
| * @return an integer wallpaper ID. This is an actual wallpaper ID on N and later versions of |
| * Android, otherwise on pre-N versions of Android will return a positive integer when the |
| * operation was successful and zero if the operation encountered an error. |
| */ |
| int setBitmapToWallpaperManager(Bitmap wallpaperBitmap, Rect cropHint, |
| boolean allowBackup, int whichWallpaper); |
| |
| /** |
| * Sets a wallpaper stream to the {@link android.app.WallpaperManager}. |
| * |
| * @return an integer wallpaper ID. This is an actual wallpaper ID on N and later versions of |
| * Android, otherwise on pre-N versions of Android will return a positive integer when the |
| * operation was successful and zero if the operation encountered an error. |
| */ |
| int setStreamToWallpaperManager(InputStream inputStream, @Nullable Rect cropHint, |
| boolean allowBackup, int whichWallpaper); |
| |
| /** |
| * Sets a wallpaper stream to the {@link android.app.WallpaperManager}. |
| * |
| * @return an integer wallpaper ID. This is an actual wallpaper ID on N and later versions of |
| * Android, otherwise on pre-N versions of Android will return a positive integer when the |
| * operation was successful and zero if the operation encountered an error. |
| */ |
| int setStreamWithCropsToWallpaperManager(InputStream inputStream, |
| @NonNull Map<Point, Rect> cropModel, |
| boolean allowBackup, int whichWallpaper); |
| |
| /** |
| * Saves the last wallpaper which showed a preview from this app. |
| */ |
| void setWallpaperInfoInPreview(WallpaperInfo wallpaper); |
| |
| /** |
| * Saves attributions to WallpaperPreferences for the last previewed wallpaper if it has an |
| * {@link android.app.WallpaperInfo} component matching the one currently set to the |
| * {@link android.app.WallpaperManager}. |
| * |
| * @param destination Live wallpaper destination (home/lock/both) |
| */ |
| void onLiveWallpaperSet(@Destination int destination); |
| |
| /** |
| * Updates lie wallpaper metadata by persisting them to SharedPreferences. |
| * |
| * @param wallpaperInfo Wallpaper model for the live wallpaper |
| * @param effects Comma-separate list of effect (see {@link WallpaperInfo#getEffectNames}) |
| * @param destination Live wallpaper destination (home/lock/both) |
| */ |
| void setLiveWallpaperMetadata(WallpaperInfo wallpaperInfo, String effects, |
| @Destination int destination); |
| |
| /** |
| * Interface for tracking success or failure of set wallpaper operations. |
| */ |
| interface SetWallpaperCallback { |
| void onSuccess(WallpaperInfo wallpaperInfo, @Destination int destination); |
| |
| void onError(@Nullable Throwable throwable); |
| } |
| |
| /** |
| * The possible destinations to which a wallpaper may be set. |
| */ |
| @IntDef({ |
| DEST_HOME_SCREEN, |
| DEST_LOCK_SCREEN, |
| DEST_BOTH}) |
| @interface Destination { |
| } |
| |
| /** |
| * Converts a {@link Destination} to the corresponding set of {@link SetWallpaperFlags}. |
| */ |
| @SetWallpaperFlags |
| static int destinationToFlags(@Destination int destination) { |
| switch (destination) { |
| case DEST_HOME_SCREEN: |
| return FLAG_SYSTEM; |
| case DEST_LOCK_SCREEN: |
| return FLAG_LOCK; |
| case DEST_BOTH: |
| return FLAG_SYSTEM | FLAG_LOCK; |
| default: |
| throw new AssertionError("Unknown @Destination"); |
| } |
| } |
| |
| /** |
| * Converts a set of {@link SetWallpaperFlags} to the corresponding {@link Destination}. |
| */ |
| @Destination |
| static int flagsToDestination(@SetWallpaperFlags int flags) { |
| if (flags == (FLAG_SYSTEM | FLAG_LOCK)) { |
| return DEST_BOTH; |
| } else if (flags == FLAG_SYSTEM) { |
| return DEST_HOME_SCREEN; |
| } else if (flags == FLAG_LOCK) { |
| return DEST_LOCK_SCREEN; |
| } else { |
| throw new AssertionError("Unknown @SetWallpaperFlags value"); |
| } |
| } |
| } |