Author: kmorin Date: 2014-03-02 20:42:31 +0100 (Sun, 02 Mar 2014) New Revision: 60 Url: http://codelutin.com/projects/wlo/repository/revisions/60 Log: refs #4372 navigation ?\195?\160 am?\195?\169liorer refs #4253 proposer le m?\195?\170me principe de navigation disponible actuellement sur le lot feuille (observations) ?\195?\160 toutes les ?\195?\169tapes Added: trunk/res/layout/wlo_list.xml Modified: trunk/src/fr/ifremer/wlo/ScientificSpeciesActivity.java trunk/src/fr/ifremer/wlo/WloBaseListActivity.java trunk/src/fr/ifremer/wlo/measurement/MeasurementActivity.java Copied: trunk/res/layout/wlo_list.xml (from rev 57, trunk/res/layout/measurement.xml) =================================================================== --- trunk/res/layout/wlo_list.xml (rev 0) +++ trunk/res/layout/wlo_list.xml 2014-03-02 19:42:31 UTC (rev 60) @@ -0,0 +1,20 @@ +<?xml version="1.0" encoding="utf-8"?> + +<android.support.v4.widget.DrawerLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/drawer_layout" + android:layout_width="match_parent" + android:layout_height="match_parent"> + + <ListView android:id="@android:id/list" + android:layout_width="match_parent" + android:layout_height="match_parent"/> + + <ListView android:id="@+id/left_drawer" + android:layout_width="240dp" + android:layout_height="match_parent" + android:layout_gravity="start" + android:choiceMode="singleChoice" + android:background="@color/dark_gray"/> + +</android.support.v4.widget.DrawerLayout> \ No newline at end of file Modified: trunk/src/fr/ifremer/wlo/ScientificSpeciesActivity.java =================================================================== --- trunk/src/fr/ifremer/wlo/ScientificSpeciesActivity.java 2014-03-01 21:36:10 UTC (rev 59) +++ trunk/src/fr/ifremer/wlo/ScientificSpeciesActivity.java 2014-03-02 19:42:31 UTC (rev 60) @@ -113,9 +113,10 @@ @Override protected void onListItemClick(ListView l, View v, int position, long id) { ScientificSpeciesModel model = createNewModel(l, position); - Log.d(TAG, model.toString(this) + " clicked"); + updateDrawerItems(model); + Intent intent = new Intent(this, getNextActivity()); intent.putExtra(MeasurementActivity.INTENT_EXTRA_SCIENTIFIC_SPECIES, model); startActivity(intent); Modified: trunk/src/fr/ifremer/wlo/WloBaseListActivity.java =================================================================== --- trunk/src/fr/ifremer/wlo/WloBaseListActivity.java 2014-03-01 21:36:10 UTC (rev 59) +++ trunk/src/fr/ifremer/wlo/WloBaseListActivity.java 2014-03-02 19:42:31 UTC (rev 60) @@ -39,6 +39,7 @@ * #L% */ +import android.app.ActionBar; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; @@ -46,6 +47,8 @@ import android.database.Cursor; import android.os.Bundle; import android.os.Handler; +import android.support.v4.app.ActionBarDrawerToggle; +import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.SimpleCursorAdapter; import android.util.Log; import android.view.ContextMenu; @@ -54,14 +57,29 @@ import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; +import android.widget.ArrayAdapter; import android.widget.ListAdapter; import android.widget.ListView; +import com.google.common.base.Function; +import com.google.common.collect.Lists; import fr.ifremer.wlo.models.BaseModel; +import fr.ifremer.wlo.models.CommercialSpeciesModel; +import fr.ifremer.wlo.models.ContextModel; import fr.ifremer.wlo.models.HierarchicalModel; +import fr.ifremer.wlo.models.LocationModel; +import fr.ifremer.wlo.models.MetierModel; +import fr.ifremer.wlo.models.ScientificSpeciesModel; +import fr.ifremer.wlo.models.VesselModel; import fr.ifremer.wlo.storage.WloSqlOpenHelper; import fr.ifremer.wlo.utils.UIUtils; import fr.ifremer.wlo.utils.WloItemListViewBinder; +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + /** * An activity that displays a list of items by binding to a data source such as * an array or Cursor, and exposes event handlers when the user selects an item. @@ -220,11 +238,18 @@ public static final String INTENT_EXTRA_PARENT_MODEL = "parentModel"; + public static final int REQUEST_EDIT_MODEL = 0; + + protected final static Map<Class, BaseModel> drawerItems = new LinkedHashMap<>(); + protected BaseModel parentModel; protected WloSqlOpenHelper woh; protected SimpleCursorAdapter adapter; + protected ActionBarDrawerToggle mDrawerToggle; + protected ListView mDrawerList; + /** * This field should be made private, so it is hidden from the SDK. * {@hide} @@ -264,7 +289,7 @@ @Override protected Integer getContentView() { - return android.R.layout.list_content; + return R.layout.wlo_list; } protected SimpleCursorAdapter.ViewBinder getAdapterBinder() { @@ -282,13 +307,53 @@ setListAdapter(adapter); registerForContextMenu(mList); + + DrawerLayout mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); + mDrawerList = (ListView) findViewById(R.id.left_drawer); + + // Set the list's click listener + mDrawerList.setOnItemClickListener(new ListView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + selectItem(position); + } + }); + mDrawerList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { + editItem(position); + return true; + } + }); + mDrawerToggle = new ActionBarDrawerToggle( + this, /* host Activity */ + mDrawerLayout, /* DrawerLayout object */ + R.drawable.ic_drawer, /* nav drawer icon to replace 'Up' caret */ + R.string.drawer_open, /* "open drawer" description */ + R.string.drawer_close /* "close drawer" description */ + ); + + // Set the drawer toggle as the DrawerListener + mDrawerLayout.setDrawerListener(mDrawerToggle); + + ActionBar actionBar = getActionBar(); + actionBar.setDisplayHomeAsUpEnabled(true); + actionBar.setHomeButtonEnabled(true); } @Override + protected void onPostCreate(Bundle savedInstanceState) { + super.onPostCreate(savedInstanceState); + // Sync the toggle state after onRestoreInstanceState has occurred. + mDrawerToggle.syncState(); + } + + @Override protected void onResume() { super.onResume(); parentModel = (BaseModel) getIntent().getSerializableExtra(INTENT_EXTRA_PARENT_MODEL); + Log.d(TAG, "resume " + parentModel); if (parentModel != null) { Cursor cursor = getAllData(); Log.d(TAG, "cursor size : " + cursor.getCount()); @@ -299,7 +364,10 @@ String subtitle = getString(subtitleId, parentModel.toString(this)); getSupportActionBar().setSubtitle(subtitle); } + } + // Set the adapter for the list view + setDrawerListAdapter(); } @Override @@ -328,6 +396,12 @@ @Override public boolean onOptionsItemSelected(MenuItem item) { + // Pass the event to ActionBarDrawerToggle, if it returns + // true, then it has handled the app icon touch event + if (mDrawerToggle.onOptionsItemSelected(item)) { + return true; + } + switch (item.getItemId()) { case R.id.add_item: Intent intent = new Intent(this, getEditionActivity()); @@ -338,6 +412,39 @@ return super.onOptionsItemSelected(item); } + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + mDrawerToggle.onConfigurationChanged(newConfig); + } + + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + if (requestCode == REQUEST_EDIT_MODEL && resultCode == RESULT_OK) { + BaseModel editedModel = (BaseModel) data.getSerializableExtra(WloModelEditionActivity.INTENT_EXTRA_MODEL); + if (editedModel != null) { + drawerItems.put(editedModel.getClass(), editedModel); + } + } else { + super.onActivityResult(requestCode, resultCode, data); + } + } + + protected void setDrawerListAdapter() { + List<String> drawerItemsLabels = new ArrayList<>(); + drawerItemsLabels.add(getString(R.string.home_title)); + List<BaseModel> values = new ArrayList<>(drawerItems.values()); + drawerItemsLabels.addAll(Lists.transform(values, new Function<BaseModel, String>() { + @Override + public String apply(BaseModel input) { + return input.toString(WloBaseListActivity.this); + } + })); + mDrawerList.setAdapter(new ArrayAdapter<>(this, + android.R.layout.simple_list_item_1, + drawerItemsLabels)); + } + /** * This method will be called when an item in the list is selected. * Subclasses should override. Subclasses can call @@ -354,6 +461,8 @@ Log.d(TAG, model.toString(this) + " clicked"); + updateDrawerItems(model); + Intent intent = new Intent(this, getNextActivity()); intent.putExtra(INTENT_EXTRA_PARENT_MODEL, model); startActivity(intent); @@ -508,4 +617,101 @@ } }; + protected void updateDrawerItems(M model) { + Class<? extends BaseModel> itemClass = model.getClass(); + BaseModel currentItem = drawerItems.get(itemClass); + if (!model.equals(currentItem)) { + drawerItems.put(itemClass, model); + String itemTable = model.getTableName(); + switch (itemTable) { + case ContextModel.TABLE_NAME: + drawerItems.remove(LocationModel.class); + case LocationModel.TABLE_NAME: + drawerItems.remove(VesselModel.class); + case VesselModel.TABLE_NAME: + drawerItems.remove(MetierModel.class); + case MetierModel.TABLE_NAME: + drawerItems.remove(CommercialSpeciesModel.class); + case CommercialSpeciesModel.TABLE_NAME: + drawerItems.remove(ScientificSpeciesModel.class); + } + } + } + + protected void selectItem(int position) { + Class activityClass; + Class parentModelClass = null; + switch (position) { + case 0: + activityClass = MainActivity.class; + break; + case 1: + activityClass = ContextsActivity.class; + break; + case 2: + activityClass = LocationsActivity.class; + parentModelClass = ContextModel.class; + break; + case 3: + activityClass = VesselsActivity.class; + parentModelClass = LocationModel.class; + break; + case 4: + activityClass = MetiersActivity.class; + parentModelClass = VesselModel.class; + break; + case 5: + activityClass = CommercialSpeciesActivity.class; + parentModelClass = MetierModel.class; + break; + case 6: + activityClass = ScientificSpeciesActivity.class; + parentModelClass = CommercialSpeciesModel.class; + break; + default: + activityClass = null; + } + BaseModel parentModel = drawerItems.get(parentModelClass); + Intent intent = new Intent(this, activityClass); + intent.putExtra(WloBaseListActivity.INTENT_EXTRA_PARENT_MODEL, parentModel); + startActivity(intent); + } + + protected void editItem(int position) { + Class activityClass = null; + Class modelClass = null; + + switch (position) { + case 1: + activityClass = ContextFormActivity.class; + modelClass = ContextModel.class; + break; + case 2: + activityClass = LocationFormActivity.class; + modelClass = LocationModel.class; + break; + case 3: + activityClass = VesselFormActivity.class; + modelClass = VesselModel.class; + break; + case 4: + activityClass = MetierFormActivity.class; + modelClass = MetierModel.class; + break; + case 5: + activityClass = CommercialSpeciesFormActivity.class; + modelClass = CommercialSpeciesModel.class; + break; + case 6: + activityClass = ScientificSpeciesFormActivity.class; + modelClass = ScientificSpeciesModel.class; + break; + } + if (activityClass != null) { + BaseModel model = drawerItems.get(modelClass); + Intent intent = new Intent(this, activityClass); + intent.putExtra(WloModelEditionActivity.INTENT_EXTRA_MODEL, model); + startActivityForResult(intent, REQUEST_EDIT_MODEL); + } + } } Modified: trunk/src/fr/ifremer/wlo/measurement/MeasurementActivity.java =================================================================== --- trunk/src/fr/ifremer/wlo/measurement/MeasurementActivity.java 2014-03-01 21:36:10 UTC (rev 59) +++ trunk/src/fr/ifremer/wlo/measurement/MeasurementActivity.java 2014-03-02 19:42:31 UTC (rev 60) @@ -57,16 +57,21 @@ import com.google.common.base.Function; import com.google.common.collect.Lists; import fr.ifremer.wlo.BigFinCommunicationService; +import fr.ifremer.wlo.CommercialSpeciesActivity; import fr.ifremer.wlo.CommercialSpeciesFormActivity; import fr.ifremer.wlo.MainActivity; import fr.ifremer.wlo.MetierFormActivity; +import fr.ifremer.wlo.MetiersActivity; import fr.ifremer.wlo.R; import fr.ifremer.wlo.ScientificSpeciesActivity; import fr.ifremer.wlo.ScientificSpeciesFormActivity; import fr.ifremer.wlo.VesselFormActivity; +import fr.ifremer.wlo.VesselsActivity; import fr.ifremer.wlo.WloBaseActivity; +import fr.ifremer.wlo.WloBaseListActivity; import fr.ifremer.wlo.WloModelEditionActivity; import fr.ifremer.wlo.models.CategoryWeightModel; +import fr.ifremer.wlo.models.LocationModel; import fr.ifremer.wlo.models.categorization.CategoryModel; import fr.ifremer.wlo.models.categorization.QualitativeValueModel; import fr.ifremer.wlo.models.referentials.CalcifiedPartTaking; @@ -124,6 +129,7 @@ protected CommercialSpeciesModel commercialSpecies; protected MetierModel metier; protected VesselModel vessel; + protected LocationModel location; protected ListView mDrawerList; @@ -188,6 +194,7 @@ measurements.setPrecision(commercialSpecies.getPrecision()); metier = commercialSpecies.getParent(); vessel = metier.getParent(); + location = vessel.getParent(); tabs = (TabHost)findViewById(android.R.id.tabhost); @@ -248,7 +255,20 @@ setDrawerListAdapter(); // Set the list's click listener - mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); + mDrawerList.setOnItemClickListener(new ListView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + selectItem(position); + } + }); + mDrawerList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { + @Override + public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { + editItem(position); + return true; + } + }); + mDrawerToggle = new ActionBarDrawerToggle( this, /* host Activity */ mDrawerLayout, /* DrawerLayout object */ @@ -624,15 +644,15 @@ } protected void setDrawerListAdapter() { - mDrawerList.setAdapter(new ArrayAdapter<String>(this, - android.R.layout.simple_list_item_1, - new String[]{ - getString(R.string.home_title), - vessel.toString(this), - metier.toString(this), - commercialSpecies.toString(this), - scientificSpecies.toString(this) - })); + mDrawerList.setAdapter(new ArrayAdapter<>(this, + android.R.layout.simple_list_item_1, + new String[]{ + getString(R.string.home_title), + vessel.toString(this), + metier.toString(this), + commercialSpecies.toString(this), + scientificSpecies.toString(this) + })); } protected void fetchCalcifiedPartTakings() { @@ -650,15 +670,8 @@ } } - private class DrawerItemClickListener implements ListView.OnItemClickListener { - @Override - public void onItemClick(AdapterView parent, View view, int position, long id) { - selectItem(position); - } - } - /** Swaps fragments in the main content view */ - private void selectItem(int position) { + protected void editItem(int position) { Class clazz; BaseModel modelToEdit; switch (position) { @@ -686,9 +699,44 @@ clazz = null; modelToEdit = null; } - Intent intent = new Intent(this, clazz); - intent.putExtra(WloModelEditionActivity.INTENT_EXTRA_MODEL, modelToEdit); - startActivityForResult(intent, position); + if (clazz != null) { + Intent intent = new Intent(this, clazz); + intent.putExtra(WloModelEditionActivity.INTENT_EXTRA_MODEL, modelToEdit); + startActivityForResult(intent, position); + } } + protected void selectItem(int position) { + Class activityClass; + BaseModel parentModel = null; + switch (position) { + case 0: + activityClass = MainActivity.class; + break; + case 1: + activityClass = VesselsActivity.class; + parentModel = location; + break; + case 2: + activityClass = MetiersActivity.class; + parentModel = vessel; + break; + case 3: + activityClass = CommercialSpeciesActivity.class; + parentModel = metier; + break; + case 4: + activityClass = ScientificSpeciesActivity.class; + parentModel = commercialSpecies; + break; + default: + activityClass = null; + } + if (activityClass != null) { + Intent intent = new Intent(this, activityClass); + intent.putExtra(WloBaseListActivity.INTENT_EXTRA_PARENT_MODEL, parentModel); + startActivity(intent); + } + } + }