13bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar/* 23bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar * Copyright (C) 2015 The Android Open Source Project 33bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar * Licensed under the Apache License, Version 2.0 (the "License"); 43bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar * you may not use this file except in compliance with the License. 53bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar * You may obtain a copy of the License at 63bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar * http://www.apache.org/licenses/LICENSE-2.0 73bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar * Unless required by applicable law or agreed to in writing, software 83bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar * distributed under the License is distributed on an "AS IS" BASIS, 93bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 103bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar * See the License for the specific language governing permissions and 113bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar * limitations under the License. 123bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar */ 133bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar 14fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountpackage android.databinding.tool; 153bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar 16fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.store.ResourceBundle; 17fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.util.L; 184df4ba38a62b791bbbc25e923efe8d9c2f9a52e9Yigit Boyarimport android.databinding.tool.writer.BRWriter; 19fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.writer.DataBinderWriter; 20fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mountimport android.databinding.tool.writer.JavaFileWriter; 213bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar 22b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyarimport java.util.Set; 23b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar 243bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar/** 253bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar * Chef class for compiler. 263bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar * 273bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar * Different build systems can initiate a version of this to handle their work 283bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar */ 293bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyarpublic class CompilerChef { 301b9940e612fc73202837fbe9db2f9035f307b5d1George Mount private JavaFileWriter mFileWriter; 313bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar private ResourceBundle mResourceBundle; 323bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar private DataBinder mDataBinder; 333bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar 34b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar private CompilerChef() { 353bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar } 363bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar 378e5d3b4aa4e47fc0150b4a26b58ec6e5c17b9d16George Mount public static CompilerChef createChef(ResourceBundle bundle, JavaFileWriter fileWriter) { 38b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar CompilerChef chef = new CompilerChef(); 39b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar 408e5d3b4aa4e47fc0150b4a26b58ec6e5c17b9d16George Mount chef.mResourceBundle = bundle; 41b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar chef.mFileWriter = fileWriter; 428e5d3b4aa4e47fc0150b4a26b58ec6e5c17b9d16George Mount chef.mResourceBundle.validateMultiResLayouts(); 43b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar return chef; 44b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar } 45b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar 468e5d3b4aa4e47fc0150b4a26b58ec6e5c17b9d16George Mount public ResourceBundle getResourceBundle() { 478e5d3b4aa4e47fc0150b4a26b58ec6e5c17b9d16George Mount return mResourceBundle; 48b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar } 49b134dd773c386246ee8b692fbc4f063945e88ec5Yigit Boyar 503bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar public void ensureDataBinder() { 513bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar if (mDataBinder == null) { 523bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar mDataBinder = new DataBinder(mResourceBundle); 533bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar mDataBinder.setFileWriter(mFileWriter); 543bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar } 553bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar } 568e5d3b4aa4e47fc0150b4a26b58ec6e5c17b9d16George Mount 573bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar public boolean hasAnythingToGenerate() { 588e5d3b4aa4e47fc0150b4a26b58ec6e5c17b9d16George Mount L.d("checking if we have anything to generate. bundle size: %s", 593bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar mResourceBundle == null ? -1 : mResourceBundle.getLayoutBundles().size()); 603bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar return mResourceBundle != null && mResourceBundle.getLayoutBundles().size() > 0; 613bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar } 623bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar 634df4ba38a62b791bbbc25e923efe8d9c2f9a52e9Yigit Boyar public void writeDataBinderMapper(int minSdk, BRWriter brWriter) { 643bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar ensureDataBinder(); 65fead9ca09b117136b35bc5bf137340a754f9edddGeorge Mount final String pkg = "android.databinding"; 663bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar DataBinderWriter dbr = new DataBinderWriter(pkg, mResourceBundle.getAppPackage(), 67e7c2a5e45d7651899790bd347da635875f9c73fbGeorge Mount "DataBinderMapper", mDataBinder.getLayoutBinders(), minSdk); 684df4ba38a62b791bbbc25e923efe8d9c2f9a52e9Yigit Boyar mFileWriter.writeToFile(pkg + "." + dbr.getClassName(), dbr.write(brWriter)); 693bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar } 7061630faa88ee4817834d47294a0e17f19d8e1c51George Mount 7161630faa88ee4817834d47294a0e17f19d8e1c51George Mount /** 7261630faa88ee4817834d47294a0e17f19d8e1c51George Mount * Adds variables to list of Bindables. 7361630faa88ee4817834d47294a0e17f19d8e1c51George Mount */ 7461630faa88ee4817834d47294a0e17f19d8e1c51George Mount public void addBRVariables(BindableHolder bindables) { 7561630faa88ee4817834d47294a0e17f19d8e1c51George Mount ensureDataBinder(); 7661630faa88ee4817834d47294a0e17f19d8e1c51George Mount for (LayoutBinder layoutBinder : mDataBinder.mLayoutBinders) { 7761630faa88ee4817834d47294a0e17f19d8e1c51George Mount for (String variableName : layoutBinder.getUserDefinedVariables().keySet()) { 78dea555cf42dc3583604699c8c018d22681f56166George Mount bindables.addVariable(variableName, layoutBinder.getClassName()); 7961630faa88ee4817834d47294a0e17f19d8e1c51George Mount } 8061630faa88ee4817834d47294a0e17f19d8e1c51George Mount } 8161630faa88ee4817834d47294a0e17f19d8e1c51George Mount } 82e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount 83e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount public void sealModels() { 84e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount ensureDataBinder(); 85e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount mDataBinder.sealModels(); 86e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount } 873bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar 88dea555cf42dc3583604699c8c018d22681f56166George Mount public void writeViewBinderInterfaces(boolean isLibrary) { 893bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar ensureDataBinder(); 90dea555cf42dc3583604699c8c018d22681f56166George Mount mDataBinder.writerBaseClasses(isLibrary); 913bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar } 928e5d3b4aa4e47fc0150b4a26b58ec6e5c17b9d16George Mount 9396e1c821dd446d1ed78f8ae61131550588f60a24George Mount public void writeViewBinders(int minSdk) { 943bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar ensureDataBinder(); 9596e1c821dd446d1ed78f8ae61131550588f60a24George Mount mDataBinder.writeBinders(minSdk); 963bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar } 9761630faa88ee4817834d47294a0e17f19d8e1c51George Mount 98e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount public void writeComponent() { 99e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount ensureDataBinder(); 100e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount mDataBinder.writeComponent(); 101e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount } 102e4cd38824a6627b9fef229c549c636e35ad63b5fGeorge Mount 103b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar public Set<String> getWrittenClassNames() { 104b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar ensureDataBinder(); 105b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar return mDataBinder.getWrittenClassNames(); 106b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar } 107b6887f1479c3ecec38a7989748ef33de1fbcd973Yigit Boyar 10861630faa88ee4817834d47294a0e17f19d8e1c51George Mount public interface BindableHolder { 10961630faa88ee4817834d47294a0e17f19d8e1c51George Mount void addVariable(String variableName, String containingClassName); 11061630faa88ee4817834d47294a0e17f19d8e1c51George Mount } 1113bd87eef217d80a233677d7e267224d0ed3c2c55Yigit Boyar} 112