aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/apps/cachelist/CacheListAppFactory.java
blob: b6706a0f7900e1ac7ad0cfc266761bdf3d07f2db (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
package cgeo.geocaching.apps.cachelist;

import cgeo.geocaching.Geocache;
import cgeo.geocaching.R;
import cgeo.geocaching.SearchResult;
import cgeo.geocaching.activity.ActivityMixin;
import cgeo.geocaching.apps.AbstractAppFactory;
import cgeo.geocaching.utils.Log;

import android.app.Activity;
import android.content.res.Resources;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;

import java.util.ArrayList;
import java.util.List;

public final class CacheListAppFactory extends AbstractAppFactory {

    private CacheListAppFactory() {
        // utility class
    }

    private static class LazyHolder {
        public static final CacheListApp[] apps = {
                new InternalCacheListMap(),
                new LocusShowCacheListApp(),
                new LocusExportCacheListApp(),
                new MapsWithMeCacheListApp()
        };
    }

    /**
     * @param menu
     * @param activity
     * @param res
     */
    public static void addMenuItems(final Menu menu, final Activity activity, final Resources res) {
        final List<CacheListApp> activeApps = getActiveApps();
        if (activeApps.isEmpty()) {
            return;
        }
        if (activeApps.size() == 1) {
            final MenuItem subItem = menu.findItem(R.id.menu_cache_list_app);
            subItem.setVisible(true);
            subItem.setTitle(activeApps.get(0).getName());
        } else {
            final MenuItem subItem = menu.findItem(R.id.submenu_cache_list_app);
            subItem.setVisible(true);
            final SubMenu subMenu = subItem.getSubMenu();
            for (final CacheListApp app : activeApps) {
                subMenu.add(0, app.getId(), 0, app.getName());
            }
        }
    }

    private static List<CacheListApp> getActiveApps() {
        final List<CacheListApp> activeApps = new ArrayList<>(LazyHolder.apps.length);
        for (final CacheListApp app : LazyHolder.apps) {
            if (app.isInstalled()) {
                activeApps.add(app);
            }
        }
        return activeApps;
    }

    public static boolean onMenuItemSelected(final MenuItem item, final List<Geocache> caches, final Activity activity,
            final SearchResult search) {
        CacheListApp app;
        if (item.getItemId() == R.id.menu_cache_list_app) {
            app = getActiveApps().get(0);
        }
        else {
            app = (CacheListApp) getAppFromMenuItem(item, LazyHolder.apps);
        }
        if (app != null) {
            try {
                final boolean result = app.invoke(caches, activity, search);
                ActivityMixin.invalidateOptionsMenu(activity);
                return result;
            } catch (final Exception e) {
                Log.e("CacheListAppFactory.onMenuItemSelected", e);
            }
        }
        return false;
    }

}