/*
* GeoSolutions map - Digital field mapping on Android based devices
* Copyright (C) 2013 GeoSolutions (www.geo-solutions.it)
*
* 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 it.geosolutions.android.map.fragment.sources;
import it.geosolutions.android.map.R;
import it.geosolutions.android.map.activities.NewSourceActivity;
import it.geosolutions.android.map.adapters.LayerStoreAdapter;
import it.geosolutions.android.map.common.Constants;
import it.geosolutions.android.map.model.stores.LayerStore;
import it.geosolutions.android.map.utils.LocalPersistence;
import java.util.ArrayList;
import java.util.List;
import android.content.Intent;
import android.content.res.Resources;
import android.os.Bundle;
import android.support.v4.app.LoaderManager.LoaderCallbacks;
import android.support.v4.content.Loader;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ImageButton;
import android.widget.ListView;
import com.actionbarsherlock.app.SherlockListFragment;
import com.actionbarsherlock.view.ActionMode;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
/**
* This fragment shows a list of Sources from the local storage.
* Allow to edit and add new Sources. Implements CAB for long press
* and item selection allow source delete.
*
*
* @author Lorenzo Natali (www.geo-solutions.it)
*/
public class SourcesFragment extends SherlockListFragment implements LayerStoreProvider,LoaderCallbacks<List<LayerStore>>,ActionMode.Callback {
private static final int LOADER_INDEX = 50;
private static final String CONTENTS = "MSM_CONTENT";
private LayerStoreAdapter adapter;
private ActionMode actionMode = null;
private ArrayList<LayerStore> selected = new ArrayList<LayerStore>();
private List<LayerStore> stores = null;
/**
* Called only once
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
adapter = new LayerStoreAdapter(getSherlockActivity(),
R.layout.sources_row,this);
setListAdapter(adapter);
//star loading Layers
getSherlockActivity().getSupportLoaderManager().initLoader(LOADER_INDEX, null, this);
return inflater.inflate(R.layout.sources_fragment, container,
false);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
//set the listener for add button
ImageButton add = (ImageButton) view.findViewById(R.id.sources_add);
add.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(getActivity(),NewSourceActivity.class);
getActivity().startActivityForResult(i,Constants.requestCodes.CREATE_SOURCE);
}
});
//
//Set Contextual ACTION BAR CALLBACKS
//
final SourcesFragment callback = this;
ListView lv = getListView();
lv.setLongClickable(true);
lv.setClickable(true);
lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
//edit - delete
lv.setOnItemLongClickListener(new OnItemLongClickListener() {
public boolean onItemLongClick (AdapterView<?> parent, View view, int position, long id) {
LayerStore sel = adapter.getItem(position);
if(!selected.contains(sel)){
getListView().setItemChecked(position, true);
selected.add(sel);
}else{
getListView().setItemChecked(position, false);
selected.remove(sel);
}
int numSelected = selected.size();
if(numSelected>0){
if(actionMode != null){
updateCAB(numSelected);
}else{
actionMode = getSherlockActivity().startActionMode(callback);
//override the done button to deselect all when the button is pressed
int doneButtonId = Resources.getSystem().getIdentifier("action_mode_close_button", "id", "android");
View doneButton = getActivity().findViewById(doneButtonId);
doneButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getListView().clearChoices();
selected = new ArrayList<LayerStore>();
actionMode.finish();
}
});
}
}else{
if(actionMode !=null){
actionMode.finish();
}
}
view.setSelected(true);
return true;
}
});
//browse
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
LayerStore s = (LayerStore)adapter.getItem(position);
s.openDetails(getSherlockActivity());
}
});
super.onViewCreated(view, savedInstanceState);
}
/* (non-Javadoc)
* @see it.geosolutions.android.map.fragment.sources.LayerStoreProvider#getSources()
*/
@Override
public List<LayerStore> getSources() {
stores = (List<LayerStore>)LocalPersistence.readObjectFromFile(getSherlockActivity(), LocalPersistence.SOURCES);
return stores;
}
/* (non-Javadoc)
* @see android.support.v4.app.LoaderManager.LoaderCallbacks#onCreateLoader(int, android.os.Bundle)
*/
@Override
public Loader<List<LayerStore>> onCreateLoader(int arg0, Bundle arg1) {
Loader<List<LayerStore>> l = new LayerStoreLoader(getSherlockActivity(),this);
l.forceLoad();
return l;
}
/* (non-Javadoc)
* @see android.support.v4.app.LoaderManager.LoaderCallbacks#onLoadFinished(android.support.v4.content.Loader, java.lang.Object)
*/
@Override
public void onLoadFinished(Loader<List<LayerStore>> loader, List<LayerStore> result) {
adapter.clear();
ArrayList<LayerStore> ll = new ArrayList<LayerStore>();
if(result != null){
int size = result.size();
Log.v("SOURCES","Loaded sources:"+size);
if(size > 0){
for(LayerStore ls : result){
adapter.add(ls );
}
}
}
adapter.notifyDataSetChanged();
}
/* (non-Javadoc)
* @see android.support.v4.app.LoaderManager.LoaderCallbacks#onLoaderReset(android.support.v4.content.Loader)
*/
@Override
public void onLoaderReset(Loader<List<LayerStore>> arg0) {
adapter.clear();
}
/**
* reloadStores and clean Contextual Action Bar if present
*/
public void reloadStores(){
Log.v("SOURCES","reloading sources");
Loader l = getSherlockActivity().getSupportLoaderManager().getLoader(LOADER_INDEX);
if(l!=null){
adapter.clear();
l.forceLoad();
}
if(actionMode!=null){
actionMode.finish();
selected = new ArrayList<LayerStore>();
getListView().clearChoices();
getListView().clearFocus();
}
}
// ACTION MODE CALLBACKS
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
int number =selected.size();
updateCAB(number);
return false;
}
public void onDestroyActionMode(ActionMode mode) {
selected = new ArrayList<LayerStore>();
getListView().clearChoices();
getListView().clearFocus();
actionMode = null;
adapter.notifyDataSetChanged();
}
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.delete_menu, menu);
this.actionMode =mode;
return true;
}
public boolean onActionItemClicked(ActionMode mode, MenuItem menu) {
if(menu.getItemId()==R.id.delete){
stores.removeAll(selected);
saveSources(stores);
}else if(menu.getItemId() == R.id.edit){
LayerStore ls = selected.get(0);
if(ls!=null){
ls.openEdit(getSherlockActivity());
}
}
selected = new ArrayList<LayerStore>();
getListView().clearChoices();
getListView().clearFocus();
mode.finish();
reloadStores();
actionMode=null;
return true;
}
private void saveSources(List<LayerStore> sources) {
LocalPersistence.writeObjectToFile(this.getActivity(), sources, LocalPersistence.SOURCES);
}
/**
* Update the contextual action bar for the number of item selected
* @param numSelected
*/
private void updateCAB(int numSelected) {
if(actionMode == null) return ;
Menu menu = actionMode.getMenu();
if(numSelected == 1){
if(selected.get(0).canEdit()){
menu.findItem(R.id.edit).setVisible(true);
}else{
menu.findItem(R.id.edit).setVisible(false);
}
}else{
menu.findItem(R.id.edit).setVisible(false);
}
String title = getResources().getQuantityString(R.plurals.quantity_sources_selected,numSelected,numSelected );
actionMode.setTitle(title);
}
}