package cgeo.geocaching.log; import cgeo.geocaching.R; import cgeo.geocaching.models.Geocache; import cgeo.geocaching.settings.Settings; import cgeo.geocaching.storage.DataStore; import cgeo.geocaching.ui.AbstractUIFactory; 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 final class LoggingUI extends AbstractUIFactory { private LoggingUI() { // utility class } public static class LogTypeEntry { private final LogType logType; private final SpecialLogType specialLogType; private final boolean isActive; public LogTypeEntry(final LogType logType, final SpecialLogType specialLogType, final boolean isActive) { this.logType = logType; this.specialLogType = specialLogType; this.isActive = isActive; } @Override public String toString() { if (logType == null) { return specialLogType.getL10n(); } String text = logType.getL10n(); if (isActive) { text += " ✔"; } return text; } } private enum SpecialLogType { LOG_CACHE(R.string.cache_menu_visit), CLEAR_LOG(R.string.log_clear); private final int stringId; SpecialLogType(final int stringId) { this.stringId = stringId; } public String getL10n() { return res.getString(stringId); } } public static boolean onMenuItemSelected(final MenuItem item, final Activity activity, final Geocache cache, final DialogInterface.OnDismissListener listener) { switch (item.getItemId()) { case R.id.menu_log_visit: cache.logVisit(activity); return true; case R.id.menu_log_visit_offline: showOfflineMenu(cache, activity, listener); return true; default: return false; } } private static void showOfflineMenu(final Geocache cache, final Activity activity, final DialogInterface.OnDismissListener listener) { final LogEntry currentLog = DataStore.loadLogOffline(cache.getGeocode()); final LogType currentLogType = currentLog == null ? null : currentLog.getType(); final List<LogType> logTypes = cache.getPossibleLogTypes(); final ArrayList<LogTypeEntry> list = new ArrayList<>(); for (final LogType logType : logTypes) { list.add(new LogTypeEntry(logType, null, logType == currentLogType)); } if (cache.isLogOffline()) { list.add(new LogTypeEntry(null, SpecialLogType.CLEAR_LOG, false)); } list.add(new LogTypeEntry(null, SpecialLogType.LOG_CACHE, false)); final AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setTitle(R.string.cache_menu_visit_offline); final ArrayAdapter<LogTypeEntry> adapter = new ArrayAdapter<>(activity, android.R.layout.select_dialog_item, list); builder.setAdapter(adapter, new DialogInterface.OnClickListener() { @Override public void onClick(final DialogInterface dialog, final int item) { final LogTypeEntry logTypeEntry = adapter.getItem(item); if (logTypeEntry.logType == null) { switch (logTypeEntry.specialLogType) { case LOG_CACHE: cache.logVisit(activity); break; case CLEAR_LOG: cache.clearOfflineLog(); break; } } else { cache.logOffline(activity, logTypeEntry.logType); } dialog.dismiss(); } }); final AlertDialog alertDialog = builder.create(); alertDialog.setOnDismissListener(listener); alertDialog.show(); } public static void onPrepareOptionsMenu(final Menu menu, final Geocache cache) { if (cache == null) { return; } final MenuItem itemLog = menu.findItem(R.id.menu_log_visit); itemLog.setVisible(cache.supportsLogging() && !Settings.getLogOffline()); final MenuItem itemOffline = menu.findItem(R.id.menu_log_visit_offline); itemOffline.setVisible(cache.supportsLogging() && Settings.getLogOffline()); } public static void addMenuItems(final Activity activity, final Menu menu, final Geocache cache) { activity.getMenuInflater().inflate(R.menu.logging_ui, menu); onPrepareOptionsMenu(menu, cache); } }