1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16package com.android.settingslib.drawer;
17
18import android.graphics.drawable.Icon;
19import android.view.LayoutInflater;
20import android.view.View;
21import android.view.ViewGroup;
22import android.widget.BaseAdapter;
23import android.widget.ImageView;
24import android.widget.TextView;
25
26import com.android.settingslib.R;
27
28import java.util.ArrayList;
29import java.util.List;
30
31public class SettingsDrawerAdapter extends BaseAdapter {
32
33    private final ArrayList<Item> mItems = new ArrayList<>();
34    private final SettingsDrawerActivity mActivity;
35
36    public SettingsDrawerAdapter(SettingsDrawerActivity activity) {
37        mActivity = activity;
38    }
39
40    void updateCategories() {
41        List<DashboardCategory> categories = mActivity.getDashboardCategories();
42        mItems.clear();
43        // Spacer.
44        mItems.add(null);
45        Item tile = new Item();
46        tile.label = mActivity.getString(R.string.home);
47        tile.icon = Icon.createWithResource(mActivity, R.drawable.home);
48        mItems.add(tile);
49        for (int i = 0; i < categories.size(); i++) {
50            Item category = new Item();
51            category.icon = null;
52            DashboardCategory dashboardCategory = categories.get(i);
53            category.label = dashboardCategory.title;
54            mItems.add(category);
55            for (int j = 0; j < dashboardCategory.tiles.size(); j++) {
56                tile = new Item();
57                Tile dashboardTile = dashboardCategory.tiles.get(j);
58                tile.label = dashboardTile.title;
59                tile.icon = dashboardTile.icon;
60                tile.tile = dashboardTile;
61                mItems.add(tile);
62            }
63        }
64        notifyDataSetChanged();
65    }
66
67    public Tile getTile(int position) {
68        return mItems.get(position) != null ? mItems.get(position).tile : null;
69    }
70
71    @Override
72    public int getCount() {
73        return mItems.size();
74    }
75
76    @Override
77    public Object getItem(int position) {
78        return mItems.get(position);
79    }
80
81    @Override
82    public long getItemId(int position) {
83        return position;
84    }
85
86    @Override
87    public boolean isEnabled(int position) {
88        return mItems.get(position) != null && mItems.get(position).icon != null;
89    }
90
91    @Override
92    public View getView(int position, View convertView, ViewGroup parent) {
93        Item item = mItems.get(position);
94        if (item == null) {
95            if (convertView == null || convertView.getId() != R.id.spacer) {
96                convertView = LayoutInflater.from(mActivity).inflate(R.layout.drawer_spacer,
97                        parent, false);
98            }
99            return convertView;
100        }
101        if (convertView != null && convertView.getId() == R.id.spacer) {
102            convertView = null;
103        }
104        boolean isTile = item.icon != null;
105        if (convertView == null || (isTile != (convertView.getId() == R.id.tile_item))) {
106            convertView = LayoutInflater.from(mActivity).inflate(isTile ? R.layout.drawer_item
107                            : R.layout.drawer_category,
108                    parent, false);
109        }
110        if (isTile) {
111            ((ImageView) convertView.findViewById(android.R.id.icon)).setImageIcon(item.icon);
112        }
113        ((TextView) convertView.findViewById(android.R.id.title)).setText(item.label);
114        return convertView;
115    }
116
117    private static class Item {
118        public Icon icon;
119        public CharSequence label;
120        public Tile tile;
121    }
122}
123