aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/ui/LoggingUI.java
blob: 26159471c81b5c5c48978f63f7fb7e2afc804f2c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
package cgeo.geocaching.ui;

import cgeo.geocaching.Geocache;
import cgeo.geocaching.LogEntry;
import cgeo.geocaching.R;
import cgeo.geocaching.Settings;
import cgeo.geocaching.cgData;
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;
        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 final String getL10n() {
            return res.getString(stringId);
        }
    }

    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 Geocache 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, Geocache 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 Geocache cache, final Activity activity) {
        final LogEntry currentLog = cgData.loadLogOffline(cache.getGeocode());
        final LogType currentLogType = currentLog == null ? null : currentLog.type;

        final List<LogType> logTypes = cache.getPossibleLogTypes();
        final ArrayList<LogTypeEntry> list = new ArrayList<LogTypeEntry>();
        for (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<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) {
                    switch (logTypeEntry.specialLogType) {
                        case LOG_CACHE:
                            cache.logVisit((IAbstractActivity) activity);
                            break;

                        case CLEAR_LOG:
                            cgData.clearLogOffline(cache.getGeocode());
                            break;
                    }
                } else {
                    cache.logOffline(activity, logTypeEntry.logType);
                }
            }
        });

        builder.create().show();

    }

    public static void onPrepareOptionsMenu(Menu menu) {
        final MenuItem item = menu.findItem(MENU_LOG_VISIT);
        if (item != null) {
            item.setEnabled(Settings.isLogin());
        }
    }
}