summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Mount <mount@google.com>2015-09-17 07:42:41 -0700
committerGeorge Mount <mount@google.com>2016-01-14 14:29:32 -0800
commit3b920788e90bb0abe615a5d5c899915f0014444b (patch)
treee31dc6bc137aaa23792ddddbad9988f229ed0d84
parentd3f2b9229472c9dae9bf4ae8b3e2d653b5653b01 (diff)
downloaddata-binding-3b920788e90bb0abe615a5d5c899915f0014444b.tar.gz
Two-way binding extensions
Bug 1474349 Bug 22460238 Two-way data binding won't work without a few changes to the extension library. This adds those changes and tests to ensure that two-way data binding works. Change-Id: I5e204609925bb2dc5404176f9b4e59386f200c7f
-rwxr-xr-x.idea/codeStyleSettings.xml2
-rw-r--r--databinding.properties2
-rw-r--r--extensions/baseAdapters/build.gradle2
-rw-r--r--extensions/baseAdapters/src/main/java/android/databinding/adapters/AdapterViewBindingAdapter.java35
-rw-r--r--extensions/baseAdapters/src/main/java/android/databinding/adapters/AutoCompleteTextViewBindingAdapter.java2
-rw-r--r--extensions/baseAdapters/src/main/java/android/databinding/adapters/CalendarViewBindingAdapter.java37
-rw-r--r--extensions/baseAdapters/src/main/java/android/databinding/adapters/CompoundButtonBindingAdapter.java33
-rw-r--r--extensions/baseAdapters/src/main/java/android/databinding/adapters/DatePickerBindingAdapter.java87
-rw-r--r--extensions/baseAdapters/src/main/java/android/databinding/adapters/ListenerUtil.java27
-rw-r--r--extensions/baseAdapters/src/main/java/android/databinding/adapters/NumberPickerBindingAdapter.java37
-rw-r--r--extensions/baseAdapters/src/main/java/android/databinding/adapters/RadioGroupBindingAdapter.java38
-rw-r--r--extensions/baseAdapters/src/main/java/android/databinding/adapters/RatingBarBindingAdapter.java36
-rw-r--r--extensions/baseAdapters/src/main/java/android/databinding/adapters/SeekBarBindingAdapter.java24
-rw-r--r--extensions/baseAdapters/src/main/java/android/databinding/adapters/TabHostBindingAdapter.java52
-rw-r--r--extensions/baseAdapters/src/main/java/android/databinding/adapters/TextViewBindingAdapter.java61
-rw-r--r--extensions/baseAdapters/src/main/java/android/databinding/adapters/TimePickerBindingAdapter.java93
-rw-r--r--extensions/baseAdapters/src/main/res/values/ids.xml2
-rw-r--r--extensions/library/src/main/java/android/databinding/ViewDataBinding.java273
-rw-r--r--internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1-javadoc.jarbin0 -> 198821 bytes
-rw-r--r--internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1-javadoc.jar.md51
-rw-r--r--internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1-javadoc.jar.sha11
-rw-r--r--internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1-sources.jarbin0 -> 42109 bytes
-rw-r--r--internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1-sources.jar.md51
-rw-r--r--internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1-sources.jar.sha11
-rw-r--r--internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1.aarbin0 -> 67331 bytes
-rw-r--r--internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1.aar.md51
-rw-r--r--internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1.aar.sha11
-rw-r--r--internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1.pom30
-rw-r--r--internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1.pom.md51
-rw-r--r--internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1.pom.sha11
-rw-r--r--internal-prebuilts/com/android/databinding/adapters/maven-metadata.xml5
-rw-r--r--internal-prebuilts/com/android/databinding/adapters/maven-metadata.xml.md52
-rw-r--r--internal-prebuilts/com/android/databinding/adapters/maven-metadata.xml.sha12
-rw-r--r--internal-prebuilts/com/android/databinding/library/1.1/library-1.1-javadoc.jarbin0 -> 127631 bytes
-rw-r--r--internal-prebuilts/com/android/databinding/library/1.1/library-1.1-javadoc.jar.md51
-rw-r--r--internal-prebuilts/com/android/databinding/library/1.1/library-1.1-javadoc.jar.sha11
-rw-r--r--internal-prebuilts/com/android/databinding/library/1.1/library-1.1-sources.jarbin0 -> 36263 bytes
-rw-r--r--internal-prebuilts/com/android/databinding/library/1.1/library-1.1-sources.jar.md51
-rw-r--r--internal-prebuilts/com/android/databinding/library/1.1/library-1.1-sources.jar.sha11
-rw-r--r--internal-prebuilts/com/android/databinding/library/1.1/library-1.1.aarbin0 -> 50280 bytes
-rw-r--r--internal-prebuilts/com/android/databinding/library/1.1/library-1.1.aar.md51
-rw-r--r--internal-prebuilts/com/android/databinding/library/1.1/library-1.1.aar.sha11
-rw-r--r--internal-prebuilts/com/android/databinding/library/1.1/library-1.1.pom30
-rw-r--r--internal-prebuilts/com/android/databinding/library/1.1/library-1.1.pom.md51
-rw-r--r--internal-prebuilts/com/android/databinding/library/1.1/library-1.1.pom.sha11
-rw-r--r--internal-prebuilts/com/android/databinding/library/maven-metadata.xml5
-rw-r--r--internal-prebuilts/com/android/databinding/library/maven-metadata.xml.md52
-rw-r--r--internal-prebuilts/com/android/databinding/library/maven-metadata.xml.sha12
48 files changed, 871 insertions, 66 deletions
diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml
index bf5f929e..003973d6 100755
--- a/.idea/codeStyleSettings.xml
+++ b/.idea/codeStyleSettings.xml
@@ -157,4 +157,4 @@
</option>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</component>
-</project> \ No newline at end of file
+</project>
diff --git a/databinding.properties b/databinding.properties
index ab6f8244..7d0ba977 100644
--- a/databinding.properties
+++ b/databinding.properties
@@ -2,7 +2,7 @@
kotlinVersion = 1.0.0-beta-1103
version = 1.1
releaseVersion = 1.1
-extensionsVersion = 1.0-rc5
+extensionsVersion = 1.1
# we use a public plugin so that it does not need data binding while compiling library
androidPublicPluginVersion= 1.5.0
javaTargetCompatibility = 1.6
diff --git a/extensions/baseAdapters/build.gradle b/extensions/baseAdapters/build.gradle
index 06b967a5..d375aeba 100644
--- a/extensions/baseAdapters/build.gradle
+++ b/extensions/baseAdapters/build.gradle
@@ -31,7 +31,7 @@ android {
}
defaultConfig {
minSdkVersion 7
- targetSdkVersion 21
+ targetSdkVersion 23
versionCode 1
versionName "1.0"
}
diff --git a/extensions/baseAdapters/src/main/java/android/databinding/adapters/AdapterViewBindingAdapter.java b/extensions/baseAdapters/src/main/java/android/databinding/adapters/AdapterViewBindingAdapter.java
index 85ae55ab..5e519130 100644
--- a/extensions/baseAdapters/src/main/java/android/databinding/adapters/AdapterViewBindingAdapter.java
+++ b/extensions/baseAdapters/src/main/java/android/databinding/adapters/AdapterViewBindingAdapter.java
@@ -18,7 +18,11 @@ package android.databinding.adapters;
import android.databinding.BindingAdapter;
import android.databinding.BindingMethod;
import android.databinding.BindingMethods;
+import android.databinding.InverseBindingListener;
+import android.databinding.InverseBindingMethod;
+import android.databinding.InverseBindingMethods;
import android.view.View;
+import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
@@ -26,34 +30,50 @@ import android.widget.AdapterView.OnItemSelectedListener;
@BindingMethod(type = AdapterView.class, attribute = "android:onItemClick", method = "setOnItemClickListener"),
@BindingMethod(type = AdapterView.class, attribute = "android:onItemLongClick", method = "setOnItemLongClickListener"),
})
+@InverseBindingMethods({
+ @InverseBindingMethod(type = AbsListView.class, attribute = "android:selectedItemPosition"),
+})
public class AdapterViewBindingAdapter {
- @BindingAdapter(value = {"android:onItemSelected", "android:onNothingSelected"},
- requireAll = false)
+ @BindingAdapter("android:selectedItemPosition")
+ public static void setSelectedItemPosition(AdapterView view, int position) {
+ if (view.getSelectedItemPosition() != position) {
+ view.setSelection(position);
+ }
+ }
+
+ @BindingAdapter(value = {"android:onItemSelected", "android:onNothingSelected",
+ "android:selectedItemPositionAttrChanged"}, requireAll = false)
public static void setOnItemSelectedListener(AdapterView view, final OnItemSelected selected,
- final OnNothingSelected nothingSelected) {
- if (selected == null && nothingSelected == null) {
+ final OnNothingSelected nothingSelected, final InverseBindingListener attrChanged) {
+ if (selected == null && nothingSelected == null && attrChanged == null) {
view.setOnItemSelectedListener(null);
} else {
view.setOnItemSelectedListener(
- new OnItemSelectedComponentListener(selected, nothingSelected));
+ new OnItemSelectedComponentListener(selected, nothingSelected, attrChanged));
}
}
public static class OnItemSelectedComponentListener implements OnItemSelectedListener {
private final OnItemSelected mSelected;
private final OnNothingSelected mNothingSelected;
+ private final InverseBindingListener mAttrChanged;
public OnItemSelectedComponentListener(OnItemSelected selected,
- OnNothingSelected nothingSelected) {
+ OnNothingSelected nothingSelected, InverseBindingListener attrChanged) {
this.mSelected = selected;
this.mNothingSelected = nothingSelected;
+ this.mAttrChanged = attrChanged;
}
+
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if (mSelected != null) {
mSelected.onItemSelected(parent, view, position, id);
}
+ if (mAttrChanged != null) {
+ mAttrChanged.onChange();
+ }
}
@Override
@@ -61,6 +81,9 @@ public class AdapterViewBindingAdapter {
if (mNothingSelected != null) {
mNothingSelected.onNothingSelected(parent);
}
+ if (mAttrChanged != null) {
+ mAttrChanged.onChange();
+ }
}
}
diff --git a/extensions/baseAdapters/src/main/java/android/databinding/adapters/AutoCompleteTextViewBindingAdapter.java b/extensions/baseAdapters/src/main/java/android/databinding/adapters/AutoCompleteTextViewBindingAdapter.java
index 40299c84..ebcd1182 100644
--- a/extensions/baseAdapters/src/main/java/android/databinding/adapters/AutoCompleteTextViewBindingAdapter.java
+++ b/extensions/baseAdapters/src/main/java/android/databinding/adapters/AutoCompleteTextViewBindingAdapter.java
@@ -68,7 +68,7 @@ public class AutoCompleteTextViewBindingAdapter {
view.setOnItemSelectedListener(null);
} else {
view.setOnItemSelectedListener(
- new OnItemSelectedComponentListener(selected, nothingSelected));
+ new OnItemSelectedComponentListener(selected, nothingSelected, null));
}
}
diff --git a/extensions/baseAdapters/src/main/java/android/databinding/adapters/CalendarViewBindingAdapter.java b/extensions/baseAdapters/src/main/java/android/databinding/adapters/CalendarViewBindingAdapter.java
index fc7fb2f5..f17fd7d9 100644
--- a/extensions/baseAdapters/src/main/java/android/databinding/adapters/CalendarViewBindingAdapter.java
+++ b/extensions/baseAdapters/src/main/java/android/databinding/adapters/CalendarViewBindingAdapter.java
@@ -15,12 +15,41 @@
*/
package android.databinding.adapters;
-import android.databinding.BindingMethod;
-import android.databinding.BindingMethods;
+import android.databinding.BindingAdapter;
+import android.databinding.InverseBindingListener;
+import android.databinding.InverseBindingMethod;
+import android.databinding.InverseBindingMethods;
import android.widget.CalendarView;
+import android.widget.CalendarView.OnDateChangeListener;
-@BindingMethods({
- @BindingMethod(type = CalendarView.class, attribute = "android:onSelectedDayChange", method = "setOnDateChangeListener"),
+@InverseBindingMethods({
+ @InverseBindingMethod(type = CalendarView.class, attribute = "android:date"),
})
public class CalendarViewBindingAdapter {
+ @BindingAdapter("android:date")
+ public static void setDate(CalendarView view, long date) {
+ if (view.getDate() != date) {
+ view.setDate(date);
+ }
+ }
+
+ @BindingAdapter(value = {"android:onSelectedDayChange", "android:dateAttrChanged"},
+ requireAll = false)
+ public static void setListeners(CalendarView view, final OnDateChangeListener onDayChange,
+ final InverseBindingListener attrChange) {
+ if (attrChange == null) {
+ view.setOnDateChangeListener(onDayChange);
+ } else {
+ view.setOnDateChangeListener(new OnDateChangeListener() {
+ @Override
+ public void onSelectedDayChange(CalendarView view, int year, int month,
+ int dayOfMonth) {
+ if (onDayChange != null) {
+ onDayChange.onSelectedDayChange(view, year, month, dayOfMonth);
+ }
+ attrChange.onChange();
+ }
+ });
+ }
+ }
}
diff --git a/extensions/baseAdapters/src/main/java/android/databinding/adapters/CompoundButtonBindingAdapter.java b/extensions/baseAdapters/src/main/java/android/databinding/adapters/CompoundButtonBindingAdapter.java
index 3859019d..15c5d00a 100644
--- a/extensions/baseAdapters/src/main/java/android/databinding/adapters/CompoundButtonBindingAdapter.java
+++ b/extensions/baseAdapters/src/main/java/android/databinding/adapters/CompoundButtonBindingAdapter.java
@@ -18,6 +18,9 @@ package android.databinding.adapters;
import android.databinding.BindingAdapter;
import android.databinding.BindingMethod;
import android.databinding.BindingMethods;
+import android.databinding.InverseBindingListener;
+import android.databinding.InverseBindingMethod;
+import android.databinding.InverseBindingMethods;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
@@ -25,5 +28,35 @@ import android.widget.CompoundButton.OnCheckedChangeListener;
@BindingMethod(type = CompoundButton.class, attribute = "android:buttonTint", method = "setButtonTintList"),
@BindingMethod(type = CompoundButton.class, attribute = "android:onCheckedChanged", method = "setOnCheckedChangeListener"),
})
+@InverseBindingMethods({
+ @InverseBindingMethod(type = CompoundButton.class, attribute = "android:checked"),
+})
public class CompoundButtonBindingAdapter {
+
+ @BindingAdapter("android:checked")
+ public static void setChecked(CompoundButton view, boolean checked) {
+ if (view.isChecked() != checked) {
+ view.setChecked(checked);
+ }
+ }
+
+ @BindingAdapter(value = {"android:onCheckedChanged", "android:checkedAttrChanged"},
+ requireAll = false)
+ public static void setListeners(CompoundButton view, final OnCheckedChangeListener listener,
+ final InverseBindingListener attrChange) {
+ if (attrChange == null) {
+ view.setOnCheckedChangeListener(listener);
+ } else {
+ view.setOnCheckedChangeListener(new OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
+ if (listener != null) {
+ listener.onCheckedChanged(buttonView, isChecked);
+ }
+ attrChange.onChange();
+ }
+ });
+ }
+ }
+
}
diff --git a/extensions/baseAdapters/src/main/java/android/databinding/adapters/DatePickerBindingAdapter.java b/extensions/baseAdapters/src/main/java/android/databinding/adapters/DatePickerBindingAdapter.java
new file mode 100644
index 00000000..abf345d5
--- /dev/null
+++ b/extensions/baseAdapters/src/main/java/android/databinding/adapters/DatePickerBindingAdapter.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.databinding.adapters;
+
+import android.databinding.BindingAdapter;
+import android.databinding.InverseBindingListener;
+import android.databinding.InverseBindingMethod;
+import android.databinding.InverseBindingMethods;
+import android.widget.DatePicker;
+import android.widget.DatePicker.OnDateChangedListener;
+import com.android.databinding.library.baseAdapters.R;
+
+@InverseBindingMethods({
+ @InverseBindingMethod(type = DatePicker.class, attribute = "android:year"),
+ @InverseBindingMethod(type = DatePicker.class, attribute = "android:month"),
+ @InverseBindingMethod(type = DatePicker.class, attribute = "android:day", method = "getDayOfMonth"),
+})
+public class DatePickerBindingAdapter {
+ @BindingAdapter(value = {"android:year", "android:month", "android:day",
+ "android:onDateChanged", "android:yearAttrChanged",
+ "android:monthAttrChanged", "android:dayAttrChanged"}, requireAll = false)
+ public static void setListeners(DatePicker view, int year, int month, int day,
+ final OnDateChangedListener listener, final InverseBindingListener yearChanged,
+ final InverseBindingListener monthChanged, final InverseBindingListener dayChanged) {
+ if (year == 0) {
+ year = view.getYear();
+ }
+ if (day == 0) {
+ day = view.getDayOfMonth();
+ }
+ if (yearChanged == null && monthChanged == null && dayChanged == null) {
+ view.init(year, month, day, listener);
+ } else {
+ DateChangedListener oldListener = ListenerUtil.getListener(view, R.id.onDateChanged);
+ if (oldListener == null) {
+ oldListener = new DateChangedListener();
+ ListenerUtil.trackListener(view, oldListener, R.id.onDateChanged);
+ }
+ oldListener.setListeners(listener, yearChanged, monthChanged, dayChanged);
+ view.init(year, month, day, oldListener);
+ }
+ }
+
+ private static class DateChangedListener implements OnDateChangedListener {
+ OnDateChangedListener mListener;
+ InverseBindingListener mYearChanged;
+ InverseBindingListener mMonthChanged;
+ InverseBindingListener mDayChanged;
+
+ public void setListeners(OnDateChangedListener listener, InverseBindingListener yearChanged,
+ InverseBindingListener monthChanged, InverseBindingListener dayChanged) {
+ mListener = listener;
+ mYearChanged = yearChanged;
+ mMonthChanged = monthChanged;
+ mDayChanged = dayChanged;
+ }
+
+ @Override
+ public void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
+ if (mListener != null) {
+ mListener.onDateChanged(view, year, monthOfYear, dayOfMonth);
+ }
+ if (mYearChanged != null) {
+ mYearChanged.onChange();
+ }
+ if (mMonthChanged != null) {
+ mMonthChanged.onChange();
+ }
+ if (mDayChanged != null) {
+ mDayChanged.onChange();
+ }
+ }
+ }
+}
diff --git a/extensions/baseAdapters/src/main/java/android/databinding/adapters/ListenerUtil.java b/extensions/baseAdapters/src/main/java/android/databinding/adapters/ListenerUtil.java
index 67ae1727..6869cdba 100644
--- a/extensions/baseAdapters/src/main/java/android/databinding/adapters/ListenerUtil.java
+++ b/extensions/baseAdapters/src/main/java/android/databinding/adapters/ListenerUtil.java
@@ -79,4 +79,31 @@ public class ListenerUtil {
}
}
+ /**
+ * Returns the previous value for a listener if one was stored previously with
+ * {@link #trackListener(View, Object, int)}
+ * @param view The View to check for a listener previously stored with
+ * {@link #trackListener(View, Object, int)}
+ * @param listenerResourceId A unique resource ID associated with the listener type.
+ * @return The previously tracked listener. This will be null if the View did not have
+ * a previously-tracked listener.
+ */
+ public static <T> T getListener(View view, int listenerResourceId) {
+ if (VERSION.SDK_INT >= VERSION_CODES.ICE_CREAM_SANDWICH) {
+ return (T) view.getTag(listenerResourceId);
+ } else {
+ synchronized (sListeners) {
+ WeakHashMap<View, WeakReference<?>> listeners = sListeners.get(listenerResourceId);
+ if (listeners == null) {
+ return null;
+ }
+ final WeakReference<T> oldValue = (WeakReference<T>) listeners.get(view);
+ if (oldValue == null) {
+ return null;
+ } else {
+ return oldValue.get();
+ }
+ }
+ }
+ }
}
diff --git a/extensions/baseAdapters/src/main/java/android/databinding/adapters/NumberPickerBindingAdapter.java b/extensions/baseAdapters/src/main/java/android/databinding/adapters/NumberPickerBindingAdapter.java
index 17e53cdc..612b3203 100644
--- a/extensions/baseAdapters/src/main/java/android/databinding/adapters/NumberPickerBindingAdapter.java
+++ b/extensions/baseAdapters/src/main/java/android/databinding/adapters/NumberPickerBindingAdapter.java
@@ -15,14 +15,49 @@
*/
package android.databinding.adapters;
+import android.databinding.BindingAdapter;
import android.databinding.BindingMethod;
import android.databinding.BindingMethods;
+import android.databinding.InverseBindingListener;
+import android.databinding.InverseBindingMethod;
+import android.databinding.InverseBindingMethods;
+import android.widget.CompoundButton;
+import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.NumberPicker;
+import android.widget.NumberPicker.OnValueChangeListener;
@BindingMethods({
@BindingMethod(type = NumberPicker.class, attribute = "android:format", method = "setFormatter"),
@BindingMethod(type = NumberPicker.class, attribute = "android:onScrollStateChange", method = "setOnScrollListener"),
- @BindingMethod(type = NumberPicker.class, attribute = "android:onValueChange", method = "setOnValueChangedListener"),
+})
+@InverseBindingMethods({
+ @InverseBindingMethod(type = NumberPicker.class, attribute = "android:value"),
})
public class NumberPickerBindingAdapter {
+
+ @BindingAdapter("android:value")
+ public static void setValue(NumberPicker view, int value) {
+ if (view.getValue() != value) {
+ view.setValue(value);
+ }
+ }
+
+ @BindingAdapter(value = {"android:onValueChange", "android:valueAttrChanged"},
+ requireAll = false)
+ public static void setListeners(NumberPicker view, final OnValueChangeListener listener,
+ final InverseBindingListener attrChange) {
+ if (attrChange == null) {
+ view.setOnValueChangedListener(listener);
+ } else {
+ view.setOnValueChangedListener(new OnValueChangeListener() {
+ @Override
+ public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
+ if (listener != null) {
+ listener.onValueChange(picker, oldVal, newVal);
+ }
+ attrChange.onChange();
+ }
+ });
+ }
+ }
}
diff --git a/extensions/baseAdapters/src/main/java/android/databinding/adapters/RadioGroupBindingAdapter.java b/extensions/baseAdapters/src/main/java/android/databinding/adapters/RadioGroupBindingAdapter.java
index af9f0425..a84a691f 100644
--- a/extensions/baseAdapters/src/main/java/android/databinding/adapters/RadioGroupBindingAdapter.java
+++ b/extensions/baseAdapters/src/main/java/android/databinding/adapters/RadioGroupBindingAdapter.java
@@ -15,13 +15,41 @@
*/
package android.databinding.adapters;
-import android.databinding.BindingMethod;
-import android.databinding.BindingMethods;
+import android.databinding.BindingAdapter;
+import android.databinding.InverseBindingListener;
+import android.databinding.InverseBindingMethod;
+import android.databinding.InverseBindingMethods;
import android.widget.RadioGroup;
+import android.widget.RadioGroup.OnCheckedChangeListener;
-@BindingMethods({
- @BindingMethod(type = RadioGroup.class, attribute = "android:checkedButton", method = "check"),
- @BindingMethod(type = RadioGroup.class, attribute = "android:onCheckedChanged", method = "setOnCheckedChangeListener"),
+@InverseBindingMethods({
+ @InverseBindingMethod(type = RadioGroup.class, attribute = "android:checkedButton", method = "getCheckedRadioButtonId"),
})
public class RadioGroupBindingAdapter {
+ @BindingAdapter("android:checkedButton")
+ public static void setCheckedButton(RadioGroup view, int id) {
+ if (id != view.getCheckedRadioButtonId()) {
+ view.check(id);
+ }
+ }
+
+ @BindingAdapter(value = {"android:onCheckedChanged", "android:checkedButtonAttrChanged"},
+ requireAll = false)
+ public static void setListeners(RadioGroup view, final OnCheckedChangeListener listener,
+ final InverseBindingListener attrChange) {
+ if (attrChange == null) {
+ view.setOnCheckedChangeListener(listener);
+ } else {
+ view.setOnCheckedChangeListener(new OnCheckedChangeListener() {
+ @Override
+ public void onCheckedChanged(RadioGroup group, int checkedId) {
+ if (listener != null) {
+ listener.onCheckedChanged(group, checkedId);
+ }
+
+ attrChange.onChange();
+ }
+ });
+ }
+ }
}
diff --git a/extensions/baseAdapters/src/main/java/android/databinding/adapters/RatingBarBindingAdapter.java b/extensions/baseAdapters/src/main/java/android/databinding/adapters/RatingBarBindingAdapter.java
index 5e49c72d..4896df08 100644
--- a/extensions/baseAdapters/src/main/java/android/databinding/adapters/RatingBarBindingAdapter.java
+++ b/extensions/baseAdapters/src/main/java/android/databinding/adapters/RatingBarBindingAdapter.java
@@ -15,12 +15,40 @@
*/
package android.databinding.adapters;
-import android.databinding.BindingMethod;
-import android.databinding.BindingMethods;
+import android.databinding.BindingAdapter;
+import android.databinding.InverseBindingListener;
+import android.databinding.InverseBindingMethod;
+import android.databinding.InverseBindingMethods;
import android.widget.RatingBar;
+import android.widget.RatingBar.OnRatingBarChangeListener;
-@BindingMethods({
- @BindingMethod(type = RatingBar.class, attribute = "android:onRatingChanged", method = "setOnRatingBarChangeListener"),
+@InverseBindingMethods({
+ @InverseBindingMethod(type = RatingBar.class, attribute = "android:rating"),
})
public class RatingBarBindingAdapter {
+ @BindingAdapter("android:rating")
+ public static void setRating(RatingBar view, float rating) {
+ if (view.getRating() != rating) {
+ view.setRating(rating);
+ }
+ }
+
+ @BindingAdapter(value = {"android:onRatingChanged", "android:ratingAttrChanged"},
+ requireAll = false)
+ public static void setListeners(RatingBar view, final OnRatingBarChangeListener listener,
+ final InverseBindingListener ratingChange) {
+ if (ratingChange == null) {
+ view.setOnRatingBarChangeListener(listener);
+ } else {
+ view.setOnRatingBarChangeListener(new OnRatingBarChangeListener() {
+ @Override
+ public void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {
+ if (listener != null) {
+ listener.onRatingChanged(ratingBar, rating, fromUser);
+ }
+ ratingChange.onChange();
+ }
+ });
+ }
+ }
}
diff --git a/extensions/baseAdapters/src/main/java/android/databinding/adapters/SeekBarBindingAdapter.java b/extensions/baseAdapters/src/main/java/android/databinding/adapters/SeekBarBindingAdapter.java
index 85a7a385..625c0372 100644
--- a/extensions/baseAdapters/src/main/java/android/databinding/adapters/SeekBarBindingAdapter.java
+++ b/extensions/baseAdapters/src/main/java/android/databinding/adapters/SeekBarBindingAdapter.java
@@ -16,15 +16,30 @@
package android.databinding.adapters;
import android.databinding.BindingAdapter;
+import android.databinding.InverseBindingListener;
+import android.databinding.InverseBindingMethod;
+import android.databinding.InverseBindingMethods;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
+@InverseBindingMethods({
+ @InverseBindingMethod(type = SeekBar.class, attribute = "android:progress"),
+})
public class SeekBarBindingAdapter {
+
+ @BindingAdapter("android:progress")
+ public static void setProgress(SeekBar view, int progress) {
+ if (progress != view.getProgress()) {
+ view.setProgress(progress);
+ }
+ }
+
@BindingAdapter(value = {"android:onStartTrackingTouch", "android:onStopTrackingTouch",
- "android:onProgressChanged"}, requireAll = false)
+ "android:onProgressChanged", "android:progressAttrChanged"}, requireAll = false)
public static void setOnSeekBarChangeListener(SeekBar view, final OnStartTrackingTouch start,
- final OnStopTrackingTouch stop, final OnProgressChanged progressChanged) {
- if (start == null && stop == null && progressChanged == null) {
+ final OnStopTrackingTouch stop, final OnProgressChanged progressChanged,
+ final InverseBindingListener attrChanged) {
+ if (start == null && stop == null && progressChanged == null && attrChanged == null) {
view.setOnSeekBarChangeListener(null);
} else {
view.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@@ -33,6 +48,9 @@ public class SeekBarBindingAdapter {
if (progressChanged != null) {
progressChanged.onProgressChanged(seekBar, progress, fromUser);
}
+ if (attrChanged != null) {
+ attrChanged.onChange();
+ }
}
@Override
diff --git a/extensions/baseAdapters/src/main/java/android/databinding/adapters/TabHostBindingAdapter.java b/extensions/baseAdapters/src/main/java/android/databinding/adapters/TabHostBindingAdapter.java
index 78f06b0d..151a7110 100644
--- a/extensions/baseAdapters/src/main/java/android/databinding/adapters/TabHostBindingAdapter.java
+++ b/extensions/baseAdapters/src/main/java/android/databinding/adapters/TabHostBindingAdapter.java
@@ -15,12 +15,54 @@
*/
package android.databinding.adapters;
-import android.databinding.BindingMethod;
-import android.databinding.BindingMethods;
+import android.databinding.BindingAdapter;
+import android.databinding.InverseBindingAdapter;
+import android.databinding.InverseBindingListener;
import android.widget.TabHost;
+import android.widget.TabHost.OnTabChangeListener;
-@BindingMethods({
- @BindingMethod(type = TabHost.class, attribute = "android:onTabChanged", method = "setOnTabChangedListener"),
-})
public class TabHostBindingAdapter {
+
+ @InverseBindingAdapter(attribute = "android:currentTab")
+ public static int getCurrentTab(TabHost view) {
+ return view.getCurrentTab();
+ }
+
+ @InverseBindingAdapter(attribute = "android:currentTab")
+ public static String getCurrentTabTag(TabHost view) {
+ return view.getCurrentTabTag();
+ }
+
+ @BindingAdapter("android:currentTab")
+ public static void setCurrentTab(TabHost view, int tab) {
+ if (view.getCurrentTab() != tab) {
+ view.setCurrentTab(tab);
+ }
+ }
+
+ @BindingAdapter("android:currentTab")
+ public static void setCurrentTabTag(TabHost view, String tabTag) {
+ if (view.getCurrentTabTag() != tabTag) {
+ view.setCurrentTabByTag(tabTag);
+ }
+ }
+
+ @BindingAdapter(value = {"android:onTabChanged", "android:currentTabAttrChanged"},
+ requireAll = false)
+ public static void setListeners(TabHost view, final OnTabChangeListener listener,
+ final InverseBindingListener attrChange) {
+ if (attrChange == null) {
+ view.setOnTabChangedListener(listener);
+ } else {
+ view.setOnTabChangedListener(new OnTabChangeListener() {
+ @Override
+ public void onTabChanged(String tabId) {
+ if (listener != null) {
+ listener.onTabChanged(tabId);
+ }
+ attrChange.onChange();
+ }
+ });
+ }
+ }
}
diff --git a/extensions/baseAdapters/src/main/java/android/databinding/adapters/TextViewBindingAdapter.java b/extensions/baseAdapters/src/main/java/android/databinding/adapters/TextViewBindingAdapter.java
index 41ae1520..2d3bebb4 100644
--- a/extensions/baseAdapters/src/main/java/android/databinding/adapters/TextViewBindingAdapter.java
+++ b/extensions/baseAdapters/src/main/java/android/databinding/adapters/TextViewBindingAdapter.java
@@ -15,14 +15,21 @@
*/
package android.databinding.adapters;
+import com.android.databinding.library.baseAdapters.R;
+
import android.databinding.BindingAdapter;
import android.databinding.BindingMethod;
import android.databinding.BindingMethods;
+import android.databinding.InverseBindingAdapter;
+import android.databinding.InverseBindingListener;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.text.Editable;
import android.text.InputFilter;
import android.text.InputType;
+import android.text.Spanned;
+import android.text.SpannableString;
+import android.text.SpannableStringBuilder;
import android.text.TextWatcher;
import android.text.method.DialerKeyListener;
import android.text.method.DigitsKeyListener;
@@ -33,8 +40,6 @@ import android.util.Log;
import android.util.TypedValue;
import android.widget.TextView;
-import com.android.databinding.library.baseAdapters.R;
-
@BindingMethods({
@BindingMethod(type = TextView.class, attribute = "android:autoLink", method = "setAutoLinkMask"),
@BindingMethod(type = TextView.class, attribute = "android:drawablePadding", method = "setCompoundDrawablePadding"),
@@ -50,13 +55,31 @@ import com.android.databinding.library.baseAdapters.R;
public class TextViewBindingAdapter {
private static final String TAG = "TextViewBindingAdapters";
-
public static final int INTEGER = 0x01;
-
public static final int SIGNED = 0x03;
-
public static final int DECIMAL = 0x05;
+ @BindingAdapter("android:text")
+ public static void setText(TextView view, CharSequence text) {
+ final CharSequence oldText = view.getText();
+ if (text == oldText || (text == null && oldText.length() == 0)) {
+ return;
+ }
+ if (text instanceof Spanned) {
+ if (text.equals(oldText)) {
+ return; // No change in the spans, so don't set anything.
+ }
+ } else if (!haveContentsChanged(text, oldText)) {
+ return; // No content changes, so don't set anything.
+ }
+ view.setText(text);
+ }
+
+ @InverseBindingAdapter(attribute = "android:text", event = "android:textAttrChanged")
+ public static String getTextString(TextView view) {
+ return view.getText().toString();
+ }
+
@BindingAdapter({"android:autoText"})
public static void setAutoText(TextView view, boolean autoText) {
KeyListener listener = view.getKeyListener();
@@ -300,12 +323,31 @@ public class TextViewBindingAdapter {
view.setTextSize(TypedValue.COMPLEX_UNIT_PX, size);
}
+ private static boolean haveContentsChanged(CharSequence str1, CharSequence str2) {
+ if ((str1 == null) != (str2 == null)) {
+ return true;
+ } else if (str1 == null) {
+ return false;
+ }
+ final int length = str1.length();
+ if (length != str2.length()) {
+ return true;
+ }
+ for (int i = 0; i < length; i++) {
+ if (str1.charAt(i) != str2.charAt(i)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
@BindingAdapter(value = {"android:beforeTextChanged", "android:onTextChanged",
- "android:afterTextChanged"}, requireAll = false)
+ "android:afterTextChanged", "android:textAttrChanged"}, requireAll = false)
public static void setTextWatcher(TextView view, final BeforeTextChanged before,
- final OnTextChanged on, final AfterTextChanged after) {
+ final OnTextChanged on, final AfterTextChanged after,
+ final InverseBindingListener textAttrChanged) {
final TextWatcher newValue;
- if (before == null && after == null && on == null) {
+ if (before == null && after == null && on == null && textAttrChanged == null) {
newValue = null;
} else {
newValue = new TextWatcher() {
@@ -321,6 +363,9 @@ public class TextViewBindingAdapter {
if (on != null) {
on.onTextChanged(s, start, before, count);
}
+ if (textAttrChanged != null) {
+ textAttrChanged.onChange();
+ }
}
@Override
diff --git a/extensions/baseAdapters/src/main/java/android/databinding/adapters/TimePickerBindingAdapter.java b/extensions/baseAdapters/src/main/java/android/databinding/adapters/TimePickerBindingAdapter.java
index 3a11dab9..803342dc 100644
--- a/extensions/baseAdapters/src/main/java/android/databinding/adapters/TimePickerBindingAdapter.java
+++ b/extensions/baseAdapters/src/main/java/android/databinding/adapters/TimePickerBindingAdapter.java
@@ -15,12 +15,95 @@
*/
package android.databinding.adapters;
-import android.databinding.BindingMethod;
-import android.databinding.BindingMethods;
+import android.databinding.BindingAdapter;
+import android.databinding.InverseBindingAdapter;
+import android.databinding.InverseBindingListener;
+import android.os.Build.VERSION;
+import android.os.Build.VERSION_CODES;
import android.widget.TimePicker;
+import android.widget.TimePicker.OnTimeChangedListener;
-@BindingMethods({
- @BindingMethod(type = TimePicker.class, attribute = "android:onTimeChanged", method = "setOnTimeChangedListener"),
-})
public class TimePickerBindingAdapter {
+
+ @SuppressWarnings("deprecation")
+ @BindingAdapter("android:hour")
+ public static void setHour(TimePicker view, int hour) {
+ if (VERSION.SDK_INT >= VERSION_CODES.M) {
+ if (view.getHour() != hour) {
+ view.setHour(hour);
+ }
+ } else {
+ if (view.getCurrentHour() != hour) {
+ view.setCurrentHour(hour);
+ }
+ }
+ }
+
+ @SuppressWarnings("deprecation")
+ @BindingAdapter("android:minute")
+ public static void setMinute(TimePicker view, int minute) {
+ if (VERSION.SDK_INT >= VERSION_CODES.M) {
+ if (view.getMinute() != minute) {
+ view.setMinute(minute);
+ }
+ } else {
+ if (view.getCurrentMinute() != minute) {
+ view.setCurrentHour(minute);
+ }
+ }
+ }
+
+ @InverseBindingAdapter(attribute = "android:hour")
+ public static int getHour(TimePicker view) {
+ if (VERSION.SDK_INT >= VERSION_CODES.M) {
+ return view.getHour();
+ } else {
+ @SuppressWarnings("deprecation")
+ Integer hour = view.getCurrentHour();
+ if (hour == null) {
+ return 0;
+ } else {
+ return hour;
+ }
+ }
+ }
+
+ @InverseBindingAdapter(attribute = "android:minute")
+ public static int getMinute(TimePicker view) {
+ if (VERSION.SDK_INT >= VERSION_CODES.M) {
+ return view.getMinute();
+ } else {
+ @SuppressWarnings("deprecation")
+ Integer minute = view.getCurrentMinute();
+ if (minute == null) {
+ return 0;
+ } else {
+ return minute;
+ }
+ }
+ }
+
+ @BindingAdapter(value = {"android:onTimeChanged", "android:hourAttrChanged",
+ "android:minuteAttrChanged"}, requireAll = false)
+ public static void setListeners(TimePicker view, final OnTimeChangedListener listener,
+ final InverseBindingListener hourChange, final InverseBindingListener minuteChange) {
+ if (hourChange == null && minuteChange == null) {
+ view.setOnTimeChangedListener(listener);
+ } else {
+ view.setOnTimeChangedListener(new OnTimeChangedListener() {
+ @Override
+ public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
+ if (listener != null) {
+ listener.onTimeChanged(view, hourOfDay, minute);
+ }
+ if (hourChange != null) {
+ hourChange.onChange();
+ }
+ if (minuteChange != null) {
+ minuteChange.onChange();
+ }
+ }
+ });
+ }
+ }
}
diff --git a/extensions/baseAdapters/src/main/res/values/ids.xml b/extensions/baseAdapters/src/main/res/values/ids.xml
index 7e76dbe4..3383fb58 100644
--- a/extensions/baseAdapters/src/main/res/values/ids.xml
+++ b/extensions/baseAdapters/src/main/res/values/ids.xml
@@ -4,4 +4,6 @@
<item type="id" name="onAttachStateChangeListener"/>
<!-- Used to track TextWatcher for TextView BindingAdapter -->
<item type="id" name="textWatcher"/>
+ <!-- Used to track DatePicker OnDateChanged BindingAdapter -->
+ <item type="id" name="onDateChanged"/>
</resources> \ No newline at end of file
diff --git a/extensions/library/src/main/java/android/databinding/ViewDataBinding.java b/extensions/library/src/main/java/android/databinding/ViewDataBinding.java
index 2dacd1e9..5e760237 100644
--- a/extensions/library/src/main/java/android/databinding/ViewDataBinding.java
+++ b/extensions/library/src/main/java/android/databinding/ViewDataBinding.java
@@ -16,8 +16,6 @@
package android.databinding;
-import com.android.databinding.library.R;
-
import android.annotation.TargetApi;
import android.content.res.ColorStateList;
import android.databinding.CallbackRegistry.NotifierCallback;
@@ -27,15 +25,22 @@ import android.os.Build.VERSION_CODES;
import android.os.Handler;
import android.os.Looper;
import android.text.TextUtils;
+import android.util.LongSparseArray;
+import android.util.SparseArray;
+import android.util.SparseBooleanArray;
import android.util.SparseIntArray;
+import android.util.SparseLongArray;
import android.view.Choreographer;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnAttachStateChangeListener;
import android.view.ViewGroup;
+import com.android.databinding.library.R;
+
import java.lang.ref.WeakReference;
import java.util.List;
+import java.util.Map;
/**
* Base class for generated data binding classes. If possible, the generated binding should
@@ -43,7 +48,7 @@ import java.util.List;
* binding is unknown, {@link DataBindingUtil#bind(View)} or
* {@link DataBindingUtil#inflate(LayoutInflater, int, ViewGroup, boolean)} should be used.
*/
-public abstract class ViewDataBinding {
+public abstract class ViewDataBinding extends BaseObservable {
/**
* Instead of directly accessing Build.VERSION.SDK_INT, generated code uses this value so that
@@ -565,6 +570,15 @@ public abstract class ViewDataBinding {
}
/** @hide */
+ protected int getColorFromResource(int resourceId) {
+ if (VERSION.SDK_INT >= VERSION_CODES.M) {
+ return getRoot().getContext().getColor(resourceId);
+ } else {
+ return getRoot().getResources().getColor(resourceId);
+ }
+ }
+
+ /** @hide */
protected ColorStateList getColorStateListFromResource(int resourceId) {
if (VERSION.SDK_INT >= VERSION_CODES.M) {
return getRoot().getContext().getColorStateList(resourceId);
@@ -584,84 +598,295 @@ public abstract class ViewDataBinding {
/** @hide */
protected static <T> T getFromArray(T[] arr, int index) {
- if (index < 0 || index >= arr.length) {
+ if (arr == null || index < 0 || index >= arr.length) {
return null;
}
return arr[index];
}
/** @hide */
+ protected static <T> void setTo(T[] arr, int index, T value) {
+ if (arr == null || index < 0 || index >= arr.length) {
+ return;
+ }
+ arr[index] = value;
+ }
+
+ /** @hide */
protected static boolean getFromArray(boolean[] arr, int index) {
- if (index < 0 || index >= arr.length) {
+ if (arr == null || index < 0 || index >= arr.length) {
return false;
}
return arr[index];
}
/** @hide */
+ protected static void setTo(boolean[] arr, int index, boolean value) {
+ if (arr == null || index < 0 || index >= arr.length) {
+ return;
+ }
+ arr[index] = value;
+ }
+
+ /** @hide */
protected static byte getFromArray(byte[] arr, int index) {
- if (index < 0 || index >= arr.length) {
+ if (arr == null || index < 0 || index >= arr.length) {
return 0;
}
return arr[index];
}
/** @hide */
+ protected static void setTo(byte[] arr, int index, byte value) {
+ if (arr == null || index < 0 || index >= arr.length) {
+ return;
+ }
+ arr[index] = value;
+ }
+
+ /** @hide */
protected static short getFromArray(short[] arr, int index) {
- if (index < 0 || index >= arr.length) {
+ if (arr == null || index < 0 || index >= arr.length) {
return 0;
}
return arr[index];
}
/** @hide */
+ protected static void setTo(short[] arr, int index, short value) {
+ if (arr == null || index < 0 || index >= arr.length) {
+ return;
+ }
+ arr[index] = value;
+ }
+
+ /** @hide */
protected static char getFromArray(char[] arr, int index) {
- if (index < 0 || index >= arr.length) {
+ if (arr == null || index < 0 || index >= arr.length) {
return 0;
}
return arr[index];
}
/** @hide */
+ protected static void setTo(char[] arr, int index, char value) {
+ if (arr == null || index < 0 || index >= arr.length) {
+ return;
+ }
+ arr[index] = value;
+ }
+
+ /** @hide */
protected static int getFromArray(int[] arr, int index) {
- if (index < 0 || index >= arr.length) {
+ if (arr == null || index < 0 || index >= arr.length) {
return 0;
}
return arr[index];
}
/** @hide */
+ protected static void setTo(int[] arr, int index, int value) {
+ if (arr == null || index < 0 || index >= arr.length) {
+ return;
+ }
+ arr[index] = value;
+ }
+
+ /** @hide */
protected static long getFromArray(long[] arr, int index) {
- if (index < 0 || index >= arr.length) {
+ if (arr == null || index < 0 || index >= arr.length) {
return 0;
}
return arr[index];
}
/** @hide */
+ protected static void setTo(long[] arr, int index, long value) {
+ if (arr == null || index < 0 || index >= arr.length) {
+ return;
+ }
+ arr[index] = value;
+ }
+
+ /** @hide */
protected static float getFromArray(float[] arr, int index) {
- if (index < 0 || index >= arr.length) {
+ if (arr == null || index < 0 || index >= arr.length) {
return 0;
}
return arr[index];
}
/** @hide */
+ protected static void setTo(float[] arr, int index, float value) {
+ if (arr == null || index < 0 || index >= arr.length) {
+ return;
+ }
+ arr[index] = value;
+ }
+
+ /** @hide */
protected static double getFromArray(double[] arr, int index) {
- if (index < 0 || index >= arr.length) {
+ if (arr == null || index < 0 || index >= arr.length) {
return 0;
}
return arr[index];
}
/** @hide */
+ protected static void setTo(double[] arr, int index, double value) {
+ if (arr == null || index < 0 || index >= arr.length) {
+ return;
+ }
+ arr[index] = value;
+ }
+
+ /** @hide */
protected static <T> T getFromList(List<T> list, int index) {
- if (index < 0 || index >= list.size()) {
+ if (list == null || index < 0 || index >= list.size()) {
+ return null;
+ }
+ return list.get(index);
+ }
+
+ /** @hide */
+ protected static <T> void setTo(List<T> list, int index, T value) {
+ if (list == null || index < 0 || index >= list.size()) {
+ return;
+ }
+ list.set(index, value);
+ }
+
+ /** @hide */
+ protected static <T> T getFromList(SparseArray<T> list, int index) {
+ if (list == null || index < 0) {
+ return null;
+ }
+ return list.get(index);
+ }
+
+ /** @hide */
+ protected static <T> void setTo(SparseArray<T> list, int index, T value) {
+ if (list == null || index < 0 || index >= list.size()) {
+ return;
+ }
+ list.put(index, value);
+ }
+
+ /** @hide */
+ @TargetApi(VERSION_CODES.JELLY_BEAN)
+ protected static <T> T getFromList(LongSparseArray<T> list, int index) {
+ if (list == null || index < 0) {
return null;
}
return list.get(index);
}
+ /** @hide */
+ @TargetApi(VERSION_CODES.JELLY_BEAN)
+ protected static <T> void setTo(LongSparseArray<T> list, int index, T value) {
+ if (list == null || index < 0 || index >= list.size()) {
+ return;
+ }
+ list.put(index, value);
+ }
+
+ /** @hide */
+ protected static <T> T getFromList(android.support.v4.util.LongSparseArray<T> list, int index) {
+ if (list == null || index < 0) {
+ return null;
+ }
+ return list.get(index);
+ }
+
+ /** @hide */
+ protected static <T> void setTo(android.support.v4.util.LongSparseArray<T> list, int index,
+ T value) {
+ if (list == null || index < 0 || index >= list.size()) {
+ return;
+ }
+ list.put(index, value);
+ }
+
+ /** @hide */
+ protected static boolean getFromList(SparseBooleanArray list, int index) {
+ if (list == null || index < 0) {
+ return false;
+ }
+ return list.get(index);
+ }
+
+ /** @hide */
+ protected static void setTo(SparseBooleanArray list, int index, boolean value) {
+ if (list == null || index < 0 || index >= list.size()) {
+ return;
+ }
+ list.put(index, value);
+ }
+
+ /** @hide */
+ protected static int getFromList(SparseIntArray list, int index) {
+ if (list == null || index < 0) {
+ return 0;
+ }
+ return list.get(index);
+ }
+
+ /** @hide */
+ protected static void setTo(SparseIntArray list, int index, int value) {
+ if (list == null || index < 0 || index >= list.size()) {
+ return;
+ }
+ list.put(index, value);
+ }
+
+ /** @hide */
+ @TargetApi(VERSION_CODES.JELLY_BEAN_MR2)
+ protected static long getFromList(SparseLongArray list, int index) {
+ if (list == null || index < 0) {
+ return 0;
+ }
+ return list.get(index);
+ }
+
+ /** @hide */
+ @TargetApi(VERSION_CODES.JELLY_BEAN_MR2)
+ protected static void setTo(SparseLongArray list, int index, long value) {
+ if (list == null || index < 0 || index >= list.size()) {
+ return;
+ }
+ list.put(index, value);
+ }
+
+ /** @hide */
+ protected static <K, T> T getFrom(Map<K, T> map, K key) {
+ if (map == null) {
+ return null;
+ }
+ return map.get(key);
+ }
+
+ /** @hide */
+ protected static <K, T> void setTo(Map<K, T> map, K key, T value) {
+ if (map == null) {
+ return;
+ }
+ map.put(key, value);
+ }
+
+ /** @hide */
+ protected static void setBindingInverseListener(ViewDataBinding binder,
+ InverseBindingListener oldListener, PropertyChangedInverseListener listener) {
+ if (oldListener != listener) {
+ if (oldListener != null) {
+ binder.removeOnPropertyChangedCallback(
+ (PropertyChangedInverseListener) oldListener);
+ }
+ if (listener != null) {
+ binder.addOnPropertyChangedCallback(listener);
+ }
+ }
+ }
+
/**
* Walks the view hierarchy under roots and pulls out tagged Views, includes, and views with
* IDs into an Object[] that is returned. This is used to walk the view hierarchy once to find
@@ -1046,4 +1271,26 @@ public abstract class ViewDataBinding {
this.layoutIds[index] = layoutIds;
}
}
+
+ /**
+ * This class is used by generated subclasses of {@link ViewDataBinding} to listen for
+ * changes on variables of Bindings. This is important for two-way data binding on variables
+ * in included Bindings.
+ * @hide
+ */
+ protected static abstract class PropertyChangedInverseListener
+ extends Observable.OnPropertyChangedCallback implements InverseBindingListener {
+ final int mPropertyId;
+
+ public PropertyChangedInverseListener(int propertyId) {
+ mPropertyId = propertyId;
+ }
+
+ @Override
+ public void onPropertyChanged(Observable sender, int propertyId) {
+ if (propertyId == mPropertyId || propertyId == 0) {
+ onChange();
+ }
+ }
+ }
}
diff --git a/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1-javadoc.jar b/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1-javadoc.jar
new file mode 100644
index 00000000..741e5b68
--- /dev/null
+++ b/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1-javadoc.jar
Binary files differ
diff --git a/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1-javadoc.jar.md5 b/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1-javadoc.jar.md5
new file mode 100644
index 00000000..c4ad48cc
--- /dev/null
+++ b/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1-javadoc.jar.md5
@@ -0,0 +1 @@
+3102e4c3a8b533ecadf7a79f8cc0e6ed \ No newline at end of file
diff --git a/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1-javadoc.jar.sha1 b/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1-javadoc.jar.sha1
new file mode 100644
index 00000000..a8506d58
--- /dev/null
+++ b/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1-javadoc.jar.sha1
@@ -0,0 +1 @@
+96b2b1883d2ea46bfcc65c1e6addfda97814825f \ No newline at end of file
diff --git a/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1-sources.jar b/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1-sources.jar
new file mode 100644
index 00000000..a65eed35
--- /dev/null
+++ b/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1-sources.jar
Binary files differ
diff --git a/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1-sources.jar.md5 b/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1-sources.jar.md5
new file mode 100644
index 00000000..a1b3e169
--- /dev/null
+++ b/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1-sources.jar.md5
@@ -0,0 +1 @@
+d9447e86bde083ce29e475269f408094 \ No newline at end of file
diff --git a/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1-sources.jar.sha1 b/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1-sources.jar.sha1
new file mode 100644
index 00000000..4e30a011
--- /dev/null
+++ b/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1-sources.jar.sha1
@@ -0,0 +1 @@
+271f7d5792857458ee31eaafa2f00ab75ee68a27 \ No newline at end of file
diff --git a/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1.aar b/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1.aar
new file mode 100644
index 00000000..91ffc8e6
--- /dev/null
+++ b/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1.aar
Binary files differ
diff --git a/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1.aar.md5 b/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1.aar.md5
new file mode 100644
index 00000000..ed95514b
--- /dev/null
+++ b/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1.aar.md5
@@ -0,0 +1 @@
+63c9e012af57aacb15d1b998711077c0 \ No newline at end of file
diff --git a/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1.aar.sha1 b/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1.aar.sha1
new file mode 100644
index 00000000..07ea6786
--- /dev/null
+++ b/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1.aar.sha1
@@ -0,0 +1 @@
+110c163a806a7317374e98d9a8ab460e91c0d3d3 \ No newline at end of file
diff --git a/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1.pom b/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1.pom
new file mode 100644
index 00000000..c22b3865
--- /dev/null
+++ b/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1.pom
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.android.databinding</groupId>
+ <artifactId>adapters</artifactId>
+ <version>1.1</version>
+ <packaging>aar</packaging>
+ <licenses>
+ <license>
+ <name>The Apache Software License, Version 2.0</name>
+ <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+ <distribution>repo</distribution>
+ </license>
+ </licenses>
+ <dependencies>
+ <dependency>
+ <groupId>com.android.databinding</groupId>
+ <artifactId>library</artifactId>
+ <version>1.1</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.android.databinding</groupId>
+ <artifactId>baseLibrary</artifactId>
+ <version>1.1</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+</project>
diff --git a/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1.pom.md5 b/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1.pom.md5
new file mode 100644
index 00000000..d928121f
--- /dev/null
+++ b/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1.pom.md5
@@ -0,0 +1 @@
+7f884655cb412a87b69247d382edcf2e \ No newline at end of file
diff --git a/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1.pom.sha1 b/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1.pom.sha1
new file mode 100644
index 00000000..eb405181
--- /dev/null
+++ b/internal-prebuilts/com/android/databinding/adapters/1.1/adapters-1.1.pom.sha1
@@ -0,0 +1 @@
+bd7626a61823c5e1b5ea49a6315cac64c016c220 \ No newline at end of file
diff --git a/internal-prebuilts/com/android/databinding/adapters/maven-metadata.xml b/internal-prebuilts/com/android/databinding/adapters/maven-metadata.xml
index 2c796181..da35a082 100644
--- a/internal-prebuilts/com/android/databinding/adapters/maven-metadata.xml
+++ b/internal-prebuilts/com/android/databinding/adapters/maven-metadata.xml
@@ -2,11 +2,12 @@
<metadata>
<groupId>com.android.databinding</groupId>
<artifactId>adapters</artifactId>
- <version>1.0-rc5</version>
<versioning>
+ <release>1.1</release>
<versions>
<version>1.0-rc5</version>
+ <version>1.1</version>
</versions>
- <lastUpdated>20151103182653</lastUpdated>
+ <lastUpdated>20160114222429</lastUpdated>
</versioning>
</metadata>
diff --git a/internal-prebuilts/com/android/databinding/adapters/maven-metadata.xml.md5 b/internal-prebuilts/com/android/databinding/adapters/maven-metadata.xml.md5
index b897c554..cd356792 100644
--- a/internal-prebuilts/com/android/databinding/adapters/maven-metadata.xml.md5
+++ b/internal-prebuilts/com/android/databinding/adapters/maven-metadata.xml.md5
@@ -1 +1 @@
-ed1f2e20823c454ef9fe9de43fcf4a24 \ No newline at end of file
+08b9a4a0ba5bfce3cf77ae92007003e5 \ No newline at end of file
diff --git a/internal-prebuilts/com/android/databinding/adapters/maven-metadata.xml.sha1 b/internal-prebuilts/com/android/databinding/adapters/maven-metadata.xml.sha1
index 5e47de52..b6041755 100644
--- a/internal-prebuilts/com/android/databinding/adapters/maven-metadata.xml.sha1
+++ b/internal-prebuilts/com/android/databinding/adapters/maven-metadata.xml.sha1
@@ -1 +1 @@
-c29088e11462587f5e1d25fb2453d89bf55ca8ba \ No newline at end of file
+98de00cc52ce9a2a7b71d15e67fe22926c88d528 \ No newline at end of file
diff --git a/internal-prebuilts/com/android/databinding/library/1.1/library-1.1-javadoc.jar b/internal-prebuilts/com/android/databinding/library/1.1/library-1.1-javadoc.jar
new file mode 100644
index 00000000..fa827081
--- /dev/null
+++ b/internal-prebuilts/com/android/databinding/library/1.1/library-1.1-javadoc.jar
Binary files differ
diff --git a/internal-prebuilts/com/android/databinding/library/1.1/library-1.1-javadoc.jar.md5 b/internal-prebuilts/com/android/databinding/library/1.1/library-1.1-javadoc.jar.md5
new file mode 100644
index 00000000..ad758d9f
--- /dev/null
+++ b/internal-prebuilts/com/android/databinding/library/1.1/library-1.1-javadoc.jar.md5
@@ -0,0 +1 @@
+d7e559f25a20f061c62cc4dbbfb6a36c \ No newline at end of file
diff --git a/internal-prebuilts/com/android/databinding/library/1.1/library-1.1-javadoc.jar.sha1 b/internal-prebuilts/com/android/databinding/library/1.1/library-1.1-javadoc.jar.sha1
new file mode 100644
index 00000000..54e287cd
--- /dev/null
+++ b/internal-prebuilts/com/android/databinding/library/1.1/library-1.1-javadoc.jar.sha1
@@ -0,0 +1 @@
+339a3b20fd98775796dfb6c248cc7ddbf526f635 \ No newline at end of file
diff --git a/internal-prebuilts/com/android/databinding/library/1.1/library-1.1-sources.jar b/internal-prebuilts/com/android/databinding/library/1.1/library-1.1-sources.jar
new file mode 100644
index 00000000..d8bd2082
--- /dev/null
+++ b/internal-prebuilts/com/android/databinding/library/1.1/library-1.1-sources.jar
Binary files differ
diff --git a/internal-prebuilts/com/android/databinding/library/1.1/library-1.1-sources.jar.md5 b/internal-prebuilts/com/android/databinding/library/1.1/library-1.1-sources.jar.md5
new file mode 100644
index 00000000..964df96b
--- /dev/null
+++ b/internal-prebuilts/com/android/databinding/library/1.1/library-1.1-sources.jar.md5
@@ -0,0 +1 @@
+ca88a210328f9c3655c3524421874a97 \ No newline at end of file
diff --git a/internal-prebuilts/com/android/databinding/library/1.1/library-1.1-sources.jar.sha1 b/internal-prebuilts/com/android/databinding/library/1.1/library-1.1-sources.jar.sha1
new file mode 100644
index 00000000..e640354f
--- /dev/null
+++ b/internal-prebuilts/com/android/databinding/library/1.1/library-1.1-sources.jar.sha1
@@ -0,0 +1 @@
+12e3f88b119fbaccf46fe28b6c4f35adbe60daf3 \ No newline at end of file
diff --git a/internal-prebuilts/com/android/databinding/library/1.1/library-1.1.aar b/internal-prebuilts/com/android/databinding/library/1.1/library-1.1.aar
new file mode 100644
index 00000000..d25e0d1f
--- /dev/null
+++ b/internal-prebuilts/com/android/databinding/library/1.1/library-1.1.aar
Binary files differ
diff --git a/internal-prebuilts/com/android/databinding/library/1.1/library-1.1.aar.md5 b/internal-prebuilts/com/android/databinding/library/1.1/library-1.1.aar.md5
new file mode 100644
index 00000000..97b2c022
--- /dev/null
+++ b/internal-prebuilts/com/android/databinding/library/1.1/library-1.1.aar.md5
@@ -0,0 +1 @@
+786980fe30ef7a7015ec9d9e4f340ecb \ No newline at end of file
diff --git a/internal-prebuilts/com/android/databinding/library/1.1/library-1.1.aar.sha1 b/internal-prebuilts/com/android/databinding/library/1.1/library-1.1.aar.sha1
new file mode 100644
index 00000000..a2e0c863
--- /dev/null
+++ b/internal-prebuilts/com/android/databinding/library/1.1/library-1.1.aar.sha1
@@ -0,0 +1 @@
+6d305d8c838bbb1e16584a3053097699b5353d11 \ No newline at end of file
diff --git a/internal-prebuilts/com/android/databinding/library/1.1/library-1.1.pom b/internal-prebuilts/com/android/databinding/library/1.1/library-1.1.pom
new file mode 100644
index 00000000..bcb1d9b4
--- /dev/null
+++ b/internal-prebuilts/com/android/databinding/library/1.1/library-1.1.pom
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>com.android.databinding</groupId>
+ <artifactId>library</artifactId>
+ <version>1.1</version>
+ <packaging>aar</packaging>
+ <licenses>
+ <license>
+ <name>The Apache Software License, Version 2.0</name>
+ <url>http://www.apache.org/licenses/LICENSE-2.0.txt</url>
+ <distribution>repo</distribution>
+ </license>
+ </licenses>
+ <dependencies>
+ <dependency>
+ <groupId>com.android.support</groupId>
+ <artifactId>support-v4</artifactId>
+ <version>21.0.3</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>com.android.databinding</groupId>
+ <artifactId>baseLibrary</artifactId>
+ <version>1.1</version>
+ <scope>compile</scope>
+ </dependency>
+ </dependencies>
+</project>
diff --git a/internal-prebuilts/com/android/databinding/library/1.1/library-1.1.pom.md5 b/internal-prebuilts/com/android/databinding/library/1.1/library-1.1.pom.md5
new file mode 100644
index 00000000..4559ce53
--- /dev/null
+++ b/internal-prebuilts/com/android/databinding/library/1.1/library-1.1.pom.md5
@@ -0,0 +1 @@
+8177aaf76c6da0bc8f881a78327f0355 \ No newline at end of file
diff --git a/internal-prebuilts/com/android/databinding/library/1.1/library-1.1.pom.sha1 b/internal-prebuilts/com/android/databinding/library/1.1/library-1.1.pom.sha1
new file mode 100644
index 00000000..b2c05a26
--- /dev/null
+++ b/internal-prebuilts/com/android/databinding/library/1.1/library-1.1.pom.sha1
@@ -0,0 +1 @@
+5a4b0208f2a1722c23341d0d163d4c459c60ae3a \ No newline at end of file
diff --git a/internal-prebuilts/com/android/databinding/library/maven-metadata.xml b/internal-prebuilts/com/android/databinding/library/maven-metadata.xml
index fe76ad4f..ddcb12e5 100644
--- a/internal-prebuilts/com/android/databinding/library/maven-metadata.xml
+++ b/internal-prebuilts/com/android/databinding/library/maven-metadata.xml
@@ -2,11 +2,12 @@
<metadata>
<groupId>com.android.databinding</groupId>
<artifactId>library</artifactId>
- <version>1.0-rc5</version>
<versioning>
+ <release>1.1</release>
<versions>
<version>1.0-rc5</version>
+ <version>1.1</version>
</versions>
- <lastUpdated>20151103182638</lastUpdated>
+ <lastUpdated>20160114222429</lastUpdated>
</versioning>
</metadata>
diff --git a/internal-prebuilts/com/android/databinding/library/maven-metadata.xml.md5 b/internal-prebuilts/com/android/databinding/library/maven-metadata.xml.md5
index 4078a0ff..04ab5a49 100644
--- a/internal-prebuilts/com/android/databinding/library/maven-metadata.xml.md5
+++ b/internal-prebuilts/com/android/databinding/library/maven-metadata.xml.md5
@@ -1 +1 @@
-b8fbccd46940a63f9000d9f1c1bf25b9 \ No newline at end of file
+614659348ea658cd97eda5b27231b223 \ No newline at end of file
diff --git a/internal-prebuilts/com/android/databinding/library/maven-metadata.xml.sha1 b/internal-prebuilts/com/android/databinding/library/maven-metadata.xml.sha1
index 3246e89e..e87a0a4b 100644
--- a/internal-prebuilts/com/android/databinding/library/maven-metadata.xml.sha1
+++ b/internal-prebuilts/com/android/databinding/library/maven-metadata.xml.sha1
@@ -1 +1 @@
-ba7f5d2258c7a5e6790cc72ec9f77efd86d8f5a1 \ No newline at end of file
+0fecc097f9c2a8973c7169112cea421b48b87cb0 \ No newline at end of file