/* * Copyright (C) 2022 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 android.app.wallpapereffectsgeneration; import android.annotation.CallbackExecutor; import android.annotation.NonNull; import android.annotation.RequiresPermission; import android.annotation.SystemApi; import android.annotation.SystemService; import android.content.Context; import android.os.RemoteException; import java.util.concurrent.Executor; /** * A {@link WallpaperEffectsGenerationManager} is the class that passes wallpaper effects * generation requests to wallpaper effect generation service. For example, create a cinematic * and render a cinematic live wallpaper with the response. * * Usage: *
{@code * mWallpaperEffectsGenerationManager = * context.getSystemService(WallpaperEffectsGenerationManager.class); * mWallpaperEffectsGenerationManager. * generateCinematicEffect(cinematicEffectRequest, response->{ * // proceed cinematic effect response. * }); * }* * @hide */ @SystemApi @SystemService(Context.WALLPAPER_EFFECTS_GENERATION_SERVICE) public final class WallpaperEffectsGenerationManager { /** * Interface for the cinematic effect listener. */ public interface CinematicEffectListener { /** * Async call when the cinematic effect response is generated. * Client needs to check the status code of {@link CinematicEffectResponse} * to determine if the effect generation is successful. * * @param response The generated cinematic effect response. */ void onCinematicEffectGenerated(@NonNull CinematicEffectResponse response); } private final IWallpaperEffectsGenerationManager mService; /** @hide */ public WallpaperEffectsGenerationManager( @NonNull IWallpaperEffectsGenerationManager service) { mService = service; } /** * Execute a {@link android.app.wallpapereffectsgeneration.CinematicEffectRequest} from * the given parameters to the wallpaper effects generation service. After the cinematic * effect response is ready, the given listener is invoked by the system with the response. * The listener may never receive a callback if unexpected error happened when proceeding * request. * * @param request request to generate cinematic effect. * @param executor where the listener is invoked. * @param listener listener invoked when the cinematic effect response is available. * @hide */ @SystemApi @RequiresPermission(android.Manifest.permission.MANAGE_WALLPAPER_EFFECTS_GENERATION) public void generateCinematicEffect(@NonNull CinematicEffectRequest request, @NonNull @CallbackExecutor Executor executor, @NonNull CinematicEffectListener listener) { try { mService.generateCinematicEffect(request, new CinematicEffectListenerWrapper(listener, executor)); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } } private static final class CinematicEffectListenerWrapper extends ICinematicEffectListener.Stub { @NonNull private final CinematicEffectListener mListener; @NonNull private final Executor mExecutor; CinematicEffectListenerWrapper(@NonNull CinematicEffectListener listener, @NonNull Executor executor) { mListener = listener; mExecutor = executor; } @Override public void onCinematicEffectGenerated(CinematicEffectResponse response) { mExecutor.execute(() -> mListener.onCinematicEffectGenerated(response)); } } }