2015-07-26 17:21:54 +02:00
|
|
|
package net.simonvt.menudrawer.compat;
|
|
|
|
|
|
|
|
import android.app.ActionBar;
|
|
|
|
import android.app.Activity;
|
|
|
|
import android.content.res.TypedArray;
|
|
|
|
import android.graphics.drawable.Drawable;
|
2020-09-30 14:47:59 +02:00
|
|
|
import timber.log.Timber;
|
2015-07-26 17:21:54 +02:00
|
|
|
import android.view.View;
|
|
|
|
import android.view.ViewGroup;
|
|
|
|
import android.widget.ImageView;
|
|
|
|
|
|
|
|
import java.lang.reflect.Method;
|
|
|
|
|
|
|
|
final class ActionBarHelperNative {
|
|
|
|
|
|
|
|
private ActionBarHelperNative() {
|
|
|
|
}
|
|
|
|
|
|
|
|
private static final int[] THEME_ATTRS = new int[] {
|
|
|
|
android.R.attr.homeAsUpIndicator
|
|
|
|
};
|
|
|
|
|
|
|
|
public static void setActionBarUpIndicator(Object info, Activity activity, Drawable drawable, int contentDescRes) {
|
|
|
|
|
|
|
|
final SetIndicatorInfo sii = (SetIndicatorInfo) info;
|
|
|
|
if (sii.setHomeAsUpIndicator != null) {
|
|
|
|
try {
|
|
|
|
final ActionBar actionBar = activity.getActionBar();
|
|
|
|
sii.setHomeAsUpIndicator.invoke(actionBar, drawable);
|
|
|
|
sii.setHomeActionContentDescription.invoke(actionBar, contentDescRes);
|
|
|
|
} catch (Throwable t) {
|
2020-09-30 14:47:59 +02:00
|
|
|
if (ActionBarHelper.DEBUG) Timber.e(t, "Couldn't set home-as-up indicator via JB-MR2 API");
|
2015-07-26 17:21:54 +02:00
|
|
|
}
|
|
|
|
} else if (sii.upIndicatorView != null) {
|
|
|
|
sii.upIndicatorView.setImageDrawable(drawable);
|
|
|
|
} else {
|
2020-09-30 14:47:59 +02:00
|
|
|
if (ActionBarHelper.DEBUG) Timber.e("Couldn't set home-as-up indicator");
|
2015-07-26 17:21:54 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void setActionBarDescription(Object info, Activity activity, int contentDescRes) {
|
|
|
|
final SetIndicatorInfo sii = (SetIndicatorInfo) info;
|
|
|
|
if (sii.setHomeAsUpIndicator != null) {
|
|
|
|
try {
|
|
|
|
final ActionBar actionBar = activity.getActionBar();
|
|
|
|
sii.setHomeActionContentDescription.invoke(actionBar, contentDescRes);
|
|
|
|
} catch (Throwable t) {
|
2020-09-30 14:47:59 +02:00
|
|
|
if (ActionBarHelper.DEBUG) Timber.e(t, "Couldn't set content description via JB-MR2 API");
|
2015-07-26 17:21:54 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public static Drawable getThemeUpIndicator(Object info, Activity activity) {
|
|
|
|
final TypedArray a = activity.obtainStyledAttributes(THEME_ATTRS);
|
|
|
|
final Drawable result = a.getDrawable(0);
|
|
|
|
a.recycle();
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
public static Object getIndicatorInfo(Activity activity) {
|
|
|
|
return new SetIndicatorInfo(activity);
|
|
|
|
}
|
|
|
|
|
|
|
|
public static void setDisplayHomeAsUpEnabled(Activity activity, boolean b) {
|
|
|
|
ActionBar actionBar = activity.getActionBar();
|
|
|
|
if (actionBar != null) {
|
|
|
|
actionBar.setDisplayHomeAsUpEnabled(b);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private static class SetIndicatorInfo {
|
|
|
|
|
|
|
|
public Method setHomeAsUpIndicator;
|
|
|
|
public Method setHomeActionContentDescription;
|
|
|
|
public ImageView upIndicatorView;
|
|
|
|
|
|
|
|
SetIndicatorInfo(Activity activity) {
|
|
|
|
try {
|
|
|
|
setHomeAsUpIndicator = ActionBar.class.getDeclaredMethod("setHomeAsUpIndicator", Drawable.class);
|
|
|
|
setHomeActionContentDescription = ActionBar.class.getDeclaredMethod(
|
|
|
|
"setHomeActionContentDescription", Integer.TYPE);
|
|
|
|
|
|
|
|
// If we got the method we won't need the stuff below.
|
|
|
|
return;
|
|
|
|
} catch (Throwable t) {
|
|
|
|
// Oh well. We'll use the other mechanism below instead.
|
|
|
|
}
|
|
|
|
|
|
|
|
final View home = activity.findViewById(android.R.id.home);
|
|
|
|
if (home == null) {
|
|
|
|
// Action bar doesn't have a known configuration, an OEM messed with things.
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
final ViewGroup parent = (ViewGroup) home.getParent();
|
|
|
|
final int childCount = parent.getChildCount();
|
|
|
|
if (childCount != 2) {
|
|
|
|
// No idea which one will be the right one, an OEM messed with things.
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
final View first = parent.getChildAt(0);
|
|
|
|
final View second = parent.getChildAt(1);
|
|
|
|
final View up = first.getId() == android.R.id.home ? second : first;
|
|
|
|
|
|
|
|
if (up instanceof ImageView) {
|
|
|
|
// Jackpot! (Probably...)
|
|
|
|
upIndicatorView = (ImageView) up;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|