/*
* 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;
}
}
|