1package eu.siacs.conversations.ui.util;
2
3import android.content.Context;
4import android.view.View;
5
6import androidx.annotation.NonNull;
7import androidx.annotation.Nullable;
8
9import java.lang.reflect.Field;
10
11public class ActionBarUtil {
12
13 public static void resetActionBarOnClickListeners(@NonNull View view) {
14 final View title = findActionBarTitle(view);
15 final View subtitle = findActionBarSubTitle(view);
16 if (title != null) {
17 title.setOnClickListener(null);
18 }
19 if (subtitle != null) {
20 subtitle.setOnClickListener(null);
21 }
22 }
23
24 public static void setActionBarOnClickListener(@NonNull View view,
25 @NonNull final View.OnClickListener onClickListener) {
26 final View title = findActionBarTitle(view);
27 final View subtitle = findActionBarSubTitle(view);
28 if (title != null) {
29 title.setOnClickListener(onClickListener);
30 }
31 if (subtitle != null) {
32 subtitle.setOnClickListener(onClickListener);
33 }
34 }
35
36 private static @Nullable View findActionBarTitle(@NonNull View root) {
37 return findActionBarItem(root, "action_bar_title", "mTitleTextView");
38 }
39
40 private static @Nullable
41 View findActionBarSubTitle(@NonNull View root) {
42 return findActionBarItem(root, "action_bar_subtitle", "mSubtitleTextView");
43 }
44
45 private static @Nullable View findActionBarItem(@NonNull View root,
46 @NonNull String resourceName,
47 @NonNull String toolbarFieldName) {
48 View result = findViewSupportOrAndroid(root, resourceName);
49
50 if (result == null) {
51 View actionBar = findViewSupportOrAndroid(root, "action_bar");
52 if (actionBar != null) {
53 result = reflectiveRead(actionBar, toolbarFieldName);
54 }
55 }
56 if (result == null && root.getClass().getName().endsWith("widget.Toolbar")) {
57 result = reflectiveRead(root, toolbarFieldName);
58 }
59 return result;
60 }
61
62 @SuppressWarnings("ConstantConditions")
63 private static @Nullable View findViewSupportOrAndroid(@NonNull View root,
64 @NonNull String resourceName) {
65 Context context = root.getContext();
66 View result = null;
67 if (result == null) {
68 int supportID = context.getResources().getIdentifier(resourceName, "id", context.getPackageName());
69 result = root.findViewById(supportID);
70 }
71 if (result == null) {
72 int androidID = context.getResources().getIdentifier(resourceName, "id", "android");
73 result = root.findViewById(androidID);
74 }
75 return result;
76 }
77
78 @SuppressWarnings("unchecked")
79 private static <T> T reflectiveRead(@NonNull Object object, @NonNull String fieldName) {
80 try {
81 Field field = object.getClass().getDeclaredField(fieldName);
82 field.setAccessible(true);
83 return (T) field.get(object);
84 } catch (final Exception ex) {
85 return null;
86 }
87 }
88}