12fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet/* 22fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * Copyright (C) 2011 The Android Open Source Project 32fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * 42fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * Licensed under the Apache License, Version 2.0 (the "License"); 52fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * you may not use this file except in compliance with the License. 62fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * You may obtain a copy of the License at 72fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * 82fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * http://www.apache.org/licenses/LICENSE-2.0 92fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * 102fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * Unless required by applicable law or agreed to in writing, software 112fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * distributed under the License is distributed on an "AS IS" BASIS, 122fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * See the License for the specific language governing permissions and 142fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * limitations under the License. 152fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet */ 162fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet 172fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohetpackage com.android.layoutlib.bridge.impl.binding; 182fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet 192fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohetimport com.android.ide.common.rendering.api.AdapterBinding; 202fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohetimport com.android.ide.common.rendering.api.DataBindingItem; 212fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohetimport com.android.ide.common.rendering.api.IProjectCallback; 222fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohetimport com.android.ide.common.rendering.api.ResourceReference; 232fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet 242fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohetimport android.view.View; 252fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohetimport android.view.ViewGroup; 262fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohetimport android.widget.AdapterView; 272fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohetimport android.widget.ListAdapter; 282fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohetimport android.widget.SpinnerAdapter; 292fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet 302fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohetimport java.util.ArrayList; 312fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohetimport java.util.List; 322fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet 332fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet/** 342fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * Fake adapter to do fake data binding in {@link AdapterView} objects for {@link ListAdapter} 352fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * and {@link SpinnerAdapter}. 362fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet * 372fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet */ 382fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohetpublic class FakeAdapter extends BaseAdapter implements ListAdapter, SpinnerAdapter { 392fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet 402fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet // don't use a set because the order is important. 412fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet private final List<ResourceReference> mTypes = new ArrayList<ResourceReference>(); 422fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet 432fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet public FakeAdapter(ResourceReference adapterRef, AdapterBinding binding, 442fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet IProjectCallback callback) { 452fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet super(adapterRef, binding, callback); 462fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet 472fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet final int repeatCount = getBinding().getRepeatCount(); 482fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet final int itemCount = getBinding().getItemCount(); 492fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet 502fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet // Need an array to count for each type. 512fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet // This is likely too big, but is the max it can be. 522fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet int[] typeCount = new int[itemCount]; 532fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet 542fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet // We put several repeating sets. 552fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet for (int r = 0 ; r < repeatCount ; r++) { 562fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet // loop on the type of list items, and add however many for each type. 572fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet for (DataBindingItem dataBindingItem : getBinding()) { 582fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet ResourceReference viewRef = dataBindingItem.getViewReference(); 592fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet int typeIndex = mTypes.indexOf(viewRef); 602fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet if (typeIndex == -1) { 612fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet typeIndex = mTypes.size(); 622fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet mTypes.add(viewRef); 632fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet } 642fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet 652fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet int count = dataBindingItem.getCount(); 662fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet 672fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet int index = typeCount[typeIndex]; 682fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet typeCount[typeIndex] += count; 692fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet 702fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet for (int k = 0 ; k < count ; k++) { 712fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet mItems.add(new AdapterItem(dataBindingItem, typeIndex, mItems.size(), index++)); 722fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet } 732fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet } 742fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet } 752fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet } 762fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet 7746d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet @Override 782fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet public boolean isEnabled(int position) { 792fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet return true; 802fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet } 812fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet 8246d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet @Override 832fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet public int getCount() { 842fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet return mItems.size(); 852fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet } 862fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet 8746d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet @Override 882fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet public Object getItem(int position) { 892fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet return mItems.get(position); 902fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet } 912fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet 9246d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet @Override 932fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet public long getItemId(int position) { 942fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet return position; 952fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet } 962fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet 9746d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet @Override 982fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet public int getItemViewType(int position) { 992fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet return mItems.get(position).getType(); 1002fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet } 1012fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet 10246d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet @Override 1032fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet public View getView(int position, View convertView, ViewGroup parent) { 1042fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet // we don't care about recycling here because we never scroll. 1052fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet AdapterItem item = mItems.get(position); 1062fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet return getView(item, null /*parentGroup*/, convertView, parent); 1072fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet } 1082fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet 10946d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet @Override 1102fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet public int getViewTypeCount() { 1112fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet return mTypes.size(); 1122fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet } 1132fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet 1142fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet // ---- SpinnerAdapter 1152fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet 11646d43ccfd8cef75b4315828073c094cf1efb05ffXavier Ducrohet @Override 1172fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet public View getDropDownView(int position, View convertView, ViewGroup parent) { 1182fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet // pass 1192fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet return null; 1202fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet } 1212fae858db55fc6984ef923a6226b9408c37c72cbXavier Ducrohet} 122