// Path: src/hk/reality/stock/service/fetcher/IndexesUpdateTask.java
// public class IndexesUpdateTask extends AsyncTask<Void, Integer, Boolean> {
//     public static final String TAG = "IndexesUpdateTask";
//     private IndexActivity activity;
//     private List<Index> results;
// 
//     private Error error;
//     enum Error {
//         ERROR_NO_NET, ERROR_DOWNLOAD, ERROR_PARSE, ERROR_UNKNOWN
//     }
//     
//     public IndexesUpdateTask(IndexActivity activity) {
//         this.activity = activity;
//     }
// 
//     @Override
//     protected Boolean doInBackground(Void ... ignored) {
//         Log.i(TAG, "running indexes update in background");
//         if (!NetworkDetector.hasValidNetwork(activity)) {
//             error = Error.ERROR_NO_NET;
//             return Boolean.FALSE;
//         }
// 
//         Log.i(TAG, "start fetcher");
//         IndexesFetcher fetcher = IndexesFetcherFactory.getIndexesFetcher(activity);
//         results = fetcher.fetch();
// 
//         return Boolean.TRUE;
//     }
// 
//     private void updateIndexes(List<Index> indexes) {
//         IndexAdapter adapter = activity.getIndexAdapter();
//         adapter.clear();
//         for(Index i : indexes) {
//             adapter.add(i);
//         }
//         adapter.notifyDataSetChanged();
//     }
//     
//     @Override
//     protected void onPreExecute() {
//         activity.getParent().setProgressBarVisibility(true);
//         activity.getParent().setProgressBarIndeterminateVisibility(true);
//     }
// 
//     @Override
//     protected void onCancelled() {
//         activity.getParent().setProgressBarVisibility(false);
//         activity.getParent().setProgressBarIndeterminateVisibility(false);
//     }
//     
//     @Override
//     protected void onPostExecute(Boolean result) {
//         activity.getParent().setProgressBarVisibility(false);
//         activity.getParent().setProgressBarIndeterminateVisibility(false);
//         if (result) {
//             Log.i(TAG, "update success, number of results ..." + results.size());
//             updateIndexes(results);
//         } else {
//             Log.i(TAG, "update failure");
//         }
//     }
// }
// 
// Path: src/hk/reality/stock/view/IndexAdapter.java
// public class IndexAdapter extends ArrayAdapter<Index> {
//     private static final String TAG = "IndexAdapter";
//     private java.text.DateFormat formatter;
// 
//     public IndexAdapter(Context context) {
//         super(context, 0);
//         formatter = DateFormat.getTimeFormat(context);        
//     }
// 
//     @Override
//     public View getView(int position, View view, ViewGroup parent) {
//         View v = view;
//         if (v == null) {
//             LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//             v = (View) vi.inflate(R.layout.index_item, null);
//         }
// 
//         Log.d(TAG, "prepare view for indexes");
//         // prepare views
//         TextView name = (TextView) v.findViewById(R.id.name);       
//         TextView price = (TextView) v.findViewById(R.id.price);
//         TextView change = (TextView) v.findViewById(R.id.change);
//         TextView volume = (TextView) v.findViewById(R.id.volume);
//         TextView time = (TextView) v.findViewById(R.id.time);
//         
//         // set data
//         Index index = getItem(position);
//         if (index != null) {
//             volume.setText("");
//             name.setText(index.getName());
//             price.setText(PriceFormatter.forPrice(index.getValue().doubleValue()));
// 
//             if (index.getUpdatedAt() != null) {
//                 time.setText(formatter.format(index.getUpdatedAt().getTime()));
//             } else {
//                 time.setText("");
//             }
//             
//             if (index.getChange() != null) {
//                 change.setText(String.format("%s (%s)", 
//                 		PriceFormatter.forPrice(index.getChange().doubleValue()), 
//                 		PriceFormatter.forPercent(index.getChangePercent().doubleValue())));
//             } else {
//                 change.setText("---- (---)");
//             }
//             
//             if (index.getChange() != null && index.getChange().floatValue() > 0) {
//                 price.setTextColor(Color.rgb(0, 213, 65));
//                 change.setTextColor(Color.rgb(0, 213, 65));
//             } else if (index.getChange() != null && index.getChange().floatValue() < 0) {
//                 price.setTextColor(Color.rgb(238, 30, 0));
//                 change.setTextColor(Color.rgb(238, 30, 0));
//             } else {
//                 price.setTextColor(Color.WHITE);
//                 change.setTextColor(Color.WHITE);
//             }
// 
//         } else {
//             time.setText("");
//             volume.setText("---");
//             name.setText("");
//             price.setText("----");
//             change.setText("---- (---)");
//         }
//         return v;
//     }
// }


import hk.reality.stock.service.fetcher.IndexesUpdateTask;
import hk.reality.stock.view.IndexAdapter;
import android.app.ListActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.Window;
import android.widget.TextView;
        
        adapter = new IndexAdapter(this);
        setListAdapter(adapter);
        
        TextView empty = (TextView) findViewById(android.R.id.empty);
        empty.setText(R.string.msg_loading);
        
        Log.i(TAG, "start index activity");
        IndexesUpdateTask task = new IndexesUpdateTask(this);
        task.execute();
    }
    
    public IndexAdapter getIndexAdapter() {
        return adapter;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.index_menu, menu);
        menu.getItem(0).setIcon(R.drawable.ic_menu_rotate);
        menu.getItem(1).setIcon(R.drawable.ic_menu_help);        
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.refresh:
// Path: src/hk/reality/stock/service/fetcher/IndexesUpdateTask.java
// public class IndexesUpdateTask extends AsyncTask<Void, Integer, Boolean> {
//     public static final String TAG = "IndexesUpdateTask";
//     private IndexActivity activity;
//     private List<Index> results;
// 
//     private Error error;
//     enum Error {
//         ERROR_NO_NET, ERROR_DOWNLOAD, ERROR_PARSE, ERROR_UNKNOWN
//     }
//     
//     public IndexesUpdateTask(IndexActivity activity) {
//         this.activity = activity;
//     }
// 
//     @Override
//     protected Boolean doInBackground(Void ... ignored) {
//         Log.i(TAG, "running indexes update in background");
//         if (!NetworkDetector.hasValidNetwork(activity)) {
//             error = Error.ERROR_NO_NET;
//             return Boolean.FALSE;
//         }
// 
//         Log.i(TAG, "start fetcher");
//         IndexesFetcher fetcher = IndexesFetcherFactory.getIndexesFetcher(activity);
//         results = fetcher.fetch();
// 
//         return Boolean.TRUE;
//     }
// 
//     private void updateIndexes(List<Index> indexes) {
//         IndexAdapter adapter = activity.getIndexAdapter();
//         adapter.clear();
//         for(Index i : indexes) {
//             adapter.add(i);
//         }
//         adapter.notifyDataSetChanged();
//     }
//     
//     @Override
//     protected void onPreExecute() {
//         activity.getParent().setProgressBarVisibility(true);
//         activity.getParent().setProgressBarIndeterminateVisibility(true);
//     }
// 
//     @Override
//     protected void onCancelled() {
//         activity.getParent().setProgressBarVisibility(false);
//         activity.getParent().setProgressBarIndeterminateVisibility(false);
//     }
//     
//     @Override
//     protected void onPostExecute(Boolean result) {
//         activity.getParent().setProgressBarVisibility(false);
//         activity.getParent().setProgressBarIndeterminateVisibility(false);
//         if (result) {
//             Log.i(TAG, "update success, number of results ..." + results.size());
//             updateIndexes(results);
//         } else {
//             Log.i(TAG, "update failure");
//         }
//     }
// }
// 
// Path: src/hk/reality/stock/view/IndexAdapter.java
// public class IndexAdapter extends ArrayAdapter<Index> {
//     private static final String TAG = "IndexAdapter";
//     private java.text.DateFormat formatter;
// 
//     public IndexAdapter(Context context) {
//         super(context, 0);
//         formatter = DateFormat.getTimeFormat(context);        
//     }
// 
//     @Override
//     public View getView(int position, View view, ViewGroup parent) {
//         View v = view;
//         if (v == null) {
//             LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//             v = (View) vi.inflate(R.layout.index_item, null);
//         }
// 
//         Log.d(TAG, "prepare view for indexes");
//         // prepare views
//         TextView name = (TextView) v.findViewById(R.id.name);       
//         TextView price = (TextView) v.findViewById(R.id.price);
//         TextView change = (TextView) v.findViewById(R.id.change);
//         TextView volume = (TextView) v.findViewById(R.id.volume);
//         TextView time = (TextView) v.findViewById(R.id.time);
//         
//         // set data
//         Index index = getItem(position);
//         if (index != null) {
//             volume.setText("");
//             name.setText(index.getName());
//             price.setText(PriceFormatter.forPrice(index.getValue().doubleValue()));
// 
//             if (index.getUpdatedAt() != null) {
//                 time.setText(formatter.format(index.getUpdatedAt().getTime()));
//             } else {
//                 time.setText("");
//             }
//             
//             if (index.getChange() != null) {
//                 change.setText(String.format("%s (%s)", 
//                 		PriceFormatter.forPrice(index.getChange().doubleValue()), 
//                 		PriceFormatter.forPercent(index.getChangePercent().doubleValue())));
//             } else {
//                 change.setText("---- (---)");
//             }
//             
//             if (index.getChange() != null && index.getChange().floatValue() > 0) {
//                 price.setTextColor(Color.rgb(0, 213, 65));
//                 change.setTextColor(Color.rgb(0, 213, 65));
//             } else if (index.getChange() != null && index.getChange().floatValue() < 0) {
//                 price.setTextColor(Color.rgb(238, 30, 0));
//                 change.setTextColor(Color.rgb(238, 30, 0));
//             } else {
//                 price.setTextColor(Color.WHITE);
//                 change.setTextColor(Color.WHITE);
//             }
// 
//         } else {
//             time.setText("");
//             volume.setText("---");
//             name.setText("");
//             price.setText("----");
//             change.setText("---- (---)");
//         }
//         return v;
//     }
// }


// Path: src/hk/reality/stock/IndexActivity.java
import hk.reality.stock.service.fetcher.IndexesUpdateTask;
import hk.reality.stock.view.IndexAdapter;
import android.app.ListActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.Window;
import android.widget.TextView;

        
        adapter = new IndexAdapter(this);
        setListAdapter(adapter);
        
        TextView empty = (TextView) findViewById(android.R.id.empty);
        empty.setText(R.string.msg_loading);
        
        Log.i(TAG, "start index activity");
        IndexesUpdateTask task = new IndexesUpdateTask(this);
        task.execute();
    }
    
    public IndexAdapter getIndexAdapter() {
        return adapter;
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.index_menu, menu);
        menu.getItem(0).setIcon(R.drawable.ic_menu_rotate);
        menu.getItem(1).setIcon(R.drawable.ic_menu_help);        
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
        case R.id.refresh:
            IndexesUpdateTask task = new IndexesUpdateTask(this);