/* * Copyright (C) 2019 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.settings.widget; import android.content.Context; import android.graphics.drawable.Drawable; import android.view.TextureView; import android.view.View; import androidx.vectordrawable.graphics.drawable.Animatable2Compat; import androidx.vectordrawable.graphics.drawable.AnimatedVectorDrawableCompat; /** * A {@link VideoPreference.AnimationController} containing a {@link * AnimatedVectorDrawableCompat}. The controller is used by {@link VideoPreference} * to display AnimatedVectorDrawable content. */ class VectorAnimationController implements VideoPreference.AnimationController { private AnimatedVectorDrawableCompat mAnimatedVectorDrawableCompat; private Drawable mPreviewDrawable; private Animatable2Compat.AnimationCallback mAnimationCallback; /** * Called by a preference panel fragment to finish itself. * * @param context Application Context * @param animationId An {@link android.graphics.drawable.AnimationDrawable} resource id */ VectorAnimationController(Context context, int animationId) { mAnimatedVectorDrawableCompat = AnimatedVectorDrawableCompat.create(context, animationId); mAnimationCallback = new Animatable2Compat.AnimationCallback() { @Override public void onAnimationEnd(Drawable drawable) { mAnimatedVectorDrawableCompat.start(); } }; } @Override public int getVideoWidth() { return mAnimatedVectorDrawableCompat.getIntrinsicWidth(); } @Override public int getVideoHeight() { return mAnimatedVectorDrawableCompat.getIntrinsicHeight(); } @Override public void pause() { mAnimatedVectorDrawableCompat.stop(); } @Override public void start() { mAnimatedVectorDrawableCompat.start(); } @Override public boolean isPlaying() { return mAnimatedVectorDrawableCompat.isRunning(); } @Override public int getDuration() { // We can't get duration from AnimatedVectorDrawable, just return a non zero value. return 5000; } @Override public void attachView(TextureView video, View preview, View playButton) { mPreviewDrawable = preview.getForeground(); video.setVisibility(View.GONE); updateViewStates(preview, playButton); preview.setOnClickListener(v -> updateViewStates(preview, playButton)); } @Override public void release() { mAnimatedVectorDrawableCompat.stop(); mAnimatedVectorDrawableCompat.clearAnimationCallbacks(); } private void updateViewStates(View imageView, View playButton) { if (mAnimatedVectorDrawableCompat.isRunning()) { mAnimatedVectorDrawableCompat.stop(); mAnimatedVectorDrawableCompat.clearAnimationCallbacks(); playButton.setVisibility(View.VISIBLE); imageView.setForeground(mPreviewDrawable); } else { playButton.setVisibility(View.GONE); imageView.setForeground(mAnimatedVectorDrawableCompat); mAnimatedVectorDrawableCompat.start(); mAnimatedVectorDrawableCompat.registerAnimationCallback(mAnimationCallback); } } }