summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tools/data-binding/annotationprocessor/src/main/java/android/databinding/annotationprocessor/ProcessExpressions.java7
-rw-r--r--tools/data-binding/compiler/src/main/java/android/databinding/tool/CompilerChef.java4
-rw-r--r--tools/data-binding/compiler/src/main/kotlin/android/databinding/tool/writer/DataBinderWriter.kt5
-rw-r--r--tools/data-binding/library/src/main/java/android/databinding/DataBinderMapper.java3
-rw-r--r--tools/data-binding/library/src/main/java/android/databinding/ViewDataBinding.java21
-rw-r--r--tools/data-binding/library/src/main/res/values/ids.xml4
6 files changed, 34 insertions, 10 deletions
diff --git a/tools/data-binding/annotationprocessor/src/main/java/android/databinding/annotationprocessor/ProcessExpressions.java b/tools/data-binding/annotationprocessor/src/main/java/android/databinding/annotationprocessor/ProcessExpressions.java
index 0d2239a5cd9c..512fbdb863b0 100644
--- a/tools/data-binding/annotationprocessor/src/main/java/android/databinding/annotationprocessor/ProcessExpressions.java
+++ b/tools/data-binding/annotationprocessor/src/main/java/android/databinding/annotationprocessor/ProcessExpressions.java
@@ -94,7 +94,7 @@ public class ProcessExpressions extends ProcessDataBinding.ProcessingStep {
for (Intermediate intermediate : intermediates) {
intermediate.appendTo(resourceBundle);
}
- writeResourceBundle(resourceBundle, buildInfo.isLibrary());
+ writeResourceBundle(resourceBundle, buildInfo.isLibrary(), buildInfo.minSdk());
}
private IntermediateV1 createIntermediateFromLayouts(String layoutInfoFolderPath) {
@@ -119,14 +119,15 @@ public class ProcessExpressions extends ProcessDataBinding.ProcessingStep {
return result;
}
- private void writeResourceBundle(ResourceBundle resourceBundle, boolean forLibraryModule)
+ private void writeResourceBundle(ResourceBundle resourceBundle, boolean forLibraryModule,
+ int minSdk)
throws JAXBException {
CompilerChef compilerChef = CompilerChef.createChef(resourceBundle, getWriter());
if (compilerChef.hasAnythingToGenerate()) {
compilerChef.addBRVariables(mProcessBindable);
compilerChef.writeViewBinderInterfaces(forLibraryModule);
if (!forLibraryModule) {
- compilerChef.writeDbrFile();
+ compilerChef.writeDbrFile(minSdk);
compilerChef.writeViewBinders();
}
}
diff --git a/tools/data-binding/compiler/src/main/java/android/databinding/tool/CompilerChef.java b/tools/data-binding/compiler/src/main/java/android/databinding/tool/CompilerChef.java
index 7e2449b34dd9..90829c5d0e1e 100644
--- a/tools/data-binding/compiler/src/main/java/android/databinding/tool/CompilerChef.java
+++ b/tools/data-binding/compiler/src/main/java/android/databinding/tool/CompilerChef.java
@@ -57,11 +57,11 @@ public class CompilerChef {
return mResourceBundle != null && mResourceBundle.getLayoutBundles().size() > 0;
}
- public void writeDbrFile() {
+ public void writeDbrFile(int minSdk) {
ensureDataBinder();
final String pkg = "android.databinding";
DataBinderWriter dbr = new DataBinderWriter(pkg, mResourceBundle.getAppPackage(),
- "DataBinderMapper", mDataBinder.getLayoutBinders());
+ "DataBinderMapper", mDataBinder.getLayoutBinders(), minSdk);
if (dbr.getLayoutBinders().size() > 0) {
mFileWriter.writeToFile(pkg + "." + dbr.getClassName(), dbr.write());
}
diff --git a/tools/data-binding/compiler/src/main/kotlin/android/databinding/tool/writer/DataBinderWriter.kt b/tools/data-binding/compiler/src/main/kotlin/android/databinding/tool/writer/DataBinderWriter.kt
index 22524fef431e..5fd46ec34d39 100644
--- a/tools/data-binding/compiler/src/main/kotlin/android/databinding/tool/writer/DataBinderWriter.kt
+++ b/tools/data-binding/compiler/src/main/kotlin/android/databinding/tool/writer/DataBinderWriter.kt
@@ -15,7 +15,8 @@ package android.databinding.tool.writer
import android.databinding.tool.LayoutBinder
-class DataBinderWriter(val pkg: String, val projectPackage: String, val className: String, val layoutBinders : List<LayoutBinder> ) {
+class DataBinderWriter(val pkg: String, val projectPackage: String, val className: String,
+ val layoutBinders : List<LayoutBinder>, val minSdk : kotlin.Int) {
fun write() =
kcode("") {
nl("package $pkg;")
@@ -52,6 +53,8 @@ class DataBinderWriter(val pkg: String, val projectPackage: String, val classNam
tab("public int getId(String key) {") {
tab("return BR.getId(key);")
} tab("}")
+
+ tab("final static int TARGET_MIN_SDK = ${minSdk};")
}
nl("}")
}.generate()
diff --git a/tools/data-binding/library/src/main/java/android/databinding/DataBinderMapper.java b/tools/data-binding/library/src/main/java/android/databinding/DataBinderMapper.java
index 0376c95e31a7..9fc7f4bba2bb 100644
--- a/tools/data-binding/library/src/main/java/android/databinding/DataBinderMapper.java
+++ b/tools/data-binding/library/src/main/java/android/databinding/DataBinderMapper.java
@@ -23,11 +23,12 @@ import android.view.View;
* as part of the code generation step. This class's existence is just to ensure that
* compile works and no reflection is needed to access the generated class.
*/
-public class DataBinderMapper {
+class DataBinderMapper {
public ViewDataBinding getDataBinder(View view, int layoutId) {
return null;
}
public int getId(String key) {
return 0;
}
+ public static int TARGET_MIN_SDK = 0;
}
diff --git a/tools/data-binding/library/src/main/java/android/databinding/ViewDataBinding.java b/tools/data-binding/library/src/main/java/android/databinding/ViewDataBinding.java
index 4e93469863a6..a5ba6e3284ec 100644
--- a/tools/data-binding/library/src/main/java/android/databinding/ViewDataBinding.java
+++ b/tools/data-binding/library/src/main/java/android/databinding/ViewDataBinding.java
@@ -16,9 +16,13 @@
package android.databinding;
+import com.android.databinding.library.R;
+
import android.annotation.TargetApi;
+import android.os.Build;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
+import android.util.Log;
import android.util.SparseIntArray;
import android.view.View;
import android.view.View.OnAttachStateChangeListener;
@@ -43,6 +47,9 @@ public abstract class ViewDataBinding {
// The length of BINDING_TAG_PREFIX prevents calling length repeatedly.
private static final int BINDING_NUMBER_START = BINDING_TAG_PREFIX.length();
+ // ICS (v 14) fixes a leak when using setTag(int, Object)
+ private static final boolean USE_TAG_ID = DataBinderMapper.TARGET_MIN_SDK >= 14;
+
/**
* Method object extracted out to attach a listener to a bound Observable object.
*/
@@ -84,7 +91,12 @@ public abstract class ViewDataBinding {
@Override
public void onViewAttachedToWindow(View v) {
// execute the pending bindings.
- ViewDataBinding binding = (ViewDataBinding) v.getTag();
+ final ViewDataBinding binding;
+ if (USE_TAG_ID) {
+ binding = (ViewDataBinding) v.getTag(R.id.dataBinding);
+ } else {
+ binding = (ViewDataBinding) v.getTag();
+ }
v.post(binding.mRebindRunnable);
v.removeOnAttachStateChangeListener(this);
}
@@ -138,8 +150,11 @@ public abstract class ViewDataBinding {
protected ViewDataBinding(View root, int localFieldCount) {
mLocalFieldObservers = new WeakListener[localFieldCount];
this.mRoot = root;
- // TODO: When targeting ICS and above, use setTag(id, this) instead
- this.mRoot.setTag(this);
+ if (USE_TAG_ID) {
+ this.mRoot.setTag(R.id.dataBinding, this);
+ } else {
+ this.mRoot.setTag(this);
+ }
}
public static int getBuildSdkInt() {
diff --git a/tools/data-binding/library/src/main/res/values/ids.xml b/tools/data-binding/library/src/main/res/values/ids.xml
new file mode 100644
index 000000000000..a7b89d3e1a86
--- /dev/null
+++ b/tools/data-binding/library/src/main/res/values/ids.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <item type="id" name="dataBinding"/>
+</resources> \ No newline at end of file