1d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount/* 2d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount * Copyright (C) 2015 The Android Open Source Project 3d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount * 4d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount * Licensed under the Apache License, Version 2.0 (the "License"); 5d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount * you may not use this file except in compliance with the License. 6d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount * You may obtain a copy of the License at 7d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount * 8d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount * http://www.apache.org/licenses/LICENSE-2.0 9d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount * 10d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount * Unless required by applicable law or agreed to in writing, software 11d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount * distributed under the License is distributed on an "AS IS" BASIS, 12d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount * See the License for the specific language governing permissions and 14d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount * limitations under the License. 15d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount */ 16d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mountpackage android.databinding.tool.expr; 17d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount 18d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mountimport android.databinding.InverseBindingListener; 19d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mountimport android.databinding.tool.InverseBinding; 20d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mountimport android.databinding.tool.reflection.ModelAnalyzer; 21d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mountimport android.databinding.tool.reflection.ModelClass; 22d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mountimport android.databinding.tool.writer.KCode; 23d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mountimport android.databinding.tool.writer.LayoutBinderWriterKt; 24d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount 25d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mountimport java.util.List; 26d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount 27d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount/** 28d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount * TwoWayListenerExpr is used to set the event listener for a two-way binding expression. 29d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount */ 30d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mountpublic class TwoWayListenerExpr extends Expr { 31d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount final InverseBinding mInverseBinding; 32d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount 33d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount public TwoWayListenerExpr(InverseBinding inverseBinding) { 34d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount mInverseBinding = inverseBinding; 35d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount } 36d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount 37d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount @Override 38d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount protected ModelClass resolveType(ModelAnalyzer modelAnalyzer) { 39d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount return modelAnalyzer.findClass(InverseBindingListener.class); 40d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount } 41d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount 42d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount @Override 43d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount protected List<Dependency> constructDependencies() { 44d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount return constructDynamicChildrenDependencies(); 45d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount } 46d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount 47d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount @Override 48d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount protected KCode generateCode(boolean expand) { 49d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount final String fieldName = LayoutBinderWriterKt.getFieldName(mInverseBinding); 50d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount return new KCode(fieldName); 51d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount } 52d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount 53d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount @Override 54d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount protected String computeUniqueKey() { 55d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount return "event(" + mInverseBinding.getEventAttribute() + ", " + 56d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount System.identityHashCode(mInverseBinding) + ")"; 57d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount } 58d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount 59d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount @Override 60d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount public String getInvertibleError() { 61d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount return "Inverted expressions are already inverted!"; 62d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount } 63d3f2b9229472c9dae9bf4ae8b3e2d653b5653b01George Mount} 64