ViewBindingAdapter.java revision 716ba89e7f459f49ea85070d4710c1d79d715298
1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package android.databinding.adapters;
17
18import android.annotation.TargetApi;
19import android.databinding.BindingAdapter;
20import android.databinding.BindingMethod;
21import android.databinding.BindingMethods;
22import android.os.Build;
23import android.os.Build.VERSION;
24import android.os.Build.VERSION_CODES;
25import android.view.View;
26import android.view.View.OnAttachStateChangeListener;
27import com.android.databinding.library.baseAdapters.R;
28
29@BindingMethods({
30        @BindingMethod(type = View.class, attribute = "android:backgroundTint", method = "setBackgroundTintList"),
31        @BindingMethod(type = View.class, attribute = "android:fadeScrollbars", method = "setScrollbarFadingEnabled"),
32        @BindingMethod(type = View.class, attribute = "android:getOutline", method = "setOutlineProvider"),
33        @BindingMethod(type = View.class, attribute = "android:nextFocusForward", method = "setNextFocusForwardId"),
34        @BindingMethod(type = View.class, attribute = "android:nextFocusLeft", method = "setNextFocusLeftId"),
35        @BindingMethod(type = View.class, attribute = "android:nextFocusRight", method = "setNextFocusRightId"),
36        @BindingMethod(type = View.class, attribute = "android:nextFocusUp", method = "setNextFocusUpId"),
37        @BindingMethod(type = View.class, attribute = "android:nextFocusDown", method = "setNextFocusDownId"),
38        @BindingMethod(type = View.class, attribute = "android:requiresFadingEdge", method = "setVerticalFadingEdgeEnabled"),
39        @BindingMethod(type = View.class, attribute = "android:scrollbarDefaultDelayBeforeFade", method = "setScrollBarDefaultDelayBeforeFade"),
40        @BindingMethod(type = View.class, attribute = "android:scrollbarFadeDuration", method = "setScrollBarFadeDuration"),
41        @BindingMethod(type = View.class, attribute = "android:scrollbarSize", method = "setScrollBarSize"),
42        @BindingMethod(type = View.class, attribute = "android:scrollbarStyle", method = "setScrollBarStyle"),
43        @BindingMethod(type = View.class, attribute = "android:transformPivotX", method = "setPivotX"),
44        @BindingMethod(type = View.class, attribute = "android:transformPivotY", method = "setPivotY"),
45        @BindingMethod(type = View.class, attribute = "android:onDrag", method = "setOnDragListener"),
46        @BindingMethod(type = View.class, attribute = "android:onClick", method = "setOnClickListener"),
47        @BindingMethod(type = View.class, attribute = "android:onApplyWindowInsets", method = "setOnApplyWindowInsetsListener"),
48        @BindingMethod(type = View.class, attribute = "android:onCreateContextMenu", method = "setOnCreateContextMenuListener"),
49        @BindingMethod(type = View.class, attribute = "android:onFocusChange", method = "setOnFocusChangeListener"),
50        @BindingMethod(type = View.class, attribute = "android:onGenericMotion", method = "setOnGenericMotionListener"),
51        @BindingMethod(type = View.class, attribute = "android:onHover", method = "setOnHoverListener"),
52        @BindingMethod(type = View.class, attribute = "android:onKey", method = "setOnKeyListener"),
53        @BindingMethod(type = View.class, attribute = "android:onLongClick", method = "setOnLongClickListener"),
54        @BindingMethod(type = View.class, attribute = "android:onSystemUiVisibilityChange", method = "setOnSystemUiVisibilityChangeListener"),
55        @BindingMethod(type = View.class, attribute = "android:onTouch", method = "setOnTouchListener"),
56})
57public class ViewBindingAdapter {
58    public static int FADING_EDGE_NONE = 0;
59    public static int FADING_EDGE_HORIZONTAL = 1;
60    public static int FADING_EDGE_VERTICAL = 2;
61
62    @BindingAdapter({"android:padding"})
63    public static void setPadding(View view, int padding) {
64        view.setPadding(padding, padding, padding, padding);
65    }
66
67    @BindingAdapter({"android:paddingBottom"})
68    public static void setPaddingBottom(View view, int padding) {
69        view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), view.getPaddingRight(),
70                padding);
71    }
72
73    @BindingAdapter({"android:paddingEnd"})
74    public static void setPaddingEnd(View view, int padding) {
75        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
76            view.setPaddingRelative(view.getPaddingStart(), view.getPaddingTop(), padding,
77                    view.getPaddingBottom());
78        } else {
79            view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), padding,
80                    view.getPaddingBottom());
81        }
82    }
83
84    @BindingAdapter({"android:paddingLeft"})
85    public static void setPaddingLeft(View view, int padding) {
86        view.setPadding(padding, view.getPaddingTop(), view.getPaddingRight(),
87                view.getPaddingBottom());
88    }
89
90    @BindingAdapter({"android:paddingRight"})
91    public static void setPaddingRight(View view, int padding) {
92        view.setPadding(view.getPaddingLeft(), view.getPaddingTop(), padding,
93                view.getPaddingBottom());
94    }
95
96    @BindingAdapter({"android:paddingStart"})
97    public static void setPaddingStart(View view, int padding) {
98        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
99            view.setPaddingRelative(padding, view.getPaddingTop(), view.getPaddingEnd(),
100                    view.getPaddingBottom());
101        } else {
102            view.setPadding(padding, view.getPaddingTop(), view.getPaddingRight(),
103                    view.getPaddingBottom());
104        }
105    }
106
107    @BindingAdapter({"android:paddingTop"})
108    public static void setPaddingTop(View view, int padding) {
109        view.setPadding(view.getPaddingLeft(), padding, view.getPaddingRight(),
110                view.getPaddingBottom());
111    }
112
113    @BindingAdapter({"android:requiresFadingEdge"})
114    public static void setRequiresFadingEdge(View view, int value) {
115        final boolean vertical = (value & FADING_EDGE_VERTICAL) != 0;
116        final boolean horizontal = (value & FADING_EDGE_HORIZONTAL) != 0;
117        view.setVerticalFadingEdgeEnabled(vertical);
118        view.setHorizontalFadingEdgeEnabled(horizontal);
119    }
120
121    @BindingAdapter({"android:onClickListener", "android:clickable"})
122    public static void setClickListener(View view, View.OnClickListener clickListener,
123            boolean clickable) {
124        view.setOnClickListener(clickListener);
125        view.setClickable(clickable);
126    }
127
128    @BindingAdapter({"android:onClick", "android:clickable"})
129    public static void setOnClick(View view, View.OnClickListener clickListener,
130            boolean clickable) {
131        view.setOnClickListener(clickListener);
132        view.setClickable(clickable);
133    }
134
135    @BindingAdapter({"android:onLongClickListener", "android:longClickable"})
136    public static void setListener(View view, View.OnLongClickListener clickListener,
137            boolean clickable) {
138        view.setOnLongClickListener(clickListener);
139        view.setLongClickable(clickable);
140    }
141
142    @BindingAdapter({"android:onLongClick", "android:longClickable"})
143    public static void setOnLongClick(View view, View.OnLongClickListener clickListener,
144            boolean clickable) {
145        view.setOnLongClickListener(clickListener);
146        view.setLongClickable(clickable);
147    }
148
149    @BindingAdapter("android:onViewAttachedToWindow")
150    public static void setListener(View view, OnViewAttachedToWindow attached) {
151        setListener(view, null, attached);
152    }
153
154    @BindingAdapter("android:onViewDetachedFromWindow")
155    public static void setListener(View view, OnViewDetachedFromWindow detached) {
156        setListener(view, detached, null);
157    }
158
159    @BindingAdapter({"android:onViewDetachedFromWindow", "android:onViewAttachedToWindow"})
160    public static void setListener(View view, final OnViewDetachedFromWindow detach,
161            final OnViewAttachedToWindow attach) {
162        if (VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB_MR1) {
163            final OnAttachStateChangeListener newListener;
164            if (detach == null && attach == null) {
165                newListener = null;
166            } else {
167                newListener = new OnAttachStateChangeListener() {
168                    @Override
169                    public void onViewAttachedToWindow(View v) {
170                        if (attach != null) {
171                            attach.onViewAttachedToWindow(v);
172                        }
173                    }
174
175                    @Override
176                    public void onViewDetachedFromWindow(View v) {
177                        if (detach != null) {
178                            detach.onViewDetachedFromWindow(v);
179                        }
180                    }
181                };
182            }
183            final OnAttachStateChangeListener oldListener = ListenerUtil.trackListener(view,
184                    newListener, R.id.onAttachStateChangeListener);
185            if (oldListener != null) {
186                view.removeOnAttachStateChangeListener(oldListener);
187            }
188            if (newListener != null) {
189                view.addOnAttachStateChangeListener(newListener);
190            }
191        }
192    }
193
194    @BindingAdapter("android:onLayoutChange")
195    public static void setOnLayoutChangeListener(View view, View.OnLayoutChangeListener oldValue,
196            View.OnLayoutChangeListener newValue) {
197        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
198            if (oldValue != null) {
199                view.removeOnLayoutChangeListener(oldValue);
200            }
201            if (newValue != null) {
202                view.addOnLayoutChangeListener(newValue);
203            }
204        }
205    }
206
207    @TargetApi(VERSION_CODES.HONEYCOMB_MR1)
208    public interface OnViewDetachedFromWindow {
209        void onViewDetachedFromWindow(View v);
210    }
211
212    @TargetApi(VERSION_CODES.HONEYCOMB_MR1)
213    public interface OnViewAttachedToWindow {
214        void onViewAttachedToWindow(View v);
215    }
216}
217