MixListView.java :  » Location » baleen » org » baleen » Android Open Source

Android Open Source » Location » baleen 
baleen » org » baleen » MixListView.java
/*
 * Copyright (C) 2010- Peer internet solutions
 * 
 * This file is part of mixare.
 * 
 * This program is free software: you can redistribute it and/or modify it 
 * under the terms of the GNU General Public License as published by 
 * the Free Software Foundation, either version 3 of the License, or 
 * (at your option) any later version. 
 * 
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
 * FOR A PARTICULAR PURPOSE. See the GNU General Public License 
 * for more details. 
 * 
 * You should have received a copy of the GNU General Public License along with 
 * this program. If not, see <http://www.gnu.org/licenses/>
 */
package org.baleen;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Vector;

import org.baleen.data.DataHandler;

import android.app.AlertDialog;
import android.app.ListActivity;
import android.app.SearchManager;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.ColorStateList;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.os.Bundle;
import android.text.Editable;
import android.util.Log;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnCreateContextMenuListener;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MixListView extends ListActivity {

  private static int list;
  
  private Vector<Bitmap> listviewImage;
  private Vector<String> listViewMenu;
  private Vector<String> selectedItemURL;
  private Vector<String> dataSourceMenu;
  private Vector<String> dataSourceDescription;
  //  private static MixContext mixCtx = null;
  private DataView dataView;
  private static String selectedDataSource = "Wikipedia";
  /*to check which data source is active*/
  //  private int clickedDataSourceItem = 0;
  private ListItemAdapter adapter;
  public static String customizedURL="http://mixare.org/geotest.php";
  private static Context ctx;
  private static String searchQuery = "";
  public static ArrayList<Marker> searchResultMarkers;
  public static ArrayList<Marker> originalMarkerList;
  
  
    private static  class MarkerAdapter extends BaseAdapter {
        private LayoutInflater mInflater;

        ArrayList<Marker> markerList = null;
        public MarkerAdapter(Context context, ArrayList<Marker> markerList) {
            // Cache the LayoutInflate to avoid asking for a new one each time.
            mInflater = LayoutInflater.from(context);            
            this.markerList = markerList;
        }

        /**
         * The number of items in the list is determined by the number of speeches
         * in our array.
         *
         * @see android.widget.ListAdapter#getCount()
         */
        public int getCount() {
            return markerList.size();
        }

        /**
         * Since the data comes from an array, just returning the index is
         * sufficent to get at the data. If we were using a more complex data
         * structure, we would return whatever object represents one row in the
         * list.
         *
         * @see android.widget.ListAdapter#getItem(int)
         */
        public Object getItem(int position) {
            return position;
        }

        /**
         * Use the array index as a unique id.
         *
         * @see android.widget.ListAdapter#getItemId(int)
         */
        public long getItemId(int position) {
            return position;
        }

        /**
         * Make a view to hold each row.
         *
         * @see android.widget.ListAdapter#getView(int, android.view.View,
         *      android.view.ViewGroup)
         */
        public View getView(int position, View convertView, ViewGroup parent) {
            // A MarkerItem keeps references to children views to avoid unneccessary calls
            // to findViewById() on each row.
            MarkerItem markerItem;

            // When convertView is not null, we can reuse it directly, there is no need
            // to reinflate it. We only inflate a new View when the convertView supplied
            // by ListView is null.
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.markeritem, null);
                
                //ColorStateList colorStateList = new ColorStateList(null, null);
                //colorStateList.valueOf(Color.argb(160, 75, 75, 75));
                
                // Creates a MarkerItem and store references to the two children views
                // we want to bind data to.
                markerItem = new MarkerItem();
                markerItem.userName = (TextView) convertView.findViewById(R.id.userName);
            //markerItem.userName.setTextColor(colorStateList);
                markerItem.text = (TextView) convertView.findViewById(R.id.text);
                markerItem.icon = (ImageView) convertView.findViewById(R.id.icon);

                convertView.setTag(markerItem);
            } else {
                // Get the MarkerItem back to get fast access to the TextView
                // and the ImageView.
              markerItem = (MarkerItem) convertView.getTag();
            }

            // Bind the data efficiently with the markerItem.
            markerItem.userName.setText(markerList.get(position).getUserName());
            markerItem.text.setText(markerList.get(position).getTitle());
            markerItem.icon.setImageBitmap(markerList.get(position).getBitMap());


             

            

            return convertView;
        }

      
        public class MarkerItem {
          TextView userName;
          TextView text;
            ImageView icon;

        }

    }  

  public Vector<String> getDataSourceMenu() {
    return dataSourceMenu;
  }
  
  public Vector<String> getDataSourceDescription() {
    return dataSourceDescription;
  }

  @Override
  public void onCreate(Bundle savedInstanceState){
    Log.d(MixView.TAG, "Debug: MixListView - onCreate entered");
    super.onCreate(savedInstanceState);
    //    mixCtx = MixView.ctx;
    dataView = MixView.dataView;  
    ctx = this;

    switch(list){
    case 1:
      Log.d(MixView.TAG, "Debug: MixListView - onCreate - case 1 entered");
      dataSourceMenu = new Vector<String>();
      dataSourceMenu.add("Wikipedia");
      dataSourceMenu.add("Twitter");
      dataSourceMenu.add("Buzz");
      dataSourceMenu.add(getString(DataView.SOURCE_OPENSTREETMAP));
      dataSourceMenu.add("Own URL");
      dataSourceMenu.add("Streaming");

      dataSourceDescription = new Vector<String>();
      dataSourceDescription.add("");
      dataSourceDescription.add("");
      dataSourceDescription.add("");
      dataSourceDescription.add("(OpenStreetMap)");
      dataSourceDescription.add("example: http://mixare.org/geotest.php");
      dataSourceDescription.add("Twitter Streaming");

      adapter = new ListItemAdapter(this);
      adapter.colorSource(getDataSource());
      getListView().setTextFilterEnabled(true);

      setListAdapter(adapter);
      break;

    case 2:
      Log.d(MixView.TAG, "Debug: MixListView - onCreate - case 2 entered");
      selectedItemURL = new Vector<String>();
      listViewMenu = new Vector<String>();
      DataHandler jLayer = dataView.getDataHandler();
      if (dataView.isFrozen() && jLayer.getMarkerCount() > 0){
        selectedItemURL.add("search");
      }
      /*add all marker items to a title and a URL Vector*/
            
      
      
      if((getDataSource()!="Twitter")&&(getDataSource()!="Streaming"))
      {
      
      
      
      for (int i = 0; i < jLayer.getMarkerCount(); i++) {
        Marker ma = jLayer.getMarker(i);
        listViewMenu.add(ma.getTitle());
        /*the website for the corresponding title*/
        if (ma.getURL()!=null)
          selectedItemURL.add(ma.getURL());
        /*if no website is available for a specific title*/
        else
          selectedItemURL.add("");
      }
      
        
      }
      
      
      

      if (dataView.isFrozen()) {

        TextView searchNotificationTxt = new TextView(this);
        searchNotificationTxt.setVisibility(View.VISIBLE);
        searchNotificationTxt.setText(getString(DataView.SEARCH_ACTIVE_1)+" "+ getDataSource()+ getString(DataView.SEARCH_ACTIVE_2));
        searchNotificationTxt.setWidth(MixView.dWindow.getWidth());

        searchNotificationTxt.setPadding(10, 2, 0, 0);
        searchNotificationTxt.setBackgroundColor(Color.DKGRAY);
        searchNotificationTxt.setTextColor(Color.WHITE);

        getListView().addHeaderView(searchNotificationTxt);

      }
            
      
      if((getDataSource()=="Twitter")||(getDataSource()=="Streaming"))
      {
        ArrayList<Marker> markerList = jLayer.getMarkerList();
        Collections.reverse(markerList);
        setListAdapter(new MarkerAdapter(this,markerList));
      }
      else
      {
        setListAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,listViewMenu));
      }
    
      
      
      
      getListView().setTextFilterEnabled(true);
      break;

    }
  }

  private void handleIntent(Intent intent) {
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
      String query = intent.getStringExtra(SearchManager.QUERY);
      doMixSearch(query);
    }
  }

  @Override
  protected void onNewIntent(Intent intent) {
    setIntent(intent);
    handleIntent(intent);
  }

  private void doMixSearch(String query) {
    DataHandler jLayer = dataView.getDataHandler();
    if (!dataView.isFrozen()) {
      originalMarkerList = jLayer.getMarkerList();
      MixMap.originalMarkerList = jLayer.getMarkerList();
    }
    originalMarkerList = jLayer.getMarkerList();
    searchResultMarkers = new ArrayList<Marker>();
    Log.d("SEARCH-------------------0", ""+query);
    setSearchQuery(query);

    selectedItemURL = new Vector<String>();
    listViewMenu = new Vector<String>();
    for(int i = 0; i < jLayer.getMarkerCount();i++){
      Marker ma = jLayer.getMarker(i);

      if (ma.getTitle().toLowerCase().indexOf(searchQuery.toLowerCase()) != -1) {
        searchResultMarkers.add(ma);
        listViewMenu.add(ma.getTitle());
        /*the website for the corresponding title*/
        if (ma.getURL() != null)
          selectedItemURL.add(ma.getURL());
        /*if no website is available for a specific title*/
        else
          selectedItemURL.add("");
      }
    }
    if (listViewMenu.size() == 0) {
      Toast.makeText( this, getString(DataView.SEARCH_FAILED_NOTIFICATION), Toast.LENGTH_LONG ).show();
    }
    else {
      jLayer.setMarkerList(searchResultMarkers);
      dataView.setFrozen(true);
      setList(2);
      finish();
      Intent intent1 = new Intent(this, MixListView.class); 
      startActivityForResult(intent1, 42);
    }
  }


  @Override
  protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
    switch(list){
    /*Data Sources*/  
    case 1:
      clickOnDataSource(position);    
      break;

      /*List View*/
    case 2:
      clickOnListView(position);
      break;
    }

  }

  public void clickOnListView(int position){
    /*if no website is available for this item*/
    String selectedURL = position < selectedItemURL.size() ? selectedItemURL.get(position) : null;
    if (selectedURL == null || selectedURL.length() <= 0)
      Toast.makeText( this, getString(DataView.NO_WEBINFO_AVAILABLE), Toast.LENGTH_LONG ).show();      
    else if("search".equals(selectedURL)){
      dataView.setFrozen(false);
      dataView.getDataHandler().setMarkerList(originalMarkerList);
      setList(2);
      finish();
      Intent intent1 = new Intent(this, MixListView.class); 
      startActivityForResult(intent1, 42);
    }
    else {
      try {
        if (selectedURL.startsWith("webpage")) {
          String newUrl = MixUtils.parseAction(selectedURL);
          dataView.getContext().loadWebPage(newUrl, this);
        }
      } catch (Exception e) {
        e.printStackTrace();
      }
    }
  }

  public static void createContextMenu(ImageView icon) {
    icon.setOnCreateContextMenuListener(new OnCreateContextMenuListener() {        
      @Override
      public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
        int index=0;
        switch(ListItemAdapter.itemPosition){
        case 0:
          menu.setHeaderTitle("Wiki Menu");
          menu.add(index, index, index, "We are working on it...");      
          break;
        case 1:
          menu.setHeaderTitle("Twitter Menu");
          menu.add(index, index, index, "We are working on it...");
          break;
        case 2:
          menu.setHeaderTitle("Buzz Menu");
          menu.add(index, index, index, "We are working on it...");
          break;
        case 3:
          menu.setHeaderTitle("OpenStreetMap Menu");
          menu.add(index, index, index, "We are working on it...");
          break;
        case 4:
          AlertDialog.Builder alert = new AlertDialog.Builder(ctx);
          alert.setTitle("insert your own URL:");

          final EditText input = new EditText(ctx); 
          input.setText(customizedURL);
          alert.setView(input);

          alert.setPositiveButton("OK", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {           
              Editable value = input.getText();
              customizedURL = ""+value;
            }
          });
          alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {           
              dialog.dismiss();
            }
          });
          alert.show();
          break;
        }
      }
    });

  }

  public void clickOnDataSource(int position){
    if(dataView.isFrozen())
      dataView.setFrozen(false);
    switch(position){
    /*WIKIPEDIA*/
    case 0:
      setDataSource("Wikipedia");
      finish();
      break;

      /*TWITTER*/
    case 1:    
      setDataSource("Twitter");
      finish();
      break;

      /*BUZZ*/
    case 2:
      setDataSource("Buzz");
      finish();
      break;

      /*OSM*/
    case 3:
      setDataSource("OpenStreetMap");
      finish();
      break;

      /*Own URL*/
    case 4:
      setDataSource("OwnURL");
      finish();
      break;
      
      /*STREAMING*/
    case 5:
      setDataSource("Streaming");
      finish();
      break;
    }
  }


  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    int base = Menu.FIRST;

    /*define menu items*/
    MenuItem item1 = menu.add(base, base, base, getString(DataView.MENU_ITEM_3)); 
    MenuItem item2 = menu.add(base, base+1, base+1, getString(DataView.MENU_CAM_MODE));

    /*assign icons to the menu items*/
    item1.setIcon(android.R.drawable.ic_menu_mapmode);
    item2.setIcon(android.R.drawable.ic_menu_camera);

    return true;
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item){
    switch(item.getItemId()){
    /*Map View*/
    case 1:
      createMixMap();
      finish();
      break;
      /*back to Camera View*/
    case 2:
      finish();
      break;
    }
    return true;
  }

  @Override
  public boolean onContextItemSelected(MenuItem item) {
    switch(item.getItemId()){
    case 1: 
      break;
    case 2: 
      break;
    }
    return false;
  }

  public void createMixMap(){
    Intent intent2 = new Intent(MixListView.this, MixMap.class); 
    startActivityForResult(intent2, 20);
  }

  public void setDataSource(String source){
    selectedDataSource = source;
  }

  public static String getDataSource(){
    return selectedDataSource;
  }

  public static void setList(int l){
    list = l;
  }

  public static String getSearchQuery(){
    return searchQuery;
  }

  public static void setSearchQuery(String query){
    searchQuery = query;
  }
}

class ListItemAdapter extends BaseAdapter {

  private MixListView mixListView;

  private LayoutInflater myInflater;
  static ViewHolder holder;
  private int[] bgcolors = new int[] {0,0,0,0,0};
  private int[] textcolors = new int[] {Color.WHITE,Color.WHITE,Color.WHITE,Color.WHITE,Color.WHITE};
  private int[] descriptioncolors = new int[] {Color.GRAY,Color.GRAY,Color.GRAY,Color.GRAY,Color.GRAY};

  public static boolean icon_clicked = false;

  public static int itemPosition =0;

  public ListItemAdapter(MixListView mixListView) {
    this.mixListView = mixListView;
    myInflater = LayoutInflater.from(mixListView);
  }

  @Override
  public View getView(final int position, View convertView, ViewGroup parent) {
    itemPosition = position;
    if (convertView==null) {
      convertView = myInflater.inflate(R.layout.main, null);

      holder = new ViewHolder();
      holder.text = (TextView) convertView.findViewById(R.id.list_text);
      holder.description = (TextView) convertView.findViewById(R.id.description_text);

      convertView.setTag(holder);
    }
    else{
      holder = (ViewHolder) convertView.getTag();
    }

    holder.icon = (ImageView) convertView.findViewById(R.id.icon);

    holder.icon.setPadding(20, 8, 20, 8);
    holder.icon.setClickable(true);        

    holder.icon.setOnTouchListener(new View.OnTouchListener() {
      @Override
      public boolean onTouch(View v, MotionEvent event) {
        icon_clicked = true;
        itemPosition = position;

        return false;
      }
    });
    MixListView.createContextMenu(holder.icon);

    if(position!=4){
      holder.icon.setVisibility(View.INVISIBLE);
    }


    holder.text.setPadding(20, 8, 0, 0);
    holder.description.setPadding(20, 40, 0, 0);

    holder.text.setText(mixListView.getDataSourceMenu().get(position));
    holder.description.setText(mixListView.getDataSourceDescription().get(position));

    int colorPos = position % bgcolors.length;
    convertView.setBackgroundColor(bgcolors[colorPos]);
    holder.text.setTextColor(textcolors[colorPos]);
    holder.description.setTextColor(descriptioncolors[colorPos]);

    return convertView;
  }

  public void changeColor(int index, int bgcolor, int textcolor){
    if (index < bgcolors.length) {
      bgcolors[index]=bgcolor;
      textcolors[index]= textcolor;
    }
    else
      Log.d("Color Error", "too large index");
  }

  public void colorSource(String source){
    for (int i = 0; i < bgcolors.length; i++) {
      bgcolors[i]=0;
      textcolors[i]=Color.WHITE;
    }
    if (source.equals("Wikipedia"))
      changeColor(0, Color.WHITE, Color.DKGRAY);
    else if (source.equals("Twitter"))
      changeColor(1, Color.WHITE, Color.DKGRAY);
    else if (source.equals("Buzz"))
      changeColor(2, Color.WHITE, Color.DKGRAY);
    else if (source.equals("OpenStreetMap"))
      changeColor(3, Color.WHITE, Color.DKGRAY);
    else if (source.equals("OwnURL"))
      changeColor(4, Color.WHITE, Color.DKGRAY);
    else if (source.equals("Streaming"))
      changeColor(4, Color.WHITE, Color.DKGRAY);
  }

  @Override
  public int getCount() {
    return mixListView.getDataSourceMenu().size();
  }

  @Override
  public Object getItem(int position) {
    return this;
  }

  @Override
  public long getItemId(int position) {
    return position;
  }

  private class ViewHolder {
    TextView text;
    TextView description;
    ImageView icon;
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.