diff options
| author | rsudev <rasch@munin-soft.de> | 2013-06-23 22:44:39 +0200 |
|---|---|---|
| committer | rsudev <rasch@munin-soft.de> | 2013-06-23 22:45:45 +0200 |
| commit | 7e271de2385ac1d2193d59f58e3d5e972d306f93 (patch) | |
| tree | dafaa9e52bb378d8cb55c35a77f9cbe9809a1500 /main | |
| parent | f38e587364e95b0fd44eaf81d9c45ca64aa6e4bd (diff) | |
| download | cgeo-7e271de2385ac1d2193d59f58e3d5e972d306f93.zip cgeo-7e271de2385ac1d2193d59f58e3d5e972d306f93.tar.gz cgeo-7e271de2385ac1d2193d59f58e3d5e972d306f93.tar.bz2 | |
Implements #2811 and makes the main screen status fully dynamc
Diffstat (limited to 'main')
| -rw-r--r-- | main/res/layout/main_activity.xml | 13 | ||||
| -rw-r--r-- | main/res/layout/main_activity_connectorstatus.xml | 4 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/MainActivity.java | 105 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/connector/ConnectorFactory.java | 13 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/connector/capability/ILogin.java | 57 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/connector/gc/GCConnector.java | 51 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java | 41 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/connector/oc/OkapiClient.java | 21 |
8 files changed, 207 insertions, 98 deletions
diff --git a/main/res/layout/main_activity.xml b/main/res/layout/main_activity.xml index aff24e1..83a73c8 100644 --- a/main/res/layout/main_activity.xml +++ b/main/res/layout/main_activity.xml @@ -141,6 +141,7 @@ <!-- ** --> <LinearLayout + android:id="@+id/info_area" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentBottom="true" @@ -150,18 +151,6 @@ android:orientation="vertical" > <TextView - android:id="@+id/user_info_gc" - style="@style/location_current" - android:text="@string/init_login_popup_working" - android:visibility="gone" /> - - <TextView - android:id="@+id/user_info_ocde" - style="@style/location_current" - android:text="@string/init_login_popup_working" - android:visibility="gone" /> - - <TextView android:id="@+id/nav_location" style="@style/location_current" android:text="@string/loc_trying" /> diff --git a/main/res/layout/main_activity_connectorstatus.xml b/main/res/layout/main_activity_connectorstatus.xml new file mode 100644 index 0000000..33c4d79 --- /dev/null +++ b/main/res/layout/main_activity_connectorstatus.xml @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="utf-8"?> +<TextView xmlns:android="http://schemas.android.com/apk/res/android" + style="@style/location_current" + android:text="@string/init_login_popup_working" /> diff --git a/main/src/cgeo/geocaching/MainActivity.java b/main/src/cgeo/geocaching/MainActivity.java index 03a1d0d..1672dc1 100644 --- a/main/src/cgeo/geocaching/MainActivity.java +++ b/main/src/cgeo/geocaching/MainActivity.java @@ -5,9 +5,7 @@ import butterknife.Views; import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.connector.ConnectorFactory; -import cgeo.geocaching.connector.IConnector; -import cgeo.geocaching.connector.gc.Login; -import cgeo.geocaching.connector.oc.OCApiLiveConnector; +import cgeo.geocaching.connector.capability.ILogin; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.geopoint.Geopoint; @@ -38,11 +36,13 @@ import android.location.Geocoder; import android.os.Bundle; import android.os.Handler; import android.os.Message; +import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; +import android.widget.LinearLayout; import android.widget.TextView; import java.util.ArrayList; @@ -53,8 +53,6 @@ import java.util.List; import java.util.Locale; public class MainActivity extends AbstractActivity { - @InjectView(R.id.user_info_gc) protected TextView userInfoViewGc; - @InjectView(R.id.user_info_ocde) protected TextView userInfoViewOcDe; @InjectView(R.id.nav_satellites) protected TextView navSatellites; @InjectView(R.id.filter_button_title)protected TextView filterTitle; @InjectView(R.id.map) protected ImageView findOnMap; @@ -67,6 +65,7 @@ public class MainActivity extends AbstractActivity { @InjectView(R.id.nav_accuracy) protected TextView navAccuracy ; @InjectView(R.id.nav_location) protected TextView navLocation ; @InjectView(R.id.offline_count) protected TextView countBubble ; + @InjectView(R.id.info_area) protected LinearLayout infoArea; private static final String SCAN_INTENT = "com.google.zxing.client.android.SCAN"; public static final int SEARCH_REQUEST_CODE = 2; @@ -78,6 +77,7 @@ public class MainActivity extends AbstractActivity { private List<Address> addresses = null; private boolean addressObtaining = false; private boolean initialized = false; + private List<TextView> connectorInfos = new ArrayList<TextView>(); final private UpdateLocation locationUpdater = new UpdateLocation(); @@ -86,47 +86,37 @@ public class MainActivity extends AbstractActivity { @Override public void handleMessage(Message msg) { - //TODO: Rework to be fully dynamic - if (Settings.isGCConnectorActive()) { - StringBuilder userInfo = new StringBuilder("geocaching.com").append(Formatter.SEPARATOR); - if (Login.isActualLoginStatus()) { - userInfo.append(Login.getActualUserName()); - if (Login.getActualCachesFound() >= 0) { - userInfo.append(" (").append(String.valueOf(Login.getActualCachesFound())).append(')'); + // Get active connectors with login status + ILogin[] loginConns = ConnectorFactory.getActiveLiveConnectors(); + + // Adjust number of available connector info views + LayoutInflater inflater = getLayoutInflater(); + while (loginConns.length > connectorInfos.size()) { + TextView connectorInfo = (TextView) inflater.inflate(R.layout.main_activity_connectorstatus, null); + connectorInfos.add(connectorInfo); + infoArea.addView(connectorInfo, connectorInfos.size() - 1); + } + while (loginConns.length < connectorInfos.size()) { + infoArea.removeViewAt(connectorInfos.size() - 1); + connectorInfos.remove(connectorInfos.size() - 1); + } + + // Update UI + int index = 0; + for (ILogin conn : loginConns) { + StringBuilder userInfo = new StringBuilder(conn.getName()).append(Formatter.SEPARATOR); + if (conn.isLoggedIn()) { + userInfo.append(conn.getUserName()); + if (conn.getCachesFound() >= 0) { + userInfo.append(" (").append(String.valueOf(conn.getCachesFound())).append(')'); } userInfo.append(Formatter.SEPARATOR); } - userInfo.append(Login.getActualStatus()); + userInfo.append(conn.getLoginStatusString()); - userInfoViewGc.setText(userInfo.toString()); - userInfoViewGc.setVisibility(View.VISIBLE); + connectorInfos.get(index).setText(userInfo.toString()); + index++; } - else { - userInfoViewGc.setVisibility(View.GONE); - } - - if (Settings.isOCConnectorActive()) { - StringBuilder userInfo = new StringBuilder("opencaching.de").append(Formatter.SEPARATOR); - IConnector conn = ConnectorFactory.getConnector("OCXXXX"); - if (conn instanceof OCApiLiveConnector) { - OCApiLiveConnector ocapiConn = (OCApiLiveConnector) conn; - if (ocapiConn.supportsPersonalization()) { - userInfo.append(ocapiConn.getUserName()); - int count = ocapiConn.getCachesFound(); - if (count >= 0) { - userInfo.append(" (").append(String.valueOf(count)).append(')'); - } - } else { - userInfo.append("Anonymous"); - } - } - userInfoViewOcDe.setText(userInfo.toString()); - userInfoViewOcDe.setVisibility(View.VISIBLE); - } - else { - userInfoViewOcDe.setVisibility(View.GONE); - } - } }; @@ -728,36 +718,11 @@ public class MainActivity extends AbstractActivity { return; } - //TODO: Rework to be fully dynamic - if (Settings.isGCConnectorActive()) { - // login - final StatusCode status = Login.login(); + ILogin[] conns = ConnectorFactory.getActiveLiveConnectors(); - if (status == StatusCode.NO_ERROR) { - app.firstRun = false; - Login.detectGcCustomDate(); - updateUserInfoHandler.sendEmptyMessage(-1); - } - - if (app.showLoginToast) { - firstLoginHandler.sendMessage(firstLoginHandler.obtainMessage(0, status)); - app.showLoginToast = false; - - // invoke settings activity to insert login details - if (status == StatusCode.NO_LOGIN_INFO_STORED) { - SettingsActivity.startActivity(MainActivity.this); - } - } - } - if (Settings.isOCConnectorActive()) { - IConnector conn = ConnectorFactory.getConnector("OCXXXX"); - if (conn instanceof OCApiLiveConnector) { - OCApiLiveConnector ocapiConn = (OCApiLiveConnector) conn; - if (ocapiConn.supportsPersonalization()) { - ocapiConn.retrieveUserInfo(); - } - updateUserInfoHandler.sendEmptyMessage(-1); - } + for (ILogin conn : conns) { + conn.login(firstLoginHandler, MainActivity.this); + updateUserInfoHandler.sendEmptyMessage(-1); } } } diff --git a/main/src/cgeo/geocaching/connector/ConnectorFactory.java b/main/src/cgeo/geocaching/connector/ConnectorFactory.java index a2b0192..c5a083c 100644 --- a/main/src/cgeo/geocaching/connector/ConnectorFactory.java +++ b/main/src/cgeo/geocaching/connector/ConnectorFactory.java @@ -4,6 +4,7 @@ import cgeo.geocaching.ICache; import cgeo.geocaching.R; import cgeo.geocaching.SearchResult; import cgeo.geocaching.Trackable; +import cgeo.geocaching.connector.capability.ILogin; import cgeo.geocaching.connector.capability.ISearchByCenter; import cgeo.geocaching.connector.capability.ISearchByViewPort; import cgeo.geocaching.connector.gc.GCConnector; @@ -27,7 +28,7 @@ public final class ConnectorFactory { private static final UnknownConnector UNKNOWN_CONNECTOR = new UnknownConnector(); private static final IConnector[] CONNECTORS = new IConnector[] { GCConnector.getInstance(), - new OCApiLiveConnector("Opencaching.de", "www.opencaching.de", "OC", R.string.oc_de_okapi_consumer_key, R.string.oc_de_okapi_consumer_secret, ApiSupport.current), + new OCApiLiveConnector("opencaching.de", "www.opencaching.de", "OC", R.string.oc_de_okapi_consumer_key, R.string.oc_de_okapi_consumer_secret, ApiSupport.current), new OCConnector("OpenCaching.CZ", "www.opencaching.cz", "OZ"), new OCApiConnector("OpenCaching.CO.UK", "www.opencaching.org.uk", "OK", "arU4okouc4GEjMniE2fq", ApiSupport.oldapi), new OCConnector("OpenCaching.ES", "www.opencachingspain.es", "OC"), @@ -82,6 +83,16 @@ public final class ConnectorFactory { return searchByCenterConns; } + public static ILogin[] getActiveLiveConnectors() { + final List<ILogin> liveConns = new ArrayList<ILogin>(); + for (final IConnector conn : CONNECTORS) { + if (conn instanceof ILogin && conn.isActivated()) { + liveConns.add((ILogin) conn); + } + } + return liveConns.toArray(new ILogin[liveConns.size()]); + } + public static boolean canHandle(final String geocode) { if (isInvalidGeocode(geocode)) { return false; diff --git a/main/src/cgeo/geocaching/connector/capability/ILogin.java b/main/src/cgeo/geocaching/connector/capability/ILogin.java new file mode 100644 index 0000000..4a839c8 --- /dev/null +++ b/main/src/cgeo/geocaching/connector/capability/ILogin.java @@ -0,0 +1,57 @@ +package cgeo.geocaching.connector.capability; + +import cgeo.geocaching.connector.IConnector; + +import android.content.Context; +import android.os.Handler; + +public interface ILogin extends IConnector { + + + /** + * Contacts the server the connector belongs to + * and verifies/establishes authentication and + * retrieves information about the current user + * (Name, found caches) if applicable. + * + * @param handler + * Handler to receive status feedback + * @param fromActivity + * Calling activity context + * @return true in case of success, false in case of failure + */ + boolean login(Handler handler, Context fromActivity); + + /** + * Returns the status of the last {@link}login() request + * + * @return + */ + boolean isLoggedIn(); + + /** + * User-centered string describing the current login/connection status + * + * @return + */ + String getLoginStatusString(); + + /** + * Name the user has in this connector or empty string if not applicable + * It might be necessary to execute login before this information is valid. + * + * @return + */ + String getUserName(); + + /** + * Number of caches the user has found in this connector + * Normally retrieved/updated with (@see login). + * Might be out dated as changes on the connectors site + * are generally not notified. + * + * @return + */ + int getCachesFound(); + +} diff --git a/main/src/cgeo/geocaching/connector/gc/GCConnector.java b/main/src/cgeo/geocaching/connector/gc/GCConnector.java index fab4332..9e516e9 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCConnector.java +++ b/main/src/cgeo/geocaching/connector/gc/GCConnector.java @@ -5,9 +5,12 @@ import cgeo.geocaching.ICache; import cgeo.geocaching.R; import cgeo.geocaching.SearchResult; import cgeo.geocaching.Settings; +import cgeo.geocaching.SettingsActivity; import cgeo.geocaching.cgData; +import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.connector.AbstractConnector; import cgeo.geocaching.connector.ILoggingManager; +import cgeo.geocaching.connector.capability.ILogin; import cgeo.geocaching.connector.capability.ISearchByCenter; import cgeo.geocaching.connector.capability.ISearchByGeocode; import cgeo.geocaching.connector.capability.ISearchByViewPort; @@ -21,10 +24,12 @@ import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import android.app.Activity; +import android.content.Context; +import android.os.Handler; import java.util.regex.Pattern; -public class GCConnector extends AbstractConnector implements ISearchByGeocode, ISearchByCenter, ISearchByViewPort { +public class GCConnector extends AbstractConnector implements ISearchByGeocode, ISearchByCenter, ISearchByViewPort, ILogin { private static final String CACHE_URL_SHORT = "http://coord.info/"; // Double slash is used to force open in browser @@ -105,7 +110,7 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode, @Override public String getName() { - return "GeoCaching.com"; + return "geocaching.com"; } @Override @@ -282,4 +287,46 @@ public class GCConnector extends AbstractConnector implements ISearchByGeocode, } return R.drawable.marker; } + + @Override + public boolean login(Handler handler, Context fromActivity) { + // login + final StatusCode status = Login.login(); + + if (status == StatusCode.NO_ERROR) { + cgeoapplication.getInstance().firstRun = false; + Login.detectGcCustomDate(); + } + + if (cgeoapplication.getInstance().showLoginToast && handler != null) { + handler.sendMessage(handler.obtainMessage(0, status)); + cgeoapplication.getInstance().showLoginToast = false; + + // invoke settings activity to insert login details + if (status == StatusCode.NO_LOGIN_INFO_STORED && fromActivity != null) { + SettingsActivity.startActivity(fromActivity); + } + } + return status == StatusCode.NO_ERROR; + } + + @Override + public String getUserName() { + return Login.getActualUserName(); + } + + @Override + public int getCachesFound() { + return Login.getActualCachesFound(); + } + + @Override + public String getLoginStatusString() { + return Login.getActualStatus(); + } + + @Override + public boolean isLoggedIn() { + return Login.isActualLoginStatus(); + } } diff --git a/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java b/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java index 4c6db97..87a0fd9 100644 --- a/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java +++ b/main/src/cgeo/geocaching/connector/oc/OCApiLiveConnector.java @@ -1,14 +1,17 @@ package cgeo.geocaching.connector.oc; import cgeo.geocaching.Geocache; +import cgeo.geocaching.R; import cgeo.geocaching.SearchResult; import cgeo.geocaching.Settings; import cgeo.geocaching.cgData; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.connector.ILoggingManager; +import cgeo.geocaching.connector.capability.ILogin; import cgeo.geocaching.connector.capability.ISearchByCenter; import cgeo.geocaching.connector.capability.ISearchByViewPort; import cgeo.geocaching.connector.oc.OkapiClient.UserInfo; +import cgeo.geocaching.connector.oc.OkapiClient.UserInfo.UserInfoStatus; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.Viewport; import cgeo.geocaching.utils.CryptUtils; @@ -16,11 +19,13 @@ import cgeo.geocaching.utils.CryptUtils; import org.apache.commons.lang3.StringUtils; import android.app.Activity; +import android.content.Context; +import android.os.Handler; -public class OCApiLiveConnector extends OCApiConnector implements ISearchByCenter, ISearchByViewPort { +public class OCApiLiveConnector extends OCApiConnector implements ISearchByCenter, ISearchByViewPort, ILogin { private String cS; - private UserInfo userInfo = new UserInfo(StringUtils.EMPTY, 0, false); + private UserInfo userInfo = new UserInfo(StringUtils.EMPTY, 0, UserInfoStatus.NOT_RETRIEVED); public OCApiLiveConnector(String name, String host, String prefix, int cKResId, int cSResId, ApiSupport apiSupport) { super(name, host, prefix, CryptUtils.rot13(cgeoapplication.getInstance().getResources().getString(cKResId)), apiSupport); @@ -104,16 +109,40 @@ public class OCApiLiveConnector extends OCApiConnector implements ISearchByCente return getSupportedAuthLevel() == OAuthLevel.Level3; } - public boolean retrieveUserInfo() { - userInfo = OkapiClient.getUserInfo(this); - return userInfo.isRetrieveSuccessful(); + @Override + public boolean login(Handler handler, Context fromActivity) { + if (supportsPersonalization()) { + userInfo = OkapiClient.getUserInfo(this); + } + return userInfo.getStatus() == UserInfoStatus.SUCCESSFUL; } - public Object getUserName() { + @Override + public String getUserName() { return userInfo.getName(); } + @Override public int getCachesFound() { return userInfo.getFinds(); } + + @Override + public String getLoginStatusString() { + switch (userInfo.getStatus()) { + case NOT_RETRIEVED: + return cgeoapplication.getInstance().getString(R.string.init_login_popup_working); + case SUCCESSFUL: + return cgeoapplication.getInstance().getString(R.string.init_login_popup_ok); + case FAILED: + return cgeoapplication.getInstance().getString(R.string.init_login_popup_failed); + default: + return "Error"; + } + } + + @Override + public boolean isLoggedIn() { + return userInfo.getStatus() == UserInfoStatus.SUCCESSFUL; + } } diff --git a/main/src/cgeo/geocaching/connector/oc/OkapiClient.java b/main/src/cgeo/geocaching/connector/oc/OkapiClient.java index f818a7c..c94cb02 100644 --- a/main/src/cgeo/geocaching/connector/oc/OkapiClient.java +++ b/main/src/cgeo/geocaching/connector/oc/OkapiClient.java @@ -14,6 +14,7 @@ import cgeo.geocaching.connector.LogResult; import cgeo.geocaching.connector.gc.GCConnector; import cgeo.geocaching.connector.oc.OCApiConnector.ApiSupport; import cgeo.geocaching.connector.oc.OCApiConnector.OAuthLevel; +import cgeo.geocaching.connector.oc.OkapiClient.UserInfo.UserInfoStatus; import cgeo.geocaching.enumerations.CacheAttribute; import cgeo.geocaching.enumerations.CacheSize; import cgeo.geocaching.enumerations.CacheType; @@ -664,7 +665,7 @@ final public class OkapiClient { final JSONObject data = request(connector, OkapiService.SERVICE_USER, params); if (data == null) { - return new UserInfo(StringUtils.EMPTY, 0, false); + return new UserInfo(StringUtils.EMPTY, 0, UserInfoStatus.FAILED); } String name = StringUtils.EMPTY; @@ -693,19 +694,25 @@ final public class OkapiClient { success = false; } - return new UserInfo(name, finds, success); + return new UserInfo(name, finds, success ? UserInfoStatus.SUCCESSFUL : UserInfoStatus.FAILED); } public static class UserInfo { + public enum UserInfoStatus { + NOT_RETRIEVED, + SUCCESSFUL, + FAILED + } + private final String name; private final int finds; - private final boolean retrieveSuccessful; + private final UserInfoStatus status; - UserInfo(String name, int finds, boolean retrieveSuccessful) { + UserInfo(String name, int finds, UserInfoStatus status) { this.name = name; this.finds = finds; - this.retrieveSuccessful = retrieveSuccessful; + this.status = status; } public String getName() { @@ -716,8 +723,8 @@ final public class OkapiClient { return finds; } - public boolean isRetrieveSuccessful() { - return retrieveSuccessful; + public UserInfoStatus getStatus() { + return status; } } |
