package com.drivemode.android.typeface;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.Application;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Paint;
import android.graphics.Typeface;
import android.os.Build;
import android.support.annotation.LayoutRes;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
/**
* Helper class for setting typeface to the text views.
*
* @author KeithYokoma
*/
@SuppressWarnings("unused") // public APIs
public final class TypefaceHelper {
public static final String TAG = TypefaceHelper.class.getSimpleName();
private static TypefaceHelper sHelper;
private final TypefaceCache mCache;
private TypefaceHelper(Application application) {
mCache = TypefaceCache.getInstance(application);
}
/**
* Initialize the instance.
*
* @param application the application context.
*/
public static synchronized void initialize(Application application) {
if (sHelper != null) {
Log.v(TAG, "already initialized");
}
sHelper = new TypefaceHelper(application);
}
/**
* Terminate the instance.
*/
public static synchronized void destroy() {
if (sHelper == null) {
Log.v(TAG, "not initialized yet");
return;
}
sHelper = null;
}
/**
* Retrieve the helper instance.
*
* @return the helper instance.
*/
public static synchronized TypefaceHelper getInstance() {
if (sHelper == null) {
throw new IllegalArgumentException("Instance is not initialized yet. Call initialize() first.");
}
return sHelper;
}
/**
* Set the typeface to the target view.
*
* @param view to set typeface.
* @param typefaceName typeface name.
* @param <V> text view parameter.
*/
public <V extends TextView> void setTypeface(V view, String typefaceName) {
Typeface typeface = mCache.get(typefaceName);
if (typeface != null) {
view.setTypeface(typeface);
}
}
/**
* Set the typeface to the target view.
*
* @param view to set typeface.
* @param typefaceName typeface name.
* @param style the typeface style.
* @param <V> text view parameter.
*/
public <V extends TextView> void setTypeface(V view, String typefaceName, int style) {
Typeface typeface = mCache.get(typefaceName);
if (typeface != null) {
view.setTypeface(typeface, style);
}
}
/**
* Set the typeface to the all text views belong to the view group.
* Note that this method recursively trace the child view groups and set typeface for the text views.
*
* @param viewGroup the view group that contains text views.
* @param typefaceName typeface name.
* @param <V> view group parameter.
*/
public <V extends ViewGroup> void setTypeface(V viewGroup, String typefaceName) {
int count = viewGroup.getChildCount();
for (int i = 0; i < count; i++) {
View child = viewGroup.getChildAt(i);
if (child instanceof ViewGroup) {
setTypeface((ViewGroup) child, typefaceName);
continue;
}
if (!(child instanceof TextView)) {
continue;
}
setTypeface((TextView) child, typefaceName);
}
}
/**
* Set the typeface to the all text views belong to the view group.
* Note that this method recursively trace the child view groups and set typeface for the text views.
*
* @param viewGroup the view group that contains text views.
* @param typefaceName typeface name.
* @param style the typeface style.
* @param <V> view group parameter.
*/
public <V extends ViewGroup> void setTypeface(V viewGroup, String typefaceName, int style) {
int count = viewGroup.getChildCount();
for (int i = 0; i < count; i++) {
View child = viewGroup.getChildAt(i);
if (child instanceof ViewGroup) {
setTypeface((ViewGroup) child, typefaceName, style);
continue;
}
if (!(child instanceof TextView)) {
continue;
}
setTypeface((TextView) child, typefaceName, style);
}
}
/**
* Set the typeface to the target paint.
*
* @param paint the set typeface.
* @param typefaceName typeface name.
*/
public void setTypeface(Paint paint, String typefaceName) {
Typeface typeface = mCache.get(typefaceName);
if (typeface != null) {
paint.setTypeface(typeface);
}
}
/**
* Set the typeface to the all text views belong to the view group.
*
* @param context the context.
* @param layoutRes the layout resource id.
* @param typefaceName typeface name.
* @return the view.
*/
public View setTypeface(Context context, @LayoutRes int layoutRes, String typefaceName) {
return setTypeface(context, layoutRes, null, typefaceName);
}
/**
* Set the typeface to the all text views belong to the view group.
*
* @param context the context.
* @param layoutRes the layout resource id.
* @param parent the parent view group to attach the layout.
* @param typefaceName typeface name.
* @return the view.
*/
public View setTypeface(Context context, @LayoutRes int layoutRes, ViewGroup parent, String typefaceName) {
ViewGroup view = (ViewGroup) LayoutInflater.from(context).inflate(layoutRes, parent);
setTypeface(view, typefaceName);
return view;
}
/**
* Set the typeface to the all text views belong to the view group.
*
* @param context the context.
* @param layoutRes the layout resource id.
* @param typefaceName typeface name.
* @param style the typeface style.
* @return the view.
*/
public View setTypeface(Context context, @LayoutRes int layoutRes, String typefaceName, int style) {
return setTypeface(context, layoutRes, null, typefaceName, 0);
}
/**
* Set the typeface to the all text views belong to the view group.
*
* @param context the context.
* @param layoutRes the layout resource id.
* @param parent the parent view group to attach the layout.
* @param typefaceName typeface name.
* @param style the typeface style.
* @return the view.
*/
public View setTypeface(Context context, @LayoutRes int layoutRes, ViewGroup parent, String typefaceName, int style) {
ViewGroup view = (ViewGroup) LayoutInflater.from(context).inflate(layoutRes, parent);
setTypeface(view, typefaceName, style);
return view;
}
/**
* Set the typeface to the all text views belong to the activity.
* Note that we use decor view of the activity so that the typeface will also be applied to action bar.
*
* @param activity the activity.
* @param typefaceName typeface name.
*/
public void setTypeface(Activity activity, String typefaceName) {
setTypeface(activity, typefaceName, 0);
}
/**
* Set the typeface to the all text views belong to the activity.
* Note that we use decor view of the activity so that the typeface will also be applied to action bar.
*
* @param activity the activity.
* @param typefaceName typeface name.
* @param style the typeface style.
*/
public void setTypeface(Activity activity, String typefaceName, int style) {
setTypeface((ViewGroup) activity.getWindow().getDecorView(), typefaceName, style);
}
/**
* Set the typeface to the all text views belong to the fragment.
* Make sure to call this method after fragment view creation.
* If you use fragments in the support package,
* call {@link com.drivemode.android.typeface.TypefaceHelper#supportSetTypeface(android.support.v4.app.Fragment, String)} instead.
*
* @param fragment the fragment.
* @param typefaceName typeface name.
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public <F extends android.app.Fragment> void setTypeface(F fragment, String typefaceName) {
setTypeface(fragment, typefaceName, 0);
}
/**
* Set the typeface to the all text views belong to the fragment.
* Make sure to call this method after fragment view creation.
* If you use fragments in the support package,
* call {@link com.drivemode.android.typeface.TypefaceHelper#supportSetTypeface(android.support.v4.app.Fragment, String, int)} instead.
*
* @param fragment the fragment.
* @param typefaceName typeface name.
* @param style the typeface style.
*/
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public <F extends android.app.Fragment> void setTypeface(F fragment, String typefaceName, int style) {
View root = fragment.getView();
if (root instanceof TextView) {
setTypeface((TextView) root, typefaceName, style);
} else if (root instanceof ViewGroup) {
setTypeface((ViewGroup) root, typefaceName, style);
}
}
/**
* Set the typeface to the all text views belong to the fragment.
* Make sure to call this method after fragment view creation.
* And this is a support package fragments only.
*
* @param fragment the fragment.
* @param typefaceName typeface name.
*/
public <F extends android.support.v4.app.Fragment> void supportSetTypeface(F fragment, String typefaceName) {
supportSetTypeface(fragment, typefaceName, 0);
}
/**
* Set the typeface to the all text views belong to the fragment.
* Make sure to call this method after fragment view creation.
* And this is a support package fragments only.
*
* @param fragment the fragment.
* @param typefaceName typeface name.
* @param style the typeface style.
*/
public <F extends android.support.v4.app.Fragment> void supportSetTypeface(F fragment, String typefaceName, int style) {
View root = fragment.getView();
if (root instanceof TextView) {
setTypeface((TextView) root, typefaceName, style);
} else if (root instanceof ViewGroup) {
setTypeface((ViewGroup) root, typefaceName, style);
}
}
/**
* Set the typeface for the dialog view.
*
* @param dialog the dialog.
* @param typefaceName typeface name.
*/
public <D extends Dialog> void setTypeface(D dialog, String typefaceName) {
setTypeface(dialog, typefaceName, 0);
}
/**
* Set the typeface for the dialog view.
*
* @param dialog the dialog.
* @param typefaceName typeface name.
* @param style the typeface style.
*/
public <D extends Dialog> void setTypeface(D dialog, String typefaceName, int style) {
DialogUtils.setTypeface(this, dialog, typefaceName, style);
}
/**
* Set the typeface for the toast view.
*
* @param toast toast.
* @param typefaceName typeface name.
* @return toast that the typeface is injected.
*/
public Toast setTypeface(Toast toast, String typefaceName) {
return setTypeface(toast, typefaceName, 0);
}
/**
* Set the typeface for the toast view.
*
* @param toast toast.
* @param typefaceName typeface name.
* @param style the typeface style.
* @return toast that the typeface is injected.
*/
public Toast setTypeface(Toast toast, String typefaceName, int style) {
setTypeface((ViewGroup) toast.getView(), typefaceName, style);
return toast;
}
}