/*
* Firetweet - Twitter client for Android
*
* Copyright (C) 2012-2014 Mariotaku Lee <mariotaku.lee@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.getlantern.firetweet.util.accessor;
import android.annotation.TargetApi;
import android.content.res.ColorStateList;
import android.graphics.Outline;
import android.graphics.Path;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.view.View;
import android.view.ViewOutlineProvider;
import android.widget.CompoundButton;
import android.widget.ProgressBar;
public final class ViewAccessor {
public static boolean isInLayout(View view) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) {
return false;
} else {
return ViewAccessorJBMR2.isInLayout(view);
}
}
@SuppressWarnings("deprecation")
public static void setBackground(final View view, final Drawable background) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
view.setBackgroundDrawable(background);
} else {
ViewAccessorJB.setBackground(view, background);
}
}
public static void setBackgroundTintList(final View view, final ColorStateList list) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return;
ViewAccessorL.setBackgroundTintList(view, list);
}
public static void setButtonTintList(CompoundButton view, ColorStateList list) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return;
ViewAccessorL.setButtonTintList(view, list);
}
public static void setClipToOutline(View view, boolean clipToOutline) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return;
ViewAccessorL.setClipToOutline(view, clipToOutline);
}
public static void setIndeterminateTintList(ProgressBar view, ColorStateList list) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return;
ViewAccessorL.setIndeterminateTintList(view, list);
}
public static void setOutlineProvider(View view, ViewOutlineProviderCompat outlineProvider) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return;
ViewAccessorL.setOutlineProvider(view, outlineProvider);
}
public static void setProgressBackgroundTintList(ProgressBar view, ColorStateList list) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return;
ViewAccessorL.setProgressBackgroundTintList(view, list);
}
public static void setProgressTintList(ProgressBar view, ColorStateList list) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return;
ViewAccessorL.setProgressTintList(view, list);
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
static class ViewAccessorJB {
static void setBackground(final View view, final Drawable background) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) return;
view.setBackground(background);
}
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR2)
static class ViewAccessorJBMR2 {
static boolean isInLayout(final View view) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR2) return false;
return view.isInLayout();
}
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
static class ViewAccessorL {
public static void setClipToOutline(View view, boolean clipToOutline) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return;
view.setClipToOutline(clipToOutline);
}
public static void setOutlineProvider(View view, ViewOutlineProviderCompat outlineProvider) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return;
view.setOutlineProvider(new ViewOutlineProviderL(outlineProvider));
}
static void setBackgroundTintList(final View view, final ColorStateList list) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return;
view.setBackgroundTintList(list);
}
static void setButtonTintList(final CompoundButton view, final ColorStateList list) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return;
view.setButtonTintList(list);
}
static void setIndeterminateTintList(final ProgressBar view, final ColorStateList list) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return;
view.setIndeterminateTintList(list);
}
static void setProgressBackgroundTintList(final ProgressBar view, final ColorStateList list) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return;
view.setProgressBackgroundTintList(list);
}
static void setProgressTintList(final ProgressBar view, final ColorStateList list) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return;
view.setProgressTintList(list);
}
}
/**
* Interface by which a View builds its {@link org.getlantern.firetweet.util.accessor.ViewAccessor.OutlineCompat}, used for shadow casting and clipping.
*/
public static abstract class ViewOutlineProviderCompat {
/**
* Called to get the provider to populate the Outline.
* <p/>
* This method will be called by a View when its owned Drawables are invalidated, when the
* View's size changes, or if {@link View#invalidateOutline()} is called
* explicitly.
* <p/>
* The input outline is empty and has an alpha of <code>1.0f</code>.
*
* @param view The view building the outline.
* @param outline The empty outline to be populated.
*/
public abstract void getOutline(View view, OutlineCompat outline);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static class ViewOutlineProviderL extends ViewOutlineProvider {
private final ViewOutlineProviderCompat providerCompat;
ViewOutlineProviderL(ViewOutlineProviderCompat providerCompat) {
this.providerCompat = providerCompat;
}
@Override
public void getOutline(View view, Outline outline) {
providerCompat.getOutline(view, new OutlineL(outline));
}
}
@SuppressWarnings("unused")
public static abstract class OutlineCompat {
public abstract float getAlpha();
public abstract boolean isEmpty();
public abstract void set(Outline src);
public abstract void setAlpha(float alpha);
public abstract void setConvexPath(Path convexPath);
public abstract void setOval(int left, int top, int right, int bottom);
public abstract void setOval(Rect rect);
public abstract void setEmpty();
public abstract boolean canClip();
public abstract void setRect(int left, int top, int right, int bottom);
public abstract void setRect(Rect rect);
public abstract void setRoundRect(int left, int top, int right, int bottom, float radius);
public abstract void setRoundRect(Rect rect, float radius);
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public static class OutlineL extends OutlineCompat {
private final Outline outline;
@Override
public void setEmpty() {
outline.setEmpty();
}
@Override
public boolean canClip() {
return outline.canClip();
}
@Override
public void setRect(int left, int top, int right, int bottom) {
outline.setRect(left, top, right, bottom);
}
@Override
public void setOval(int left, int top, int right, int bottom) {
outline.setOval(left, top, right, bottom);
}
@Override
public void setConvexPath(Path convexPath) {
outline.setConvexPath(convexPath);
}
@Override
public void setRect(Rect rect) {
outline.setRect(rect);
}
@Override
public void setOval(Rect rect) {
outline.setOval(rect);
}
@Override
public float getAlpha() {
return outline.getAlpha();
}
@Override
public void set(Outline src) {
outline.set(src);
}
@Override
public void setRoundRect(int left, int top, int right, int bottom, float radius) {
outline.setRoundRect(left, top, right, bottom, radius);
}
@Override
public void setRoundRect(Rect rect, float radius) {
outline.setRoundRect(rect, radius);
}
@Override
public boolean isEmpty() {
return outline.isEmpty();
}
@Override
public void setAlpha(float alpha) {
outline.setAlpha(alpha);
}
public OutlineL(Outline outline) {
this.outline = outline;
}
}
}