/* * 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 android.content.Context; import androidx.annotation.Nullable; import com.android.wallpaper.compat.WallpaperManagerCompat; import com.android.wallpaper.model.CurrentWallpaperInfoVN; import com.android.wallpaper.model.WallpaperInfo; import com.android.wallpaper.module.WallpaperPreferences.PresentationMode; /** * Default implementation of {@link CurrentWallpaperInfoFactory} which actually constructs * {@link WallpaperInfo} instances representing the wallpapers currently set to the device. */ public class DefaultCurrentWallpaperInfoFactory implements CurrentWallpaperInfoFactory { private final Context mAppContext; private final WallpaperRefresher mWallpaperRefresher; private final LiveWallpaperInfoFactory mLiveWallpaperInfoFactory; // Cached copies of the currently-set WallpaperInfo(s) and presentation mode. private WallpaperInfo mHomeWallpaper; @Nullable private WallpaperInfo mLockWallpaper; @PresentationMode private int mPresentationMode; public DefaultCurrentWallpaperInfoFactory(Context context) { mAppContext = context.getApplicationContext(); Injector injector = InjectorProvider.getInjector(); mWallpaperRefresher = injector.getWallpaperRefresher(mAppContext); mLiveWallpaperInfoFactory = injector.getLiveWallpaperInfoFactory(mAppContext); } @Override public synchronized void createCurrentWallpaperInfos(final WallpaperInfoCallback callback, boolean forceRefresh) { if (!forceRefresh && mHomeWallpaper != null && mPresentationMode != WallpaperPreferences.PRESENTATION_MODE_ROTATING) { callback.onWallpaperInfoCreated(mHomeWallpaper, mLockWallpaper, mPresentationMode); return; } // Clear cached copies if we are refreshing the currently-set WallpaperInfo(s) from the // Refresher so that multiple calls to this method after a call with forceRefresh=true don't // provide old cached copies. if (forceRefresh) { mHomeWallpaper = null; mLockWallpaper = null; } mWallpaperRefresher.refresh( (homeWallpaperMetadata, lockWallpaperMetadata, presentationMode) -> { WallpaperInfo homeWallpaper; if (homeWallpaperMetadata.getWallpaperComponent() == null) { homeWallpaper = new CurrentWallpaperInfoVN( homeWallpaperMetadata.getAttributions(), homeWallpaperMetadata.getActionUrl(), homeWallpaperMetadata.getActionLabelRes(), homeWallpaperMetadata.getActionIconRes(), homeWallpaperMetadata.getCollectionId(), WallpaperManagerCompat.FLAG_SYSTEM); } else { homeWallpaper = mLiveWallpaperInfoFactory.getLiveWallpaperInfo( homeWallpaperMetadata.getWallpaperComponent()); } WallpaperInfo lockWallpaper = null; if (lockWallpaperMetadata != null) { lockWallpaper = new CurrentWallpaperInfoVN( lockWallpaperMetadata.getAttributions(), lockWallpaperMetadata.getActionUrl(), lockWallpaperMetadata.getActionLabelRes(), lockWallpaperMetadata.getActionIconRes(), lockWallpaperMetadata.getCollectionId(), WallpaperManagerCompat.FLAG_LOCK); } mHomeWallpaper = homeWallpaper; mLockWallpaper = lockWallpaper; mPresentationMode = presentationMode; callback.onWallpaperInfoCreated(homeWallpaper, lockWallpaper, presentationMode); }); } }