diff options
Diffstat (limited to 'src/com/android/customization/widget/PageIndicator.java')
-rw-r--r-- | src/com/android/customization/widget/PageIndicator.java | 295 |
1 files changed, 0 insertions, 295 deletions
diff --git a/src/com/android/customization/widget/PageIndicator.java b/src/com/android/customization/widget/PageIndicator.java deleted file mode 100644 index dd636ad9..00000000 --- a/src/com/android/customization/widget/PageIndicator.java +++ /dev/null @@ -1,295 +0,0 @@ -/* - * Copyright (C) 2018 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.customization.widget; - -import android.content.Context; -import android.content.res.ColorStateList; -import android.content.res.TypedArray; -import android.graphics.drawable.Animatable2; -import android.graphics.drawable.AnimatedVectorDrawable; -import android.graphics.drawable.Drawable; -import android.util.AttributeSet; -import android.util.Log; -import android.view.View; -import android.view.ViewGroup; -import android.widget.ImageView; - -import com.android.wallpaper.R; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.ArrayList; - -/** - * Page indicator widget, based on QS's page indicator: - * - * Based on QS PageIndicator - * Path: frameworks/base/packages/SystemUI/src/com/android/systemui/qs/PageIndicator.java - */ -public class PageIndicator extends ViewGroup { - - private static final String TAG = "PageIndicator"; - private static final boolean DEBUG = false; - - // The size of a single dot in relation to the whole animation. - private static final float SINGLE_SCALE = .4f; - - static final float MINOR_ALPHA = .42f; - - private final ArrayList<Integer> mQueuedPositions = new ArrayList<>(); - - private final int mPageIndicatorWidth; - private final int mPageIndicatorHeight; - private final int mPageDotWidth; - - private int mPosition = -1; - private boolean mAnimating; - - private static Method sMethodForceAnimationOnUI = null; - private final Animatable2.AnimationCallback mAnimationCallback = - new Animatable2.AnimationCallback() { - - @Override - public void onAnimationEnd(Drawable drawable) { - super.onAnimationEnd(drawable); - if (drawable instanceof AnimatedVectorDrawable) { - ((AnimatedVectorDrawable) drawable).unregisterAnimationCallback( - mAnimationCallback); - } - if (DEBUG) { - Log.d(TAG, "onAnimationEnd - queued: " + mQueuedPositions.size()); - } - mAnimating = false; - if (mQueuedPositions.size() != 0) { - setPosition(mQueuedPositions.remove(0)); - } - } - }; - - - public PageIndicator(Context context, AttributeSet attrs) { - super(context, attrs); - mPageIndicatorWidth = - (int) context.getResources().getDimension(R.dimen.preview_indicator_width); - mPageIndicatorHeight = - (int) context.getResources().getDimension(R.dimen.preview_indicator_height); - mPageDotWidth = (int) (mPageIndicatorWidth * SINGLE_SCALE); - } - - public void setNumPages(int numPages) { - setVisibility(numPages > 1 ? View.VISIBLE : View.INVISIBLE); - if (mAnimating) { - Log.w(TAG, "setNumPages during animation"); - } - while (numPages < getChildCount()) { - removeViewAt(getChildCount() - 1); - } - TypedArray array = getContext().obtainStyledAttributes( - new int[]{android.R.attr.colorControlActivated}); - int color = array.getColor(0, 0); - array.recycle(); - while (numPages > getChildCount()) { - ImageView v = new ImageView(getContext()); - v.setImageResource(R.drawable.minor_a_b); - v.setImageTintList(ColorStateList.valueOf(color)); - addView(v, new LayoutParams(mPageIndicatorWidth, mPageIndicatorHeight)); - } - // Refresh state. - setIndex(mPosition >> 1); - } - - public void setLocation(float location) { - int index = (int) location; - setContentDescription(getContext().getString(R.string.accessibility_preview_pager, - (index + 1), getChildCount())); - int position = index << 1 | ((location != index) ? 1 : 0); - if (DEBUG) { - Log.d(TAG, "setLocation " + location + " " + index + " " + position); - } - - int lastPosition = mPosition; - if (mQueuedPositions.size() != 0) { - lastPosition = mQueuedPositions.get(mQueuedPositions.size() - 1); - } - if (DEBUG) { - Log.d(TAG, position + " " + lastPosition); - } - if (position == lastPosition) return; - if (mAnimating) { - if (DEBUG) { - Log.d(TAG, "Queueing transition to " + Integer.toHexString(position)); - } - mQueuedPositions.add(position); - return; - } - - setPosition(position); - } - - private void setPosition(int position) { - if (mPosition >= 0 && Math.abs(mPosition - position) == 1) { - animate(mPosition, position); - } else { - if (DEBUG) { - Log.d(TAG, "Skipping animation " + mPosition - + " " + position); - } - setIndex(position >> 1); - } - mPosition = position; - } - - private void setIndex(int index) { - final int N = getChildCount(); - for (int i = 0; i < N; i++) { - ImageView v = (ImageView) getChildAt(i); - // Clear out any animation positioning. - v.setTranslationX(0); - v.setImageResource(R.drawable.major_a_b); - v.setAlpha(getAlpha(i == index)); - } - } - - private void animate(int from, int to) { - if (DEBUG) { - Log.d(TAG, "Animating from " + Integer.toHexString(from) + " to " - + Integer.toHexString(to)); - } - int fromIndex = from >> 1; - int toIndex = to >> 1; - - // Set the position of everything, then we will manually control the two views involved - // in the animation. - setIndex(fromIndex); - - boolean fromTransition = (from & 1) != 0; - boolean isAState = fromTransition ? from > to : from < to; - int firstIndex = Math.min(fromIndex, toIndex); - int secondIndex = Math.max(fromIndex, toIndex); - if (secondIndex == firstIndex) { - secondIndex++; - } - ImageView first = (ImageView) getChildAt(firstIndex); - ImageView second = (ImageView) getChildAt(secondIndex); - if (first == null || second == null) { - // may happen during reInflation or other weird cases - return; - } - // Lay the two views on top of each other. - second.setTranslationX(first.getX() - second.getX()); - - playAnimation(first, getTransition(fromTransition, isAState, false)); - first.setAlpha(getAlpha(false)); - - playAnimation(second, getTransition(fromTransition, isAState, true)); - second.setAlpha(getAlpha(true)); - - mAnimating = true; - } - - private float getAlpha(boolean isMajor) { - return isMajor ? 1 : MINOR_ALPHA; - } - - private void playAnimation(ImageView imageView, int res) { - Drawable drawable = getContext().getDrawable(res); - if (!(drawable instanceof AnimatedVectorDrawable)) { - return; - } - final AnimatedVectorDrawable avd = (AnimatedVectorDrawable) drawable; - imageView.setImageDrawable(avd); - try { - forceAnimationOnUI(avd); - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - Log.e(TAG, "Catch an exception in playAnimation", e); - } - avd.registerAnimationCallback(mAnimationCallback); - avd.start(); - } - - private void forceAnimationOnUI(AnimatedVectorDrawable avd) - throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { - if (sMethodForceAnimationOnUI == null) { - sMethodForceAnimationOnUI = AnimatedVectorDrawable.class.getMethod( - "forceAnimationOnUI"); - } - if (sMethodForceAnimationOnUI != null) { - sMethodForceAnimationOnUI.invoke(avd); - } - } - - private int getTransition(boolean fromB, boolean isMajorAState, boolean isMajor) { - if (isMajor) { - if (fromB) { - if (isMajorAState) { - return R.drawable.major_b_a_animation; - } else { - return R.drawable.major_b_c_animation; - } - } else { - if (isMajorAState) { - return R.drawable.major_a_b_animation; - } else { - return R.drawable.major_c_b_animation; - } - } - } else { - if (fromB) { - if (isMajorAState) { - return R.drawable.minor_b_c_animation; - } else { - return R.drawable.minor_b_a_animation; - } - } else { - if (isMajorAState) { - return R.drawable.minor_c_b_animation; - } else { - return R.drawable.minor_a_b_animation; - } - } - } - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - final int N = getChildCount(); - if (N == 0) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - return; - } - final int widthChildSpec = MeasureSpec.makeMeasureSpec(mPageIndicatorWidth, - MeasureSpec.EXACTLY); - final int heightChildSpec = MeasureSpec.makeMeasureSpec(mPageIndicatorHeight, - MeasureSpec.EXACTLY); - for (int i = 0; i < N; i++) { - getChildAt(i).measure(widthChildSpec, heightChildSpec); - } - int width = (mPageIndicatorWidth - mPageDotWidth) * (N - 1) + mPageDotWidth; - setMeasuredDimension(width, mPageIndicatorHeight); - } - - @Override - protected void onLayout(boolean changed, int l, int t, int r, int b) { - final int N = getChildCount(); - if (N == 0) { - return; - } - for (int i = 0; i < N; i++) { - int left = (mPageIndicatorWidth - mPageDotWidth) * i; - getChildAt(i).layout(left, 0, mPageIndicatorWidth + left, mPageIndicatorHeight); - } - } -} |