diff options
| author | Bananeweizen <bananeweizen@gmx.de> | 2012-06-03 11:36:29 +0200 |
|---|---|---|
| committer | Bananeweizen <bananeweizen@gmx.de> | 2012-06-03 11:36:29 +0200 |
| commit | 661fe873ef6bbdaa69b6d164c15bb6657d31a7a0 (patch) | |
| tree | 59bdbb1c7d794b75ebc4ff8720aaff57ab17a057 | |
| parent | d384d2cd3f45a1559ae721a7fd30333fd7d1e61b (diff) | |
| download | cgeo-661fe873ef6bbdaa69b6d164c15bb6657d31a7a0.zip cgeo-661fe873ef6bbdaa69b6d164c15bb6657d31a7a0.tar.gz cgeo-661fe873ef6bbdaa69b6d164c15bb6657d31a7a0.tar.bz2 | |
refactoring: extract logging UI to its own class
* use alert builder instead of sub menus
| -rw-r--r-- | main/src/cgeo/geocaching/AbstractPopupActivity.java | 32 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/CacheDetailActivity.java | 12 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/activity/AbstractActivity.java | 6 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/activity/AbstractListActivity.java | 6 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/activity/ActivityMixin.java | 29 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/activity/IAbstractActivity.java | 2 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/cgCache.java | 13 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/cgeocaches.java | 10 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/ui/AbstractUIFactory.java | 9 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/ui/LoggingUI.java | 104 |
10 files changed, 140 insertions, 83 deletions
diff --git a/main/src/cgeo/geocaching/AbstractPopupActivity.java b/main/src/cgeo/geocaching/AbstractPopupActivity.java index 819aa68..a119949 100644 --- a/main/src/cgeo/geocaching/AbstractPopupActivity.java +++ b/main/src/cgeo/geocaching/AbstractPopupActivity.java @@ -4,12 +4,12 @@ import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.apps.cache.navi.NavigationAppFactory; import cgeo.geocaching.enumerations.CacheSize; import cgeo.geocaching.enumerations.LoadFlags; -import cgeo.geocaching.enumerations.LogType; import cgeo.geocaching.gcvote.GCVote; import cgeo.geocaching.gcvote.GCVoteRating; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.Units; import cgeo.geocaching.ui.CacheDetailsCreator; +import cgeo.geocaching.ui.LoggingUI; import cgeo.geocaching.utils.GeoDirHandler; import cgeo.geocaching.utils.Log; @@ -123,15 +123,6 @@ public abstract class AbstractPopupActivity extends AbstractActivity { geocode = cache.getGeocode().toUpperCase(); } - private void logOffline(int menuItem) { - cache.logOffline(this, LogType.getById(menuItem - MENU_LOG_VISIT_OFFLINE)); - } - - private void logVisit() { - cache.logVisit(this); - finish(); - } - private void showInBrowser() { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.geocaching.com/seek/cache_details.aspx?wp=" + cache.getGeocode()))); } @@ -173,7 +164,7 @@ public abstract class AbstractPopupActivity extends AbstractActivity { public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, MENU_DEFAULT_NAVIGATION, 0, NavigationAppFactory.getDefaultNavigationApplication().getName()).setIcon(R.drawable.ic_menu_compass); // default navigation tool menu.add(0, MENU_NAVIGATION, 0, res.getString(R.string.cache_menu_navigate)).setIcon(R.drawable.ic_menu_mapmode); - addVisitMenu(menu, cache); + LoggingUI.addMenuItems(menu, cache); menu.add(0, MENU_CACHES_AROUND, 0, res.getString(R.string.cache_menu_around)).setIcon(R.drawable.ic_menu_rotate); // caches around menu.add(0, MENU_SHOW_IN_BROWSER, 0, res.getString(R.string.cache_menu_browser)).setIcon(R.drawable.ic_menu_info_details); // browser @@ -187,21 +178,20 @@ public abstract class AbstractPopupActivity extends AbstractActivity { switch (menuItem) { case MENU_DEFAULT_NAVIGATION: navigateTo(); - break; + return true; case MENU_NAVIGATION: showNavigationMenu(); - break; + return true; case MENU_CACHES_AROUND: cachesAround(); - break; - case MENU_LOG_VISIT: - logVisit(); - break; + return true; case MENU_SHOW_IN_BROWSER: showInBrowser(); - break; - default: - logOffline(menuItem); + return true; + } + + if (LoggingUI.onMenuItemSelected(item, this, cache)) { + return true; } return true; @@ -223,7 +213,7 @@ public abstract class AbstractPopupActivity extends AbstractActivity { menu.findItem(MENU_NAVIGATION).setVisible(visible); menu.findItem(MENU_CACHES_AROUND).setVisible(visible); - menu.findItem(MENU_LOG_VISIT).setEnabled(Settings.isLogin()); + LoggingUI.onPrepareOptionsMenu(menu); } catch (Exception e) { // nothing } diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java index f897ffe..b5a22c0 100644 --- a/main/src/cgeo/geocaching/CacheDetailActivity.java +++ b/main/src/cgeo/geocaching/CacheDetailActivity.java @@ -20,6 +20,7 @@ import cgeo.geocaching.network.Parameters; import cgeo.geocaching.ui.CacheDetailsCreator; import cgeo.geocaching.ui.DecryptTextClickListener; import cgeo.geocaching.ui.Formatter; +import cgeo.geocaching.ui.LoggingUI; import cgeo.geocaching.utils.BaseUtils; import cgeo.geocaching.utils.CancellableHandler; import cgeo.geocaching.utils.ClipboardUtils; @@ -556,7 +557,7 @@ public class CacheDetailActivity extends AbstractActivity { GeneralAppsFactory.addMenuItems(subMenu, cache); menu.add(1, MENU_CALENDAR, 0, res.getString(R.string.cache_menu_event)).setIcon(R.drawable.ic_menu_agenda); // add event to calendar - addVisitMenu(menu, cache); + LoggingUI.addMenuItems(menu, cache); menu.add(0, MENU_CACHES_AROUND, 0, res.getString(R.string.cache_menu_around)).setIcon(R.drawable.ic_menu_rotate); // caches around menu.add(1, MENU_BROWSER, 0, res.getString(R.string.cache_menu_browser)).setIcon(R.drawable.ic_menu_globe); // browser menu.add(0, MENU_SHARE, 0, res.getString(R.string.cache_menu_share)).setIcon(R.drawable.ic_menu_share); // share cache @@ -584,10 +585,6 @@ public class CacheDetailActivity extends AbstractActivity { case MENU_DEFAULT_NAVIGATION: startDefaultNavigation(); return true; - case MENU_LOG_VISIT: - refreshOnResume = true; - cache.logVisit(this); - return true; case MENU_BROWSER: cache.openInBrowser(this); return true; @@ -610,8 +607,11 @@ public class CacheDetailActivity extends AbstractActivity { if (GeneralAppsFactory.onMenuItemSelected(item, this, cache)) { return true; } + if (LoggingUI.onMenuItemSelected(item, this, cache)) { + refreshOnResume = true; + return true; + } - cache.logOffline(this, LogType.getById(menuItem - MENU_LOG_VISIT_OFFLINE)); return true; } diff --git a/main/src/cgeo/geocaching/activity/AbstractActivity.java b/main/src/cgeo/geocaching/activity/AbstractActivity.java index 5a90238..a648486 100644 --- a/main/src/cgeo/geocaching/activity/AbstractActivity.java +++ b/main/src/cgeo/geocaching/activity/AbstractActivity.java @@ -1,7 +1,6 @@ package cgeo.geocaching.activity; import cgeo.geocaching.Settings; -import cgeo.geocaching.cgCache; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.compatibility.Compatibility; import cgeo.geocaching.network.Cookies; @@ -10,7 +9,6 @@ import android.app.Activity; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.Bundle; -import android.view.Menu; import android.view.View; import android.widget.EditText; @@ -90,10 +88,6 @@ public abstract class AbstractActivity extends Activity implements IAbstractActi ActivityMixin.keepScreenOn(this, keepScreenOn); } - public void addVisitMenu(Menu menu, cgCache cache) { - ActivityMixin.addVisitMenu(this, menu, cache); - } - protected static void disableSuggestions(final EditText edit) { Compatibility.disableSuggestions(edit); } diff --git a/main/src/cgeo/geocaching/activity/AbstractListActivity.java b/main/src/cgeo/geocaching/activity/AbstractListActivity.java index a209b23..dc9c0fe 100644 --- a/main/src/cgeo/geocaching/activity/AbstractListActivity.java +++ b/main/src/cgeo/geocaching/activity/AbstractListActivity.java @@ -1,6 +1,5 @@ package cgeo.geocaching.activity; -import cgeo.geocaching.cgCache; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.compatibility.Compatibility; @@ -8,7 +7,6 @@ import android.app.ListActivity; import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.os.Bundle; -import android.view.Menu; import android.view.View; public abstract class AbstractListActivity extends ListActivity implements @@ -85,10 +83,6 @@ public abstract class AbstractListActivity extends ListActivity implements ActivityMixin.setTitle(this, title); } - public void addVisitMenu(Menu menu, cgCache cache) { - ActivityMixin.addVisitMenu(this, menu, cache); - } - @Override public void invalidateOptionsMenuCompatible() { Compatibility.invalidateOptionsMenu(this); diff --git a/main/src/cgeo/geocaching/activity/ActivityMixin.java b/main/src/cgeo/geocaching/activity/ActivityMixin.java index 8d5611b..8900593 100644 --- a/main/src/cgeo/geocaching/activity/ActivityMixin.java +++ b/main/src/cgeo/geocaching/activity/ActivityMixin.java @@ -2,10 +2,8 @@ package cgeo.geocaching.activity; import cgeo.geocaching.R; import cgeo.geocaching.Settings; -import cgeo.geocaching.cgCache; import cgeo.geocaching.cgeo; import cgeo.geocaching.compatibility.Compatibility; -import cgeo.geocaching.enumerations.LogType; import org.apache.commons.lang3.StringUtils; @@ -14,11 +12,8 @@ import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; -import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.view.Gravity; -import android.view.Menu; -import android.view.SubMenu; import android.view.View; import android.view.WindowManager; import android.widget.ProgressBar; @@ -27,10 +22,7 @@ import android.widget.Toast; import gnu.android.app.appmanualclient.AppManualReaderClient; -import java.util.List; - public final class ActivityMixin { - private static final int MENU_ICON_LOG_VISIT = R.drawable.ic_menu_edit; public final static void goHome(final Activity fromActivity) { final Intent intent = new Intent(fromActivity, cgeo.class); @@ -129,27 +121,6 @@ public final class ActivityMixin { helpDialog(activity, title, message, null); } - protected static void addVisitMenu(IAbstractActivity activity, Menu menu, cgCache cache) { - if (cache == null) { - return; - } - if (!cache.supportsLogging()) { - return; - } - Resources res = ((Activity) activity).getResources(); - if (Settings.getLogOffline()) { - SubMenu logMenu = menu.addSubMenu(1, IAbstractActivity.MENU_LOG_VISIT_OFFLINE, 0, res.getString(R.string.cache_menu_visit_offline)).setIcon(MENU_ICON_LOG_VISIT); - List<LogType> logTypes = cache.getPossibleLogTypes(); - for (LogType logType : logTypes) { - logMenu.add(1, IAbstractActivity.MENU_LOG_VISIT_OFFLINE + logType.id, 0, logType.getL10n()); - } - logMenu.add(1, IAbstractActivity.MENU_LOG_VISIT, 0, res.getString(R.string.cache_menu_visit)); - } - else { - menu.add(1, IAbstractActivity.MENU_LOG_VISIT, 0, res.getString(R.string.cache_menu_visit)).setIcon(MENU_ICON_LOG_VISIT); - } - } - public static void keepScreenOn(final Activity abstractActivity, boolean keepScreenOn) { if (keepScreenOn) { abstractActivity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); diff --git a/main/src/cgeo/geocaching/activity/IAbstractActivity.java b/main/src/cgeo/geocaching/activity/IAbstractActivity.java index 2503b99..04709c6 100644 --- a/main/src/cgeo/geocaching/activity/IAbstractActivity.java +++ b/main/src/cgeo/geocaching/activity/IAbstractActivity.java @@ -3,8 +3,6 @@ package cgeo.geocaching.activity; import android.view.View; public interface IAbstractActivity { - static final int MENU_LOG_VISIT = 100; - static final int MENU_LOG_VISIT_OFFLINE = 101; public void goHome(View view); diff --git a/main/src/cgeo/geocaching/cgCache.java b/main/src/cgeo/geocaching/cgCache.java index c765678..fce7709 100644 --- a/main/src/cgeo/geocaching/cgCache.java +++ b/main/src/cgeo/geocaching/cgCache.java @@ -1,6 +1,7 @@ package cgeo.geocaching; import cgeo.geocaching.cgData.StorageLocation; +import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.activity.IAbstractActivity; import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.connector.IConnector; @@ -404,28 +405,28 @@ public class cgCache implements ICache, IWaypoint { ((Activity) fromActivity).startActivity(logVisitIntent); } - public void logOffline(final IAbstractActivity fromActivity, final LogType logType) { + public void logOffline(final Activity fromActivity, final LogType logType) { final boolean mustIncludeSignature = StringUtils.isNotBlank(Settings.getSignature()) && Settings.isAutoInsertSignature(); final String initial = mustIncludeSignature ? LogTemplateProvider.applyTemplates(Settings.getSignature(), true) : ""; logOffline(fromActivity, initial, Calendar.getInstance(), logType); } - void logOffline(final IAbstractActivity fromActivity, final String log, Calendar date, final LogType logType) { + void logOffline(final Activity fromActivity, final String log, Calendar date, final LogType logType) { if (logType == LogType.UNKNOWN) { return; } - cgeoapplication app = (cgeoapplication) ((Activity) fromActivity).getApplication(); + cgeoapplication app = (cgeoapplication) fromActivity.getApplication(); final boolean status = app.saveLogOffline(geocode, date.getTime(), logType, log); - Resources res = ((Activity) fromActivity).getResources(); + Resources res = fromActivity.getResources(); if (status) { - fromActivity.showToast(res.getString(R.string.info_log_saved)); + ActivityMixin.showToast(fromActivity, res.getString(R.string.info_log_saved)); app.saveVisitDate(geocode); logOffline = true; notifyChange(); } else { - fromActivity.showToast(res.getString(R.string.err_log_post_failed)); + ActivityMixin.showToast(fromActivity, res.getString(R.string.err_log_post_failed)); } } diff --git a/main/src/cgeo/geocaching/cgeocaches.java b/main/src/cgeo/geocaching/cgeocaches.java index 4951f9f..81c29e0 100644 --- a/main/src/cgeo/geocaching/cgeocaches.java +++ b/main/src/cgeo/geocaching/cgeocaches.java @@ -12,7 +12,6 @@ import cgeo.geocaching.connector.gc.SearchHandler; import cgeo.geocaching.enumerations.CacheListType; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.enumerations.LoadFlags; -import cgeo.geocaching.enumerations.LogType; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.export.ExportFactory; import cgeo.geocaching.files.GPXImporter; @@ -28,6 +27,7 @@ import cgeo.geocaching.sorting.ComparatorUserInterface; import cgeo.geocaching.sorting.EventDateComparator; import cgeo.geocaching.sorting.VisitComparator; import cgeo.geocaching.ui.CacheListAdapter; +import cgeo.geocaching.ui.LoggingUI; import cgeo.geocaching.utils.GeoDirHandler; import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.RunnableWithArgument; @@ -922,7 +922,7 @@ public class cgeocaches extends AbstractListActivity { if (cache.getCoords() != null) { menu.add(0, MENU_DEFAULT_NAVIGATION, 0, NavigationAppFactory.getDefaultNavigationApplication().getName()); menu.add(1, MENU_NAVIGATION, 0, res.getString(R.string.cache_menu_navigate)).setIcon(R.drawable.ic_menu_mapmode); - addVisitMenu(menu, cache); + LoggingUI.addMenuItems(menu, cache); menu.add(0, MENU_CACHE_DETAILS, 0, res.getString(R.string.cache_menu_details)); } if (cache.isOffline()) { @@ -984,9 +984,6 @@ public class cgeocaches extends AbstractListActivity { case MENU_NAVIGATION: NavigationAppFactory.showNavigationMenu(this, cache, null, null); break; - case MENU_LOG_VISIT: - cache.logVisit(this); - break; case MENU_CACHE_DETAILS: final Intent cachesIntent = new Intent(this, CacheDetailActivity.class); cachesIntent.putExtra("geocode", cache.getGeocode().toUpperCase()); @@ -1024,8 +1021,7 @@ public class cgeocaches extends AbstractListActivity { // in Android: // https://code.google.com/p/android/issues/detail?id=7139 lastMenuInfo = info; - // create a search for a single cache (as if in details view) - cache.logOffline(this, LogType.getById(id - MENU_LOG_VISIT_OFFLINE)); + LoggingUI.onMenuItemSelected(item, this, cache); } return true; diff --git a/main/src/cgeo/geocaching/ui/AbstractUIFactory.java b/main/src/cgeo/geocaching/ui/AbstractUIFactory.java new file mode 100644 index 0000000..2351383 --- /dev/null +++ b/main/src/cgeo/geocaching/ui/AbstractUIFactory.java @@ -0,0 +1,9 @@ +package cgeo.geocaching.ui; + +import cgeo.geocaching.cgeoapplication; + +import android.content.res.Resources; + +public class AbstractUIFactory { + protected final static Resources res = cgeoapplication.getInstance().getResources(); +} diff --git a/main/src/cgeo/geocaching/ui/LoggingUI.java b/main/src/cgeo/geocaching/ui/LoggingUI.java new file mode 100644 index 0000000..90130f8 --- /dev/null +++ b/main/src/cgeo/geocaching/ui/LoggingUI.java @@ -0,0 +1,104 @@ +package cgeo.geocaching.ui; + +import cgeo.geocaching.R; +import cgeo.geocaching.Settings; +import cgeo.geocaching.cgCache; +import cgeo.geocaching.activity.IAbstractActivity; +import cgeo.geocaching.enumerations.LogType; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.view.Menu; +import android.view.MenuItem; +import android.widget.ArrayAdapter; + +import java.util.ArrayList; +import java.util.List; + +public class LoggingUI extends AbstractUIFactory { + public static class LogTypeEntry { + private final LogType logType; + + public LogTypeEntry(final LogType logType) { + this.logType = logType; + } + + @Override + public String toString() { + if (logType == null) { + return res.getString(R.string.cache_menu_visit); + } + return logType.getL10n(); + } + } + + private static final int MENU_ICON_LOG_VISIT = R.drawable.ic_menu_edit; + private static final int MENU_LOG_VISIT = 100; + private static final int MENU_LOG_VISIT_OFFLINE = 101; + + public static void addMenuItems(final Menu menu, final cgCache cache) { + if (cache == null) { + return; + } + if (!cache.supportsLogging()) { + return; + } + if (Settings.getLogOffline()) { + menu.add(0, MENU_LOG_VISIT_OFFLINE, 0, res.getString(R.string.cache_menu_visit_offline)).setIcon(MENU_ICON_LOG_VISIT); + } + else { + menu.add(0, MENU_LOG_VISIT, 0, res.getString(R.string.cache_menu_visit)).setIcon(MENU_ICON_LOG_VISIT); + } + } + + public static boolean onMenuItemSelected(final MenuItem item, IAbstractActivity activity, cgCache cache) { + switch (item.getItemId()) { + case MENU_LOG_VISIT: + cache.logVisit(activity); + return true; + case MENU_LOG_VISIT_OFFLINE: + showOfflineMenu(cache, (Activity) activity); + return true; + default: + return false; + } + } + + private static void showOfflineMenu(final cgCache cache, final Activity activity) { + final List<LogType> logTypes = cache.getPossibleLogTypes(); + final ArrayList<LogTypeEntry> list = new ArrayList<LogTypeEntry>(); + for (LogType logType : logTypes) { + list.add(new LogTypeEntry(logType)); + } + // online logging + list.add(new LogTypeEntry(null)); + + final AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle(R.string.cache_menu_visit_offline); + + final ArrayAdapter<LogTypeEntry> adapter = new ArrayAdapter<LogTypeEntry>(activity, android.R.layout.select_dialog_item, list); + + builder.setAdapter(adapter, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int item) { + final LogTypeEntry logTypeEntry = adapter.getItem(item); + if (logTypeEntry.logType != null) { + cache.logOffline(activity, logTypeEntry.logType); + } else { + cache.logVisit((IAbstractActivity) activity); + } + } + }); + + builder.create().show(); + + } + + public static void onPrepareOptionsMenu(Menu menu) { + final MenuItem item = menu.findItem(MENU_LOG_VISIT); + if (item != null) { + item.setEnabled(Settings.isLogin()); + } + } +} |
