it.tidalwave.bluebill.mobile.android.observation.ObservationActivity Maven / Gradle / Ivy
/***********************************************************************************************************************
*
* blueBill Mobile - open source birdwatching
* ==========================================
*
* Copyright (C) 2009, 2010 by Tidalwave s.a.s. (http://www.tidalwave.it)
* http://bluebill.tidalwave.it/mobile/
*
***********************************************************************************************************************
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
* an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*
***********************************************************************************************************************
*
* $Id: ObservationActivity.java,v 57eae5841cae 2010/06/26 22:16:55 fabrizio $
*
**********************************************************************************************************************/
package it.tidalwave.bluebill.mobile.android.observation;
import javax.annotation.Nonnull;
import javax.inject.Inject;
import android.app.Dialog;
import android.app.ExpandableListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.ExpandableListContextMenuInfo;
import android.widget.ImageButton;
import android.widget.TextView;
import it.tidalwave.util.logging.Logger;
import it.tidalwave.mobile.ui.CommonUITasks;
import it.tidalwave.mobile.android.annotation.AndroidWidget;
import it.tidalwave.mobile.android.ui.AndroidCommonUITasks;
import it.tidalwave.mobile.android.ui.ControlFlow;
import it.tidalwave.bluebill.mobile.observation.ObservationUI;
import it.tidalwave.bluebill.mobile.android.preferences.BlueBillPreferenceActivity;
import it.tidalwave.bluebill.mobile.android.R;
import it.tidalwave.bluebill.mobile.android.about.AboutActivity;
/***********************************************************************************************************************
*
* The main activity for observations. It displays the current observation database and add / edit / etc operations can
* be performed from here.
*
* @author Fabrizio Giudici
* @version $Id: $
*
**********************************************************************************************************************/
public class ObservationActivity extends ExpandableListActivity implements ObservationUI
{
private static final String CLASS = ObservationActivity.class.getName();
private static final Logger logger = Logger.getLogger(CLASS);
private final AndroidObservationUIController controller;
private final AndroidCommonUITasks androidUI = new AndroidCommonUITasks(this);
@Inject @AndroidWidget(R.id.tvFooter)
private TextView tvFooter;
@Inject @AndroidWidget(R.id.empty)
private View viEmpty;
/*******************************************************************************************************************
*
*
******************************************************************************************************************/
public ObservationActivity()
{
controller = new AndroidObservationUIController(this);
}
/*******************************************************************************************************************
*
* For tests.
*
******************************************************************************************************************/
protected ObservationActivity (final @Nonnull AndroidObservationUIController controller)
{
this.controller = controller;
}
/*******************************************************************************************************************
*
*
******************************************************************************************************************/
@Nonnull
public CommonUITasks getCommonUITasks()
{
return androidUI;
}
/*******************************************************************************************************************
*
*
******************************************************************************************************************/
public void setFooterText (final @Nonnull String string)
{
viEmpty.setVisibility(controller.getListAdapter().getGroupCount() == 0 ? View.VISIBLE : View.INVISIBLE);
tvFooter.setText(string);
}
/*******************************************************************************************************************
*
*
******************************************************************************************************************/
@Override
public void onCreate (final @Nonnull Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.observations_activity);
setListAdapter(controller.getListAdapter());
registerForContextMenu(getExpandableListView());
viEmpty = findViewById(R.id.empty);
tvFooter = (TextView)findViewById(R.id.tvFooter);
((ImageButton)findViewById(R.id.btFactSheet)).setOnClickListener(new OnClickListener()
{
public void onClick (final @Nonnull View view)
{
controller.browseToFactSheet();
}
});
((ImageButton)findViewById(R.id.btAdd)).setOnClickListener(new OnClickListener()
{
public void onClick (final @Nonnull View view)
{
controller.startNewObservationSequence();
}
});
}
/*******************************************************************************************************************
*
*
******************************************************************************************************************/
@Override
protected void onResume()
{
controller.fireRefresh(); // e.g. we changed rendering options - FIXME: is this really needed?
super.onResume();
}
/*******************************************************************************************************************
*
*
******************************************************************************************************************/
@Override
public boolean onCreateOptionsMenu (final @Nonnull Menu menu)
{
getMenuInflater().inflate(R.menu.observations_options_menu, menu);
return true;
}
/*******************************************************************************************************************
*
*
******************************************************************************************************************/
@Override
public void onCreateContextMenu (final @Nonnull ContextMenu menu,
final @Nonnull View view,
final @Nonnull ContextMenuInfo menuInfo)
{
final ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo)menuInfo;
final int type = ExpandableListView.getPackedPositionType(info.packedPosition);
int menuId = 0;
switch (type)
{
case ExpandableListView.PACKED_POSITION_TYPE_GROUP:
menuId = R.menu.observations_context_menu;
break;
case ExpandableListView.PACKED_POSITION_TYPE_CHILD:
menuId = R.menu.observation_items_context_menu;
break;
default:
return;
}
getMenuInflater().inflate(menuId, menu);
}
/*******************************************************************************************************************
*
*
******************************************************************************************************************/
@Override
public boolean onContextItemSelected (final @Nonnull MenuItem item)
{
return controller.onContextItemSelected(item);
}
/*******************************************************************************************************************
*
*
******************************************************************************************************************/
@Override @Nonnull
protected Dialog onCreateDialog (final int id)
{
return controller.onCreateDialog(id);
}
/*******************************************************************************************************************
*
*
******************************************************************************************************************/
@Override
protected void onPrepareDialog (final int id, final @Nonnull Dialog dialog)
{
controller.onPrepareDialog(id, dialog);
}
/*******************************************************************************************************************
*
*
******************************************************************************************************************/
@Override
protected void onActivityResult (final int requestCode,
final int resultCode,
final @Nonnull Intent data)
{
logger.info("onActivityResult(%d, %d, %s)", requestCode, resultCode, data);
if (requestCode == ControlFlow.findRequestCode(AddObservationControlFlow.class))
{
switch (resultCode)
{
case RESULT_OK:
// TODO: would be nice to have it called by the ControlFlow.
controller.commitNewObservation();
break;
case RESULT_CANCELED:
// TODO: would be nice to have it called by the ControlFlow.
controller.cancelNewObservation();
break;
}
}
}
/*******************************************************************************************************************
*
*
******************************************************************************************************************/
@Override
public boolean onOptionsItemSelected (final @Nonnull MenuItem item)
{
switch (item.getItemId())
{
case R.id.clearObservations:
controller.deleteAllObservations();
return true;
case R.id.share:
showDialog(R.id.share);
return true;
// case R.id.browse:
// controller.browseToFactSheet();
// return true;
case R.id.preferences:
// FIXME: use ControlFlow
startActivity(new Intent(getBaseContext(), BlueBillPreferenceActivity.class));
return true;
case R.id.about:
// FIXME: use ControlFlow
startActivity(new Intent(getBaseContext(), AboutActivity.class));
return true;
default:
return super.onOptionsItemSelected(item);
}
}
/*******************************************************************************************************************
*
*
******************************************************************************************************************/
public void highlightLatestObservation()
{
try
{
final ExpandableListView expandableListView = getExpandableListView();
final int groupCount = expandableListView.getCount();
for (int i = 0; i < groupCount - 1; i++)
{
expandableListView.collapseGroup(i);
}
expandableListView.expandGroup(groupCount - 1);
}
catch (Exception e) // FIXME: sometime fails for IndexOutOfBoundsException in ObservationListAdapter
{
logger.throwing("highlightLatestObservation()", CLASS, e);
}
}
}