content: /*
   * Copyright (C) 2016 Bilibili
   *
   * 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.bilibili.magicasakura.widgets;
  
  import android.content.res.ColorStateList;
  import android.content.res.TypedArray;
  import android.graphics.drawable.Drawable;
  import android.graphics.drawable.LayerDrawable;
  import android.support.annotation.Nullable;
  import android.util.AttributeSet;
  import android.util.Log;
  import android.view.View;
  import android.widget.ProgressBar;
  
  import com.bilibili.magicasakura.utils.ThemeUtils;
  import com.bilibili.magicasakura.utils.TintInfo;
  import com.bilibili.magicasakura.utils.TintManager;
  import com.wm.remusic.R;
  
  /**
   * @author xyczero617@gmail.com
   * @time 16/2/4
   */
  public class AppCompatProgressBarHelper extends AppCompatBaseHelper {
      private static final int ATTR[] = new int[]{
              R.attr.progressTint,
              R.attr.progressIndeterminateTint
      };
  
      private int mProgressTintResId;
      private int mIndeterminateTintResId;
  
      private TintInfo mProgressTintInfo;
      private TintInfo mIndeterminateTintInfo;
  
      public AppCompatProgressBarHelper(View view, TintManager tintManager) {
          super(view, tintManager);
      }
  
      @SuppressWarnings("ResourceType")
      @Override
      void loadFromAttribute(AttributeSet attrs, int defStyleAttr) {
          TypedArray array = mView.getContext().obtainStyledAttributes(attrs, ATTR, defStyleAttr, 0);
          Log.e("themep", "progress tint");
          if (array.hasValue(0)) {
              Log.e("themep", "progress tint");
              mProgressTintResId = array.getResourceId(0, 0);
              setSupportProgressTint(mView.getResources().getColorStateList(mProgressTintResId));
              Log.e("themep", "progress tint = " + mProgressTintResId);
          }
          if (array.hasValue(1)) {
              Log.e("themep", "progress inter tint");
              mIndeterminateTintResId = array.getResourceId(1, 0);
              setSupportIndeterminateTint(array.getColorStateList(1));
          }
          array.recycle();
      }
  
      public void setSupportProgressTint(ColorStateList tint) {
          Log.e("themep", " set progress tint");
          if (tint != null) {
              if (mProgressTintInfo == null) {
                  mProgressTintInfo = new TintInfo();
              }
              mProgressTintInfo.mHasTintList = true;
              mProgressTintInfo.mTintList = ColorStateList.valueOf(ThemeUtils.getColor(mView.getContext(), tint.getDefaultColor()));
              Log.e("themep", "color = " + ColorStateList.valueOf(ThemeUtils.getColor(mView.getContext(), tint.getDefaultColor())).getDefaultColor());
          }
          applySupportProgressTint();
      }
  
      private void setSupportIndeterminateTint(ColorStateList tint) {
          if (tint != null) {
              if (mIndeterminateTintInfo == null) {
                  mIndeterminateTintInfo = new TintInfo();
              }
              mIndeterminateTintInfo.mHasTintList = true;
              mIndeterminateTintInfo.mTintList = ColorStateList.valueOf(ThemeUtils.getColor(mView.getContext(), tint.getDefaultColor()));
          }
          applySupportIndeterminateTint();
      }
  
      private void applySupportProgressTint() {
          Log.e("themep", "apply progress tint");
          if (mProgressTintInfo != null
                  && (mProgressTintInfo.mHasTintList || mProgressTintInfo.mHasTintMode)) {
              Log.e("themep", "apply progress tint true");
              final Drawable target = getTintTarget(android.R.id.progress, true);
              if (target != null) {
                  TintManager.tintViewDrawable(mView, target, mProgressTintInfo);
                  Log.e("themep", "apply progress tint true tint");
                  // The drawable (or one of its children) may not have been
                  // stateful before applying the tint, so let's try again.
                  if (target.isStateful()) {
                      target.setState(mView.getDrawableState());
                  }
              }
          }
      }
  
      private void applySupportIndeterminateTint() {
          Drawable mIndeterminateDrawable = ((ProgressBar) mView).getIndeterminateDrawable();
          if (mIndeterminateDrawable != null && mIndeterminateTintInfo != null) {
              final TintInfo tintInfo = mIndeterminateTintInfo;
              if (tintInfo.mHasTintList || tintInfo.mHasTintMode) {
                  ((ProgressBar) mView).setIndeterminateDrawable(mIndeterminateDrawable = mIndeterminateDrawable.mutate());
                  TintManager.tintViewDrawable(mView, mIndeterminateDrawable, mIndeterminateTintInfo);
                  // The drawable (or one of its children) may not have been
                  // stateful before applying the tint, so let's try again.
                  if (mIndeterminateDrawable.isStateful()) {
                      mIndeterminateDrawable.setState(mView.getDrawableState());
                  }
              }
          }
      }
  
      @Nullable
      private Drawable getTintTarget(int layerId, boolean shouldFallback) {
          Drawable layer = null;
  
          final Drawable d = ((ProgressBar) mView).getProgressDrawable();
          if (d != null) {
              ((ProgressBar) mView).setProgressDrawable(d.mutate());
  
              if (d instanceof LayerDrawable) {
                  layer = ((LayerDrawable) d).findDrawableByLayerId(layerId);
              }
  
              if (shouldFallback && layer == null) {
                  layer = d;
              }
          }
  
          return layer;
      }
  
      @Override
      public void tint() {
          Log.e("themep", "is tint");
          if (mProgressTintResId != 0) {
              Log.e("themep", " pro " + mProgressTintResId);
              Log.e("themep", " pro  " + mView.getResources().getColorStateList(mProgressTintResId).getDefaultColor());
  
              setSupportProgressTint(mView.getResources().getColorStateList(mProgressTintResId));
  
          }
          if (mIndeterminateTintResId != 0) {
              Log.e("themep", "    " + mProgressTintResId);
              Log.e("themep", "    " + mView.getResources().getColorStateList(mProgressTintResId).getDefaultColor());
              setSupportIndeterminateTint(mView.getResources().getColorStateList(mIndeterminateTintResId));
          }
      }
  }
  