// Copyright 2004-present Facebook. All Rights Reserved.
package com.facebook.react.views.progressbar;
import javax.annotation.Nullable;
import android.content.Context;
import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ProgressBar;
import com.facebook.react.bridge.JSApplicationIllegalArgumentException;
/**
* Controls an enclosing ProgressBar. Exists so that the ProgressBar can be recreated if
* the style would change.
*/
/* package */ class ProgressBarContainerView extends FrameLayout {
private static final int MAX_PROGRESS = 1000;
private @Nullable Integer mColor;
private boolean mIndeterminate = true;
private boolean mAnimating = true;
private double mProgress;
private @Nullable ProgressBar mProgressBar;
public ProgressBarContainerView(Context context) {
super(context);
}
public void setStyle(@Nullable String styleName) {
int style = ReactProgressBarViewManager.getStyleFromString(styleName);
mProgressBar = ReactProgressBarViewManager.createProgressBar(getContext(), style);
mProgressBar.setMax(MAX_PROGRESS);
removeAllViews();
addView(
mProgressBar,
new ViewGroup.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));
}
public void setColor(@Nullable Integer color) {
this.mColor = color;
}
public void setIndeterminate(boolean indeterminate) {
mIndeterminate = indeterminate;
}
public void setProgress(double progress) {
mProgress = progress;
}
public void setAnimating(boolean animating) {
mAnimating = animating;
}
public void apply() {
if (mProgressBar == null) {
throw new JSApplicationIllegalArgumentException("setStyle() not called");
}
mProgressBar.setIndeterminate(mIndeterminate);
setColor(mProgressBar);
mProgressBar.setProgress((int) (mProgress * MAX_PROGRESS));
if (mAnimating) {
mProgressBar.setVisibility(View.VISIBLE);
} else {
mProgressBar.setVisibility(View.GONE);
}
}
private void setColor(ProgressBar progressBar) {
Drawable drawable;
if (progressBar.isIndeterminate()) {
drawable = progressBar.getIndeterminateDrawable();
} else {
drawable = progressBar.getProgressDrawable();
}
if (drawable == null) {
return;
}
if (mColor != null) {
drawable.setColorFilter(mColor, PorterDuff.Mode.SRC_IN);
} else {
drawable.clearColorFilter();
}
}
}