ActionBarUtil.java

 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}