package org.wikipedia.views;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import android.view.ActionMode;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewManager;
import android.view.animation.Animation;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.drawee.view.SimpleDraweeView;
import org.wikipedia.WikipediaApp;
import org.wikipedia.util.DimenUtil;
import java.lang.reflect.Field;
public final class ViewUtil {
public static void setBackgroundDrawable(View view, Drawable drawable) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
view.setBackground(drawable);
} else {
//noinspection deprecation
view.setBackgroundDrawable(drawable);
}
}
public static boolean detach(@Nullable View view) {
if (view != null && view.getParent() instanceof ViewManager) {
((ViewManager) view.getParent()).removeView(view);
return true;
}
return false;
}
public static void setTopPaddingDp(@NonNull View view, int padding) {
view.setPadding(view.getPaddingLeft(), (int) (padding * DimenUtil.getDensityScalar()),
view.getPaddingRight(), view.getPaddingBottom());
}
public static void setBottomPaddingDp(@NonNull View view, int padding) {
view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), view.getPaddingRight(),
(int) (padding * DimenUtil.getDensityScalar()));
}
public static void setAnimationMatrix(View view, Animation animation) {
// View.setAnimationMatrix() is hidden so we can't get the final Animation frame
// Transformation Matrix and apply it manually.
view.clearAnimation();
animation.setDuration(0);
view.setAnimation(animation);
}
/**
* Find the originating view of an ActionMode.
* @param mode The ActionMode in question.
* @return The view from which the ActionMode originated.
* @throws NoSuchFieldException
* @throws IllegalAccessException
*/
public static View getOriginatingView(ActionMode mode) throws NoSuchFieldException, IllegalAccessException {
Field originatingView = mode.getClass().getDeclaredField("mOriginatingView");
originatingView.setAccessible(true);
return (View) originatingView.get(mode);
}
public static void loadImageUrlInto(@NonNull SimpleDraweeView drawee, @Nullable String url) {
drawee.setController(Fresco.newDraweeControllerBuilder()
.setUri(WikipediaApp.getInstance().isImageDownloadEnabled()
&& !TextUtils.isEmpty(url)
? Uri.parse(url) : null)
.setAutoPlayAnimations(true)
.build());
}
@NonNull
public static Bitmap getBitmapFromView(@NonNull View view) {
Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(returnedBitmap);
view.draw(canvas);
return returnedBitmap;
}
@Nullable public static ViewGroup parent(@NonNull View view) {
return view.getParent() instanceof ViewGroup ? (ViewGroup) view.getParent() : null;
}
public static void remove(@NonNull View view) {
ViewManager parent = parent(view);
if (parent != null) {
parent.removeView(view);
}
}
/** Replace the current View with a new View by copying the ID and LayoutParams (by reference). */
public static void replace(@NonNull View current, @NonNull View next) {
ViewGroup parent = parent(current);
if (parent == null || parent(next) != null) {
String msg = "Parent of current View must be nonnull; parent of next View must be null.";
throw new IllegalStateException(msg);
}
next.setId(current.getId());
next.setLayoutParams(current.getLayoutParams());
int index = parent.indexOfChild(current);
remove(current);
parent.addView(next, index);
}
public static void fadeIn(@NonNull View view) {
view.setAlpha(0f);
view.setVisibility(View.VISIBLE);
view.animate().alpha(1f)
.setDuration(view.getResources().getInteger(android.R.integer.config_shortAnimTime))
.setListener(null);
}
public static void fadeOut(@NonNull final View view) {
view.animate().alpha(0f)
.setDuration(view.getResources().getInteger(android.R.integer.config_shortAnimTime))
.setListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
view.setVisibility(View.GONE);
}
});
}
private ViewUtil() { }
}