1 /* 2 * Copyright (C) 2014 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 */ 16 17 package com.example.android.wearable.recipeassistant; 18 19 import android.content.Context; 20 import android.database.DataSetObserver; 21 import android.graphics.Bitmap; 22 import android.util.Log; 23 import android.view.LayoutInflater; 24 import android.view.View; 25 import android.view.ViewGroup; 26 import android.widget.ImageView; 27 import android.widget.ListAdapter; 28 import android.widget.TextView; 29 30 import org.json.JSONArray; 31 import org.json.JSONException; 32 import org.json.JSONObject; 33 34 import java.util.ArrayList; 35 import java.util.List; 36 37 public class RecipeListAdapter implements ListAdapter { 38 private String TAG = "RecipeListAdapter"; 39 40 private class Item { 41 String title; 42 String name; 43 String summary; 44 Bitmap image; 45 } 46 47 private List<Item> mItems = new ArrayList<Item>(); 48 private Context mContext; 49 private DataSetObserver mObserver; 50 RecipeListAdapter(Context context)51 public RecipeListAdapter(Context context) { 52 mContext = context; 53 loadRecipeList(); 54 } 55 loadRecipeList()56 private void loadRecipeList() { 57 JSONObject jsonObject = AssetUtils.loadJSONAsset(mContext, Constants.RECIPE_LIST_FILE); 58 if (jsonObject != null) { 59 List<Item> items = parseJson(jsonObject); 60 appendItemsToList(items); 61 } 62 } 63 parseJson(JSONObject json)64 private List<Item> parseJson(JSONObject json) { 65 List<Item> result = new ArrayList<Item>(); 66 try { 67 JSONArray items = json.getJSONArray(Constants.RECIPE_FIELD_LIST); 68 for (int i = 0; i < items.length(); i++) { 69 JSONObject item = items.getJSONObject(i); 70 Item parsed = new Item(); 71 parsed.name = item.getString(Constants.RECIPE_FIELD_NAME); 72 parsed.title = item.getString(Constants.RECIPE_FIELD_TITLE); 73 if (item.has(Constants.RECIPE_FIELD_IMAGE)) { 74 String imageFile = item.getString(Constants.RECIPE_FIELD_IMAGE); 75 parsed.image = AssetUtils.loadBitmapAsset(mContext, imageFile); 76 } 77 parsed.summary = item.getString(Constants.RECIPE_FIELD_SUMMARY); 78 result.add(parsed); 79 } 80 } catch (JSONException e) { 81 Log.e(TAG, "Failed to parse recipe list: " + e); 82 } 83 return result; 84 } 85 appendItemsToList(List<Item> items)86 private void appendItemsToList(List<Item> items) { 87 mItems.addAll(items); 88 if (mObserver != null) { 89 mObserver.onChanged(); 90 } 91 } 92 93 @Override getCount()94 public int getCount() { 95 return mItems.size(); 96 } 97 98 @Override getItem(int position)99 public Object getItem(int position) { 100 return mItems.get(position); 101 } 102 103 @Override getItemId(int position)104 public long getItemId(int position) { 105 return 0; 106 } 107 108 @Override getItemViewType(int position)109 public int getItemViewType(int position) { 110 return 0; 111 } 112 113 @Override getView(int position, View convertView, ViewGroup parent)114 public View getView(int position, View convertView, ViewGroup parent) { 115 View view = convertView; 116 if (view == null) { 117 LayoutInflater inf = LayoutInflater.from(mContext); 118 view = inf.inflate(R.layout.list_item, null); 119 } 120 Item item = (Item) getItem(position); 121 TextView titleView = (TextView) view.findViewById(R.id.textTitle); 122 TextView summaryView = (TextView) view.findViewById(R.id.textSummary); 123 ImageView iv = (ImageView) view.findViewById(R.id.imageView); 124 125 titleView.setText(item.title); 126 summaryView.setText(item.summary); 127 if (item.image != null) { 128 iv.setImageBitmap(item.image); 129 } else { 130 iv.setImageDrawable(mContext.getResources().getDrawable(R.drawable.ic_noimage)); 131 } 132 return view; 133 } 134 135 @Override getViewTypeCount()136 public int getViewTypeCount() { 137 return 1; 138 } 139 140 @Override hasStableIds()141 public boolean hasStableIds() { 142 return false; 143 } 144 145 @Override isEmpty()146 public boolean isEmpty() { 147 return mItems.isEmpty(); 148 } 149 150 @Override registerDataSetObserver(DataSetObserver observer)151 public void registerDataSetObserver(DataSetObserver observer) { 152 mObserver = observer; 153 } 154 155 @Override unregisterDataSetObserver(DataSetObserver observer)156 public void unregisterDataSetObserver(DataSetObserver observer) { 157 mObserver = null; 158 } 159 160 @Override areAllItemsEnabled()161 public boolean areAllItemsEnabled() { 162 return true; 163 } 164 165 @Override isEnabled(int position)166 public boolean isEnabled(int position) { 167 return true; 168 } 169 getItemName(int position)170 public String getItemName(int position) { 171 return mItems.get(position).name; 172 } 173 } 174