/* * 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.picker.individual; import android.app.Activity; import android.content.Context; import android.util.Log; import android.view.View; import com.android.wallpaper.R; import com.android.wallpaper.asset.Asset; import com.android.wallpaper.model.WallpaperInfo; import com.android.wallpaper.module.Injector; import com.android.wallpaper.module.InjectorProvider; import com.android.wallpaper.module.UserEventLogger; import com.android.wallpaper.module.UserEventLogger.WallpaperSetFailureReason; import com.android.wallpaper.module.WallpaperPersister; import com.android.wallpaper.module.WallpaperPersister.SetWallpaperCallback; import com.android.wallpaper.util.ThrowableAnalyzer; /** * IndividualHolder subclass for a wallpaper tile in the RecyclerView for which a click should * set the wallpaper as the current wallpaper on the device. */ class SetIndividualHolder extends IndividualHolder implements View.OnClickListener, SelectableHolder { private static final String TAG = "SetIndividualHolder"; private SelectionAnimator mSelectionAnimator; private OnSetListener mOnSetListener; private View mTile; public SetIndividualHolder( Activity hostActivity, int tileHeightPx, View itemView, SelectionAnimator selectionAnimator, OnSetListener onSetListener) { super(hostActivity, tileHeightPx, itemView); mTile = itemView.findViewById(R.id.tile); mSelectionAnimator = selectionAnimator; mOnSetListener = onSetListener; } @Override public void bindWallpaper(WallpaperInfo wallpaper) { super.bindWallpaper(wallpaper); String wallpaperId = mWallpaper.getWallpaperId(); String remoteWallpaperId = InjectorProvider.getInjector().getPreferences( mActivity.getApplicationContext()).getHomeWallpaperRemoteId(); boolean selected = wallpaperId != null && wallpaperId.equals(remoteWallpaperId); if (selected) { mSelectionAnimator.selectImmediately(); } else { mSelectionAnimator.deselectImmediately(); } mTile.setOnClickListener(this); } @Override public void setSelectionState(@SelectionState int selectionState) { if (selectionState == SELECTION_STATE_SELECTED) { mSelectionAnimator.animateSelected(); } else if (selectionState == SELECTION_STATE_DESELECTED) { mSelectionAnimator.animateDeselected(); } else if (selectionState == SELECTION_STATE_LOADING) { mSelectionAnimator.showLoading(); } } @Override public void onClick(View unused) { setWallpaper(); } /* package */ void setWallpaper() { // If this wallpaper is already selected, then do nothing. if (mSelectionAnimator.isSelected()) { return; } final int adapterPosition = getAdapterPosition(); mOnSetListener.onPendingWallpaperSet(adapterPosition); final Context appContext = mActivity.getApplicationContext(); mSelectionAnimator.showLoading(); Injector injector = InjectorProvider.getInjector(); final UserEventLogger eventLogger = injector.getUserEventLogger(appContext); eventLogger.logIndividualWallpaperSelected(mWallpaper.getCollectionId(mActivity)); Asset desktopAsset = mWallpaper.getDesktopAsset(appContext); WallpaperPersister wallpaperPersister = InjectorProvider.getInjector().getWallpaperPersister(appContext); wallpaperPersister.setIndividualWallpaper(mWallpaper, desktopAsset, null /* cropRect */, 1.0f /* scale */, WallpaperPersister.DEST_BOTH, new SetWallpaperCallback() { @Override public void onSuccess(WallpaperInfo wallpaperInfo) { mOnSetListener.onWallpaperSet(adapterPosition); eventLogger.logWallpaperSet( mWallpaper.getCollectionId(appContext), mWallpaper.getWallpaperId()); eventLogger.logWallpaperSetResult(UserEventLogger.WALLPAPER_SET_RESULT_SUCCESS); } @Override public void onError(Throwable throwable) { Log.e(TAG, "Could not set a wallpaper."); eventLogger.logWallpaperSetResult(UserEventLogger.WALLPAPER_SET_RESULT_FAILURE); @WallpaperSetFailureReason int failureReason = ThrowableAnalyzer.isOOM(throwable) ? UserEventLogger.WALLPAPER_SET_FAILURE_REASON_OOM : UserEventLogger.WALLPAPER_SET_FAILURE_REASON_OTHER; eventLogger.logWallpaperSetFailureReason(failureReason); mSelectionAnimator.showNotLoading(); mOnSetListener.onWallpaperSetFailed(SetIndividualHolder.this); } }); } interface OnSetListener { /** * Called to signal that the wallpaper at the given adapter position is starting to be set. */ void onPendingWallpaperSet(int adapterPosition); /** * Called once the wallpaper at the given adapter position has been set. */ void onWallpaperSet(int adapterPosition); /** * Called when setting the wallpaper represented by the provided holder failed. */ void onWallpaperSetFailed(SetIndividualHolder holder); } }