JaRMoS  1.1
Java Reduced Model Simulations
 All Classes Namespaces Files Functions Variables Enumerator Groups Pages
ModelListActivity.java
Go to the documentation of this file.
1 package jarmos.app.activity;
2 
4 import jarmos.app.Const;
6 import jarmos.app.R;
10 
11 import java.io.IOException;
12 import java.text.SimpleDateFormat;
13 import java.util.List;
14 
15 import android.app.Activity;
16 import android.app.AlertDialog;
17 import android.app.Dialog;
18 import android.content.DialogInterface;
19 import android.content.Intent;
20 import android.graphics.drawable.BitmapDrawable;
21 import android.graphics.drawable.Drawable;
22 import android.os.Bundle;
23 import android.os.Handler;
24 import android.os.Message;
25 import android.util.Log;
26 import android.view.ContextMenu;
27 import android.view.ContextMenu.ContextMenuInfo;
28 import android.view.LayoutInflater;
29 import android.view.MenuItem;
30 import android.view.View;
31 import android.view.ViewGroup;
32 import android.widget.AdapterView;
33 import android.widget.AdapterView.AdapterContextMenuInfo;
34 import android.widget.BaseAdapter;
35 import android.widget.GridView;
36 import android.widget.ImageView;
37 import android.widget.LinearLayout;
38 import android.widget.TextView;
39 import android.widget.Toast;
40 
57 public class ModelListActivity extends Activity {
58 
62  private class ModelsGridViewAdapter extends BaseAdapter {
63 
64  private Drawable[] imgs;
65 
66  ModelsGridViewAdapter() {
67  imgs = new BitmapDrawable[items.size()];
68  for (int i = 0; i < items.size(); i++) {
69  ModelDescriptor md = items.get(i);
70  if (md.image != null) {
71  imgs[i] = new BitmapDrawable(getResources(), md.image);
72  try {
73  md.image.close();
74  } catch (IOException io) {
75  Log.e("ProbSelectionActivity", "Failed closing image stream", io);
76  }
77  // Take red cross if image cannot be read
78  if (((BitmapDrawable) imgs[i]).getBitmap() == null) {
79  Log.w("JaRMoSA:ModelListActivity", "Could not read image file for model " + md.title
80  + " in folder " + md.modeldir);
81  imgs[i] = getResources().getDrawable(R.drawable.notfound);
82  }
83  } else
84  imgs[i] = null;
85  }
86  }
87 
88  @Override
89  public int getCount() {
90  // return getItems().size();
91  return items.size();
92  }
93 
94  @Override
95  public Object getItem(int pos) {
96  // return getItems().get(pos);
97  return items.get(pos);
98  }
99 
100  @Override
101  public long getItemId(int position) {
102  return getItem(position).hashCode();
103  }
104 
105  @Override
106  public View getView(int position, View convertView, ViewGroup parent) {
107  View v;
108  LayoutInflater li = getLayoutInflater();
109 
110  v = li.inflate(R.layout.grid_item, null);
111 
112  TextView title = (TextView) v.findViewById(R.id.gve_title);
113  TextView date = (TextView) v.findViewById(R.id.gve_date);
114  TextView mtype = (TextView) v.findViewById(R.id.gve_modeltype);
115  TextView descr = (TextView) v.findViewById(R.id.gve_description);
116  ImageView iv = (ImageView) v.findViewById(R.id.gve_icon);
117 
118  ModelDescriptor i = (ModelDescriptor) getItem(position);
119  title.setText(i.title);
120  date.setText("Created: " + SimpleDateFormat.getDateInstance().format(i.created));
121  mtype.setText("Model type: " + i.type.toString());
122  descr.setText(i.shortDescription == null ? "" : i.shortDescription);
123  if (imgs[position] != null) {
124  iv.setImageDrawable(imgs[position]);
125  }
126  // Scale images to uniform size (max height/width)
127  iv.setLayoutParams(new LinearLayout.LayoutParams(gridView.getWidth() / 4, gridView.getHeight() / 5));
128 
129  Log.d("adapter", "getview called pos: " + position);
130  return v;
131  }
132  }
133 
137  public static final int NO_MODELS_DIALOG_ID = 2;
138 
142  public static final int NOSRC_DIALOG_ID = 1;
143 
144  private GridView gridView;
145 
149  private List<ModelDescriptor> items;
150  private ModelsGridViewAdapter mgva = null;
151 
152  private AModelManager mng = null;
153 
154  @Override
155  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
156  if (resultCode < 0)
157  finish();
158  }
159 
163  protected void onCreate(Bundle savedInstanceState) {
164  super.onCreate(savedInstanceState);
165 
166  setContentView(R.layout.prob_selection);
167 
168  // Create model manager instance to use
169  try {
170  mng = Const.getModelManager(getApplicationContext(), getIntent());
171  } catch (ModelManagerException e) {
172  Log.e("ModelListActivity", "Creation of ModelManager failed", e);
173  finish();
174  return;
175  }
176 
177  final ProgressDialogWrapper pdw = new ProgressDialogWrapper(this);
178 
179  final Handler h = new Handler() {
180  @Override
181  public void handleMessage(Message msg) {
182  if (items == null || items.size() == 0) {
183  showDialog(NO_MODELS_DIALOG_ID);
184  } else {
185 
186  gridView = (GridView) findViewById(R.id.gridview);
187 
188  gridView.setStretchMode(GridView.STRETCH_COLUMN_WIDTH);
189  gridView.setAdapter(mgva);
190  // If the current models are served by a
191  if (mng instanceof FileModelManager) {
192  registerForContextMenu(gridView);
193  }
194 
195  gridView.setOnItemClickListener(new GridView.OnItemClickListener() {
196 
197  public void onItemClick(AdapterView<?> av, View view, int position, long id) {
198  Intent intent = new Intent(ModelListActivity.this, ShowModelActivity.class);
199  // Forward extras
200  intent.putExtras(getIntent().getExtras());
201  ModelDescriptor i = (ModelDescriptor) av.getItemAtPosition(position);
202  try {
203  mng.useModel(i.modeldir);
204  } catch (AModelManager.ModelManagerException me) {
205  Toast.makeText(ModelListActivity.this,
206  "Error setting the model directory " + i.modeldir + ": " + me.getMessage(),
207  Toast.LENGTH_LONG).show();
208  Log.e("ProbSelectionActivity", "Error setting the model directory " + i.modeldir, me);
209  return;
210  }
211  intent.putExtra("ModelType", i.type);
212  intent.putExtra(Const.EXTRA_MODELMANAGER_MODELDIR, i.modeldir);
213  ModelListActivity.this.startActivityForResult(intent, 0);
214  }
215  });
216  }
217  }
218  };
219  (new Thread() {
220 
221  @Override
222  public void run() {
223 
224  try {
225  items = mng.getModelDescriptors(pdw);
226  mgva = new ModelsGridViewAdapter();
227  } catch (AModelManager.ModelManagerException ex) {
228  Log.e("ModelListActivity", "Failed loading model descriptors", ex);
229  }
230 
231  h.sendEmptyMessage(0);
232  }
233 
234  }).start();
235  }
236 
252  @Override
253  protected Dialog onCreateDialog(int id) {
254  // Invalid Source is given. Close this activity.
255  AlertDialog.Builder builder = new AlertDialog.Builder(this);
256  if (id == NOSRC_DIALOG_ID) {
257  builder.setMessage("Invalid model source given, parsing failed.").setCancelable(false)
258  .setNeutralButton("OK", new DialogInterface.OnClickListener() {
259  public void onClick(DialogInterface dialog, int id) {
260  ModelListActivity.this.finish();
261  }
262  });
263  return builder.create();
264  } else if (id == NO_MODELS_DIALOG_ID) {
265  builder.setMessage("No models found.").setCancelable(false)
266  .setNeutralButton("OK", new DialogInterface.OnClickListener() {
267  public void onClick(DialogInterface dialog, int id) {
268  ModelListActivity.this.finish();
269  // dialog.dismiss();
270  }
271  });
272  }
273  return builder.create();
274  }
275 
276  /*
277  * (non-Javadoc)
278  *
279  * @see android.app.Activity#onCreateContextMenu(android.view.ContextMenu,
280  * android.view.View, android.view.ContextMenu.ContextMenuInfo)
281  */
282  @Override
283  public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
284  super.onCreateContextMenu(menu, v, menuInfo);
285  getMenuInflater().inflate(R.menu.modellist_contextmenu, menu);
286  }
287 
288  /*
289  * (non-Javadoc)
290  *
291  * @see android.app.Activity#onContextItemSelected(android.view.MenuItem)
292  */
293  @Override
294  public boolean onContextItemSelected(MenuItem item) {
295  AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
296  switch (item.getItemId()) {
297  case R.id.context_deleteModelItem:
298  String dir = items.get(info.position).modeldir;
299  try {
300  mng.useModel(dir);
301  } catch (ModelManagerException e) {
302  return false;
303  }
304  if (((FileModelManager) mng).clearCurrentModel()) {
305  items.remove(info.position);
306  gridView.invalidateViews();
307  } else
308  Toast.makeText(this, "Deleting model failed.", Toast.LENGTH_LONG).show();
309  return true;
310  default:
311  return super.onContextItemSelected(item);
312  }
313  }
314 
315 }
static final int NO_MODELS_DIALOG_ID
Dialog ID for the dialog that tells the user there are no models for the selected source...
Main model options display activity.
Dialog onCreateDialog(int id)
Helper method that takes a list of folders and a source which creates the ModelDescriptors using the ...
InputStream image
An input stream pointing to an available model image, if given.
Manages models loaded from the file system available via the java.io classes.
static final int NOSRC_DIALOG_ID
Dialog ID for the case of an invalid or nonexistent Source ID.
This class serves as base class for accessing various types of models at different locations...
Helper class for progress dialogs on android platforms.
void onActivityResult(int requestCode, int resultCode, Intent data)
Represents a short description of a model managed by a model manager.
This activity generates a simple ListView to allow selection of a model.
void onCreate(Bundle savedInstanceState)
This Exception gets thrown when an error occurs regarding the functionality of the ModelManager...
Date created
The model creation date.
static final String EXTRA_MODELMANAGER_MODELDIR
The string extra in intents to tell which model directory is currently used.
Definition: Const.java:53
Class that contains miscellaneous JaRMoS specific constants and static functions. ...
Definition: Const.java:26
void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)