150f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen/*
250f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen * Copyright (C) 2012 The Android Open Source Project
350f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen *
450f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen * Licensed under the Apache License, Version 2.0 (the "License");
550f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen * you may not use this file except in compliance with the License.
650f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen * You may obtain a copy of the License at
750f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen *
850f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen *      http://www.apache.org/licenses/LICENSE-2.0
950f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen *
1050f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen * Unless required by applicable law or agreed to in writing, software
1150f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen * distributed under the License is distributed on an "AS IS" BASIS,
1250f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1350f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen * See the License for the specific language governing permissions and
1450f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen * limitations under the License.
1550f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen */
1650f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen
1750f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohenpackage android.widget;
1850f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen
1950f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohenimport android.content.Context;
2050f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohenimport android.view.View;
2150f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohenimport android.view.ViewGroup;
2250f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen
2350f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohenimport java.util.ArrayList;
2450f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen
2550f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen/**
2650f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen * @hide
2750f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen */
2850f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohenpublic class RemoteViewsListAdapter extends BaseAdapter {
2950f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen
3050f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    private Context mContext;
3150f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    private ArrayList<RemoteViews> mRemoteViewsList;
3250f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    private ArrayList<Integer> mViewTypes = new ArrayList<Integer>();
33b00d9f0e07993d47d49cfa2cf8d7026b8c5b0f2eAdam Cohen    private int mViewTypeCount;
3450f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen
35b00d9f0e07993d47d49cfa2cf8d7026b8c5b0f2eAdam Cohen    public RemoteViewsListAdapter(Context context, ArrayList<RemoteViews> remoteViews,
36b00d9f0e07993d47d49cfa2cf8d7026b8c5b0f2eAdam Cohen            int viewTypeCount) {
3750f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen        mContext = context;
3850f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen        mRemoteViewsList = remoteViews;
39b00d9f0e07993d47d49cfa2cf8d7026b8c5b0f2eAdam Cohen        mViewTypeCount = viewTypeCount;
4050f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen        init();
4150f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    }
4250f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen
4350f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    public void setViewsList(ArrayList<RemoteViews> remoteViews) {
4450f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen        mRemoteViewsList = remoteViews;
4550f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen        init();
4650f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen        notifyDataSetChanged();
4750f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    }
4850f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen
4950f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    private void init() {
5050f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen        if (mRemoteViewsList == null) return;
5150f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen
5250f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen        mViewTypes.clear();
5350f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen        for (RemoteViews rv: mRemoteViewsList) {
5450f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen            if (!mViewTypes.contains(rv.getLayoutId())) {
5550f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen                mViewTypes.add(rv.getLayoutId());
5650f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen            }
5750f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen        }
58b00d9f0e07993d47d49cfa2cf8d7026b8c5b0f2eAdam Cohen
59b00d9f0e07993d47d49cfa2cf8d7026b8c5b0f2eAdam Cohen        if (mViewTypes.size() > mViewTypeCount || mViewTypeCount < 1) {
60b00d9f0e07993d47d49cfa2cf8d7026b8c5b0f2eAdam Cohen            throw new RuntimeException("Invalid view type count -- view type count must be >= 1" +
61b00d9f0e07993d47d49cfa2cf8d7026b8c5b0f2eAdam Cohen                    "and must be as large as the total number of distinct view types");
62b00d9f0e07993d47d49cfa2cf8d7026b8c5b0f2eAdam Cohen        }
6350f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    }
6450f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen
6550f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    @Override
6650f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    public int getCount() {
6750f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen        if (mRemoteViewsList != null) {
6850f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen            return mRemoteViewsList.size();
6950f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen        } else {
7050f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen            return 0;
7150f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen        }
7250f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    }
7350f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen
7450f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    @Override
7550f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    public Object getItem(int position) {
7650f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen        return null;
7750f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    }
7850f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen
7950f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    @Override
8050f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    public long getItemId(int position) {
8150f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen        return position;
8250f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    }
8350f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen
8450f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    @Override
8550f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    public View getView(int position, View convertView, ViewGroup parent) {
8650f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen        if (position < getCount()) {
8750f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen            RemoteViews rv = mRemoteViewsList.get(position);
88b00d9f0e07993d47d49cfa2cf8d7026b8c5b0f2eAdam Cohen            rv.setIsWidgetCollectionChild(true);
8950f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen            View v;
9050f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen            if (convertView != null && rv != null &&
9150f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen                    convertView.getId() == rv.getLayoutId()) {
9250f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen                v = convertView;
9350f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen                rv.reapply(mContext, v);
9450f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen            } else {
9550f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen                v = rv.apply(mContext, parent);
9650f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen            }
9750f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen            return v;
9850f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen        } else {
9950f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen            return null;
10050f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen        }
10150f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    }
10250f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen
10350f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    @Override
10450f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    public int getItemViewType(int position) {
10550f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen        if (position < getCount()) {
10650f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen            int layoutId = mRemoteViewsList.get(position).getLayoutId();
10750f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen            return mViewTypes.indexOf(layoutId);
10850f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen        } else {
10950f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen            return 0;
11050f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen        }
11150f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    }
11250f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen
11350f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    public int getViewTypeCount() {
114b00d9f0e07993d47d49cfa2cf8d7026b8c5b0f2eAdam Cohen        return mViewTypeCount;
11550f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    }
11650f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen
11750f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    @Override
11850f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    public boolean hasStableIds() {
11950f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen        return false;
12050f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen    }
12150f3d1bae884eb9545d3db24362271c20f0d8d64Adam Cohen}
122