1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/* 2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Copyright (C) 2011 The Android Open Source Project 3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * you may not use this file except in compliance with the License. 6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * You may obtain a copy of the License at 7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Unless required by applicable law or agreed to in writing, software 11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * See the License for the specific language governing permissions and 14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * limitations under the License. 15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipackage com.android.layoutlib.bridge.impl.binding; 18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.AdapterBinding; 20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.DataBindingItem; 2137dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Guptaimport com.android.ide.common.rendering.api.LayoutlibCallback; 22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport com.android.ide.common.rendering.api.ResourceReference; 23e98d2cb65c0915d5278c593d14ff4bdc778557f7Deepanshu Guptaimport com.android.util.Pair; 24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.view.View; 26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.view.ViewGroup; 27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.widget.AdapterView; 28e98d2cb65c0915d5278c593d14ff4bdc778557f7Deepanshu Guptaimport android.widget.BaseAdapter; 29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.widget.ListAdapter; 30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport android.widget.SpinnerAdapter; 31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.ArrayList; 33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiimport java.util.List; 34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/** 36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Fake adapter to do fake data binding in {@link AdapterView} objects for {@link ListAdapter} 37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * and {@link SpinnerAdapter}. 38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 40e98d2cb65c0915d5278c593d14ff4bdc778557f7Deepanshu Guptapublic class FakeAdapter extends BaseAdapter { 41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // don't use a set because the order is important. 43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski private final List<ResourceReference> mTypes = new ArrayList<ResourceReference>(); 4437dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Gupta private final LayoutlibCallback mCallback; 45e98d2cb65c0915d5278c593d14ff4bdc778557f7Deepanshu Gupta private final ResourceReference mAdapterRef; 46e98d2cb65c0915d5278c593d14ff4bdc778557f7Deepanshu Gupta private final List<AdapterItem> mItems = new ArrayList<AdapterItem>(); 47e98d2cb65c0915d5278c593d14ff4bdc778557f7Deepanshu Gupta private boolean mSkipCallbackParser = false; 48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public FakeAdapter(ResourceReference adapterRef, AdapterBinding binding, 5037dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Gupta LayoutlibCallback callback) { 51e98d2cb65c0915d5278c593d14ff4bdc778557f7Deepanshu Gupta mAdapterRef = adapterRef; 52e98d2cb65c0915d5278c593d14ff4bdc778557f7Deepanshu Gupta mCallback = callback; 53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 54e98d2cb65c0915d5278c593d14ff4bdc778557f7Deepanshu Gupta final int repeatCount = binding.getRepeatCount(); 55e98d2cb65c0915d5278c593d14ff4bdc778557f7Deepanshu Gupta final int itemCount = binding.getItemCount(); 56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // Need an array to count for each type. 58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // This is likely too big, but is the max it can be. 59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int[] typeCount = new int[itemCount]; 60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // We put several repeating sets. 62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski for (int r = 0 ; r < repeatCount ; r++) { 63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // loop on the type of list items, and add however many for each type. 64e98d2cb65c0915d5278c593d14ff4bdc778557f7Deepanshu Gupta for (DataBindingItem dataBindingItem : binding) { 65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ResourceReference viewRef = dataBindingItem.getViewReference(); 66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int typeIndex = mTypes.indexOf(viewRef); 67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (typeIndex == -1) { 68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski typeIndex = mTypes.size(); 69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mTypes.add(viewRef); 70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int count = dataBindingItem.getCount(); 73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int index = typeCount[typeIndex]; 75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski typeCount[typeIndex] += count; 76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski for (int k = 0 ; k < count ; k++) { 78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mItems.add(new AdapterItem(dataBindingItem, typeIndex, mItems.size(), index++)); 79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public boolean isEnabled(int position) { 86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return true; 87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public int getCount() { 91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return mItems.size(); 92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public Object getItem(int position) { 96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return mItems.get(position); 97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public long getItemId(int position) { 101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return position; 102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public int getItemViewType(int position) { 106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return mItems.get(position).getType(); 107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public View getView(int position, View convertView, ViewGroup parent) { 111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // we don't care about recycling here because we never scroll. 112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski AdapterItem item = mItems.get(position); 11337dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Gupta @SuppressWarnings("deprecation") 11437dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Gupta Pair<View, Boolean> pair = AdapterHelper.getView(item, null, parent, mCallback, 11537dbb8b7f3c069196040eed3a03006647db7fa5bDeepanshu Gupta mAdapterRef, mSkipCallbackParser); 116e98d2cb65c0915d5278c593d14ff4bdc778557f7Deepanshu Gupta mSkipCallbackParser = pair.getSecond(); 117e98d2cb65c0915d5278c593d14ff4bdc778557f7Deepanshu Gupta return pair.getFirst(); 118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public int getViewTypeCount() { 122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return mTypes.size(); 123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // ---- SpinnerAdapter 126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski @Override 128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public View getDropDownView(int position, View convertView, ViewGroup parent) { 129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski // pass 130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return null; 131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski} 133