MergedBinding.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 */ 16 17package android.databinding.tool; 18 19import com.google.common.base.Function; 20import com.google.common.collect.Iterables; 21 22import android.databinding.tool.expr.ArgListExpr; 23import android.databinding.tool.expr.Expr; 24import android.databinding.tool.expr.ExprModel; 25import android.databinding.tool.reflection.ModelClass; 26import android.databinding.tool.store.SetterStore; 27import android.databinding.tool.util.L; 28import android.databinding.tool.writer.CodeGenUtil; 29import android.databinding.tool.writer.WriterPackage; 30 31import java.util.Arrays; 32import java.util.List; 33 34/** 35 * Multiple binding expressions can be evaluated using a single adapter. In those cases, 36 * we replace the Binding with a MergedBinding. 37 */ 38public class MergedBinding extends Binding { 39 private final SetterStore.MultiAttributeSetter mMultiAttributeSetter; 40 public MergedBinding(ExprModel model, SetterStore.MultiAttributeSetter multiAttributeSetter, 41 BindingTarget target, Iterable<Binding> bindings) { 42 super(target, createMergedName(bindings), createArgListExpr(model, bindings)); 43 mMultiAttributeSetter = multiAttributeSetter; 44 } 45 46 private static Expr createArgListExpr(ExprModel model, final Iterable<Binding> bindings) { 47 Expr expr = model.argListExpr(Iterables.transform(bindings, new Function<Binding, Expr>() { 48 @Override 49 public Expr apply(Binding input) { 50 return input.getExpr(); 51 } 52 })); 53 expr.setBindingExpression(true); 54 return expr; 55 } 56 57 private static String createMergedName(Iterable<Binding> bindings) { 58 return Iterables.toString(Iterables.transform(bindings, new Function<Binding, String>() { 59 @Override 60 public String apply(Binding input) { 61 return input.getName(); 62 } 63 })); 64 } 65 66 @Override 67 public void resolveListeners() { 68 ModelClass[] params = mMultiAttributeSetter.getParameterTypes(); 69 List<Expr> expressions = getExpr().getChildren(); 70 for (int i = 0; i < params.length; i++) { 71 expressions.get(i).resolveListeners(params[i]); 72 } 73 } 74 75 public Expr[] getComponentExpressions() { 76 ArgListExpr args = (ArgListExpr) getExpr(); 77 return args.getChildren().toArray(new Expr[args.getChildren().size()]); 78 } 79 80 @Override 81 public boolean requiresOldValue() { 82 return mMultiAttributeSetter.requiresOldValue(); 83 } 84 85 @Override 86 public int getMinApi() { 87 return 1; 88 } 89 90 @Override 91 public String toJavaCode(String targetViewName) { 92 final ArgListExpr args = (ArgListExpr) getExpr(); 93 final Iterable<String> newValues = 94 Iterables.transform(args.getChildren(), new Function<Expr, String>() { 95 @Override 96 public String apply(Expr input) { 97 return CodeGenUtil.Companion.toCode(input, false).generate(); 98 } 99 }); 100 final Iterable<String> oldValues; 101 if (requiresOldValue()) { 102 oldValues = Iterables.transform(args.getChildren(), new Function<Expr, String>() { 103 @Override 104 public String apply(Expr input) { 105 return "this." + WriterPackage.getOldValueName(input); 106 } 107 }); 108 } else { 109 oldValues = Arrays.asList(new String[args.getChildren().size()]); 110 } 111 final String[] expressions = Iterables.toArray(Iterables.concat(oldValues, newValues), 112 String.class); 113 L.d("merged binding arg: %s", args.getUniqueKey()); 114 return mMultiAttributeSetter.toJava(targetViewName, expressions); 115 } 116} 117