diff options
| -rw-r--r-- | main/src/cgeo/geocaching/VisitCacheActivity.java | 344 |
1 files changed, 153 insertions, 191 deletions
diff --git a/main/src/cgeo/geocaching/VisitCacheActivity.java b/main/src/cgeo/geocaching/VisitCacheActivity.java index 0fa2ba0..4dbe7ba 100644 --- a/main/src/cgeo/geocaching/VisitCacheActivity.java +++ b/main/src/cgeo/geocaching/VisitCacheActivity.java @@ -19,15 +19,19 @@ import cgeo.geocaching.utils.LogTemplateProvider.LogContext; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import android.app.AlertDialog; +import android.app.AlertDialog.Builder; import android.app.Dialog; import android.app.ProgressDialog; +import android.content.DialogInterface; +import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; -import android.view.ContextMenu; +import android.util.SparseArray; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; @@ -71,6 +75,7 @@ public class VisitCacheActivity extends AbstractLoggingActivity implements DateD private CheckBox tweetCheck = null; private LinearLayout tweetBox = null; private boolean tbChanged = false; + private SparseArray<TrackableLog> actionButtons; // Data to be saved while reconfiguring private double rating; @@ -113,76 +118,82 @@ public class VisitCacheActivity extends AbstractLoggingActivity implements DateD enablePostButton(true); - // add trackables - if (CollectionUtils.isNotEmpty(trackables)) { - if (inflater == null) { - inflater = getLayoutInflater(); + initializeTrackablesAction(); + updateTrackablesList(); + + showProgress(false); + } + + private void initializeTrackablesAction() { + if (Settings.isTrackableAutoVisit()) { + for (TrackableLog trackable : trackables) { + trackable.action = LogTypeTrackable.VISITED; + tbChanged = true; } + } + } + + private void updateTrackablesList() { + if (CollectionUtils.isEmpty(trackables)) { + return; + } + if (inflater == null) { + inflater = getLayoutInflater(); + } + actionButtons = new SparseArray<TrackableLog>(); + + final LinearLayout inventoryView = (LinearLayout) findViewById(R.id.inventory); + inventoryView.removeAllViews(); - final LinearLayout inventoryView = (LinearLayout) findViewById(R.id.inventory); - inventoryView.removeAllViews(); - - for (TrackableLog tb : trackables) { - LinearLayout inventoryItem = (LinearLayout) inflater.inflate(R.layout.visit_trackable, null); - - ((TextView) inventoryItem.findViewById(R.id.trackcode)).setText(tb.trackCode); - ((TextView) inventoryItem.findViewById(R.id.name)).setText(tb.name); - ((TextView) inventoryItem.findViewById(R.id.action)) - .setText(res.getString(Settings.isTrackableAutoVisit() - ? LogTypeTrackable.VISITED.resourceId - : LogTypeTrackable.DO_NOTHING.resourceId) - + " ▼"); - - inventoryItem.setId(tb.id); - final String tbCode = tb.trackCode; - inventoryItem.setClickable(true); - registerForContextMenu(inventoryItem); - inventoryItem.findViewById(R.id.info).setOnClickListener(new View.OnClickListener() { - - @Override - public void onClick(View view) { - final Intent trackablesIntent = new Intent(VisitCacheActivity.this, TrackableActivity.class); - trackablesIntent.putExtra(EXTRAS_GEOCODE, tbCode); - startActivity(trackablesIntent); - } - }); - inventoryItem.findViewById(R.id.action).setOnClickListener(new View.OnClickListener() { - - @Override - public void onClick(View view) { - openContextMenu(view); - } - }); - - inventoryView.addView(inventoryItem); - - if (Settings.isTrackableAutoVisit()) { - tb.action = LogTypeTrackable.VISITED; - tbChanged = true; + for (TrackableLog tb : trackables) { + LinearLayout inventoryItem = (LinearLayout) inflater.inflate(R.layout.visit_trackable, null); + + ((TextView) inventoryItem.findViewById(R.id.trackcode)).setText(tb.trackCode); + ((TextView) inventoryItem.findViewById(R.id.name)).setText(tb.name); + final TextView actionButton = (TextView) inventoryItem.findViewById(R.id.action); + actionButton.setId(tb.id); + actionButtons.put(actionButton.getId(), tb); + actionButton.setText(res.getString(tb.action.resourceId) + " ▼"); + actionButton.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View view) { + selectTrackableAction(view); } - } + }); - if (inventoryView.getChildCount() > 0) { - findViewById(R.id.inventory_box).setVisibility(View.VISIBLE); - } - if (inventoryView.getChildCount() > 1) { - final LinearLayout inventoryChangeAllView = (LinearLayout) findViewById(R.id.inventory_changeall); + final String tbCode = tb.trackCode; + inventoryItem.setClickable(true); + inventoryItem.findViewById(R.id.info).setOnClickListener(new View.OnClickListener() { - final Button changeButton = (Button) inventoryChangeAllView.findViewById(R.id.changebutton); - registerForContextMenu(changeButton); - changeButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + final Intent trackablesIntent = new Intent(VisitCacheActivity.this, TrackableActivity.class); + trackablesIntent.putExtra(EXTRAS_GEOCODE, tbCode); + startActivity(trackablesIntent); + } + }); - @Override - public void onClick(View view) { - openContextMenu(view); - } - }); + inventoryView.addView(inventoryItem); + } - inventoryChangeAllView.setVisibility(View.VISIBLE); - } + if (inventoryView.getChildCount() > 0) { + findViewById(R.id.inventory_box).setVisibility(View.VISIBLE); } + if (inventoryView.getChildCount() > 1) { + final LinearLayout inventoryChangeAllView = (LinearLayout) findViewById(R.id.inventory_changeall); - showProgress(false); + final Button changeButton = (Button) inventoryChangeAllView.findViewById(R.id.changebutton); + changeButton.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View view) { + selectAllTrackablesAction(); + } + }); + + inventoryChangeAllView.setVisibility(View.VISIBLE); + } } private void enablePostButton(boolean enabled) { @@ -198,20 +209,20 @@ public class VisitCacheActivity extends AbstractLoggingActivity implements DateD } private void updatePostButtonText() { - if (postButton.isEnabled()) { - if (typeSelected == LogType.FOUND_IT && Settings.isGCvoteLogin()) { - if (rating == 0) { - postButton.setText(res.getString(R.string.log_post_no_rate)); - } else { - postButton.setText(res.getString(R.string.log_post_rate) + " " + ratingTextValue(rating) + "*"); - } - } else { - postButton.setText(res.getString(R.string.log_post)); - } + postButton.setText(getPostButtonText()); + } + + private String getPostButtonText() { + if (!postButton.isEnabled()) { + return res.getString(R.string.log_post_not_possible); } - else { - postButton.setText(res.getString(R.string.log_post_not_possible)); + if (typeSelected != LogType.FOUND_IT || !Settings.isGCvoteLogin()) { + return res.getString(R.string.log_post); + } + if (rating == 0) { + return res.getString(R.string.log_post_no_rate); } + return res.getString(R.string.log_post_rate) + " " + ratingTextValue(rating) + "*"; } private final Handler postLogHandler = new Handler() { @@ -318,13 +329,12 @@ public class VisitCacheActivity extends AbstractLoggingActivity implements DateD enablePostButton(false); final Button typeButton = (Button) findViewById(R.id.type); - registerForContextMenu(typeButton); typeButton.setText(typeSelected.getL10n()); typeButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { - openContextMenu(view); + selectLogType(); } }); @@ -411,107 +421,6 @@ public class VisitCacheActivity extends AbstractLoggingActivity implements DateD } @Override - public void onCreateContextMenu(ContextMenu menu, View view, ContextMenu.ContextMenuInfo info) { - super.onCreateContextMenu(menu, view, info); - final int viewId = view.getId(); - - if (viewId == R.id.type) { - for (final LogType typeOne : possibleLogTypes) { - menu.add(viewId, typeOne.id, 0, typeOne.getL10n()); - } - } else if (viewId == R.id.changebutton) { - final int textId = findViewById(viewId).getId(); - - menu.setHeaderTitle(res.getString(R.string.log_tb_changeall)); - for (LogTypeTrackable logType : LogTypeTrackable.values()) { - menu.add(textId, logType.id, 0, res.getString(logType.resourceId)); - } - } else { - final int realViewId = findViewById(viewId).getId(); - - for (final TrackableLog tb : trackables) { - if (tb.id == realViewId) { - menu.setHeaderTitle(tb.name); - } - } - for (LogTypeTrackable logType : LogTypeTrackable.values()) { - menu.add(realViewId, logType.id, 0, res.getString(logType.resourceId)); - } - } - } - - @Override - public boolean onContextItemSelected(MenuItem item) { - final int group = item.getGroupId(); - final int id = item.getItemId(); - - if (group == R.id.type) { - setType(LogType.getById(id)); - return true; - } - - if (group == R.id.changebutton) { - try { - final LogTypeTrackable logType = LogTypeTrackable.findById(id); - if (logType != null) { - final LinearLayout inventView = (LinearLayout) findViewById(R.id.inventory); - for (int count = 0; count < inventView.getChildCount(); count++) { - final LinearLayout tbView = (LinearLayout) inventView.getChildAt(count); - if (tbView == null) { - return false; - } - - final TextView tbText = (TextView) tbView.findViewById(R.id.action); - if (tbText == null) { - return false; - } - tbText.setText(res.getString(logType.resourceId) + " ▼"); - } - for (TrackableLog tb : trackables) { - tb.action = logType; - } - tbChanged = true; - return true; - } - } catch (Exception e) { - Log.e("cgeovisit.onContextItemSelected: " + e.toString()); - } - } else { - try { - final LogTypeTrackable logType = LogTypeTrackable.findById(id); - if (logType != null) { - final LinearLayout tbView = (LinearLayout) findViewById(group); - if (tbView == null) { - return false; - } - - final TextView tbText = (TextView) tbView.findViewById(R.id.action); - if (tbText == null) { - return false; - } - - for (TrackableLog tb : trackables) { - if (tb.id == group) { - tbChanged = true; - - tb.action = logType; - tbText.setText(res.getString(logType.resourceId) + " ▼"); - - Log.i("Trackable " + tb.trackCode + " (" + tb.name + ") has new action: #" + id); - } - } - - return true; - } - } catch (Exception e) { - Log.e("cgeovisit.onContextItemSelected: " + e.toString()); - } - } - - return false; - } - - @Override protected void onSaveInstanceState(final Bundle outState) { super.onSaveInstanceState(outState); outState.putDouble(SAVED_STATE_RATING, rating); @@ -591,7 +500,7 @@ public class VisitCacheActivity extends AbstractLoggingActivity implements DateD setDate(date); final EditText logView = (EditText) findViewById(R.id.log); - logView.setText(""); + logView.setText(StringUtils.EMPTY); clearButton.setOnClickListener(new ClearListener()); @@ -673,23 +582,76 @@ public class VisitCacheActivity extends AbstractLoggingActivity implements DateD return ((EditText) findViewById(R.id.log)).getText().toString(); } - public static class ActivityState { - private final String[] viewstates; - private final List<TrackableLog> trackables; - private final List<LogType> possibleLogTypes; + @Override + protected LogContext getLogContext() { + return new LogContext(cache); + } + + private void selectAllTrackablesAction() { + Builder alert = new AlertDialog.Builder(VisitCacheActivity.this); + alert.setTitle(res.getString(R.string.log_tb_changeall)); + String[] tbLogTypes = getTBLogTypes(); + alert.setItems(tbLogTypes, new OnClickListener() { - public ActivityState(final String[] viewstates, - final List<TrackableLog> trackables, - final List<LogType> possibleLogTypes) { - this.viewstates = viewstates; - this.trackables = trackables; - this.possibleLogTypes = possibleLogTypes; + @Override + public void onClick(DialogInterface dialog, int position) { + final LogTypeTrackable logType = LogTypeTrackable.values()[position]; + for (TrackableLog tb : trackables) { + tb.action = logType; + } + tbChanged = true; + updateTrackablesList(); + dialog.dismiss(); + } + }); + alert.create().show(); + } + + private String[] getTBLogTypes() { + final LogTypeTrackable[] logTypeValues = LogTypeTrackable.values(); + String[] logTypes = new String[logTypeValues.length]; + for (int i = 0; i < logTypes.length; i++) { + logTypes[i] = res.getString(logTypeValues[i].resourceId); } + return logTypes; + } + private void selectLogType() { + Builder alert = new AlertDialog.Builder(VisitCacheActivity.this); + String[] choices = new String[possibleLogTypes.size()]; + for (int i = 0; i < choices.length; i++) { + choices[i] = possibleLogTypes.get(i).getL10n(); + } + alert.setSingleChoiceItems(choices, possibleLogTypes.indexOf(typeSelected), new OnClickListener() { + + @Override + public void onClick(DialogInterface dialog, int position) { + setType(possibleLogTypes.get(position)); + dialog.dismiss(); + } + }); + alert.create().show(); } - @Override - protected LogContext getLogContext() { - return new LogContext(cache); + private void selectTrackableAction(View view) { + final int realViewId = view.getId(); + Builder alert = new AlertDialog.Builder(VisitCacheActivity.this); + final TrackableLog trackableLog = actionButtons.get(realViewId); + alert.setTitle(trackableLog.name); + String[] tbLogTypes = getTBLogTypes(); + alert.setItems(tbLogTypes, new OnClickListener() { + + @Override + public void onClick(DialogInterface dialog, int position) { + final LogTypeTrackable logType = LogTypeTrackable.values()[position]; + tbChanged = true; + trackableLog.action = logType; + Log.i("Trackable " + trackableLog.trackCode + " (" + trackableLog.name + ") has new action: #" + logType); + updateTrackablesList(); + dialog.dismiss(); + } + }); + alert.create().show(); } + } |
