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