From dc53fa7be33f3052e39952112679c7b0e0b3b324 Mon Sep 17 00:00:00 2001 From: rsudev Date: Thu, 27 Jun 2013 17:46:41 +0200 Subject: Implements #2900, Support logging with password (oc) Extends db, geocache and OKAPI to retrieve and store the property Extends logging UI and OKAPI to allow entering and sending it --- main/res/layout/logcache_activity.xml | 23 ++++++++++++++++++++++ main/res/values/strings.xml | 2 ++ main/src/cgeo/geocaching/Geocache.java | 9 +++++++++ main/src/cgeo/geocaching/LogCacheActivity.java | 22 +++++++++++++++++++-- main/src/cgeo/geocaching/cgData.java | 18 ++++++++++++++--- .../cgeo/geocaching/connector/ILoggingManager.java | 13 ++++++++++++ .../geocaching/connector/NoLoggingManager.java | 2 +- .../geocaching/connector/gc/GCLoggingManager.java | 4 ++-- .../cgeo/geocaching/connector/oc/OkapiClient.java | 9 +++++++-- .../connector/oc/OkapiLoggingManager.java | 6 +++--- 10 files changed, 95 insertions(+), 13 deletions(-) (limited to 'main') diff --git a/main/res/layout/logcache_activity.xml b/main/res/layout/logcache_activity.xml index e0294da..4bbb441 100644 --- a/main/res/layout/logcache_activity.xml +++ b/main/res/layout/logcache_activity.xml @@ -58,6 +58,29 @@ android:singleLine="false" /> + + + + + Caption Description Scaling + Log Password: + Enter your log password No scaling diff --git a/main/src/cgeo/geocaching/Geocache.java b/main/src/cgeo/geocaching/Geocache.java index 68f716b..05423c3 100644 --- a/main/src/cgeo/geocaching/Geocache.java +++ b/main/src/cgeo/geocaching/Geocache.java @@ -135,6 +135,7 @@ public class Geocache implements ICache, IWaypoint { private String nameForSorting; private final EnumSet storageLocation = EnumSet.of(StorageLocation.HEAP); private boolean finalDefined = false; + private boolean logPasswordRequired = false; private int zoomlevel = Tile.ZOOMLEVEL_MAX + 1; private static final Pattern NUMBER_PATTERN = Pattern.compile("\\d+"); @@ -1770,4 +1771,12 @@ public class Geocache implements ICache, IWaypoint { public int getMapMarkerId() { return getConnector().getCacheMapMarkerId(isDisabled() || isArchived()); } + + public boolean isLogPasswordRequired() { + return logPasswordRequired; + } + + public void setLogPasswordRequired(boolean required) { + logPasswordRequired = required; + } } diff --git a/main/src/cgeo/geocaching/LogCacheActivity.java b/main/src/cgeo/geocaching/LogCacheActivity.java index 62c94ce..b3b6c09 100644 --- a/main/src/cgeo/geocaching/LogCacheActivity.java +++ b/main/src/cgeo/geocaching/LogCacheActivity.java @@ -71,6 +71,7 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia private Button postButton = null; private CheckBox tweetCheck = null; private LinearLayout tweetBox = null; + private LinearLayout logPasswordBox = null; private boolean tbChanged = false; private SparseArray actionButtons; @@ -252,6 +253,7 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia postButton = (Button) findViewById(R.id.post); tweetBox = (LinearLayout) findViewById(R.id.tweet_box); tweetCheck = (CheckBox) findViewById(R.id.tweet); + logPasswordBox = (LinearLayout) findViewById(R.id.log_password_box); // initialize with default values setDefaultValues(); @@ -302,6 +304,7 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia tweetCheck.setChecked(true); updateTweetBox(typeSelected); + updateLogPasswordBox(typeSelected); final Button imageButton = (Button) findViewById(R.id.image_btn); imageButton.setOnClickListener(new View.OnClickListener() { @@ -377,6 +380,8 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia final EditText logView = (EditText) findViewById(R.id.log); logView.setText(StringUtils.EMPTY); + final EditText logPasswordView = (EditText) findViewById(R.id.log_password); + logPasswordView.setText(StringUtils.EMPTY); updateImageButton(); @@ -491,6 +496,14 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia } } + private void updateLogPasswordBox(LogType type) { + if (type == LogType.FOUND_IT && cache.isLogPasswordRequired()) { + logPasswordBox.setVisibility(View.VISIBLE); + } else { + logPasswordBox.setVisibility(View.GONE); + } + } + private class DateListener implements View.OnClickListener { @Override @@ -507,7 +520,7 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia final String message = res.getString(StringUtils.isBlank(imageUri.getPath()) ? R.string.log_saving : R.string.log_saving_and_uploading); - new Poster(LogCacheActivity.this, message).execute(currentLogText()); + new Poster(LogCacheActivity.this, message).execute(currentLogText(), currentLogPassword()); } } @@ -520,8 +533,9 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia @Override protected StatusCode doInBackgroundInternal(final String[] logTexts) { final String log = logTexts[0]; + final String logPwd = logTexts.length > 1 ? logTexts[1] : null; try { - final LogResult logResult = loggingManager.postLog(cache, typeSelected, date, log, trackables); + final LogResult logResult = loggingManager.postLog(cache, typeSelected, date, log, logPwd, trackables); if (logResult.getPostLogResult() == StatusCode.NO_ERROR) { final LogEntry logNow = new LogEntry(date, typeSelected, log); @@ -593,6 +607,10 @@ public class LogCacheActivity extends AbstractLoggingActivity implements DateDia return ((EditText) findViewById(R.id.log)).getText().toString(); } + private String currentLogPassword() { + return ((EditText) findViewById(R.id.log_password)).getText().toString(); + } + @Override protected LogContext getLogContext() { return new LogContext(cache); diff --git a/main/src/cgeo/geocaching/cgData.java b/main/src/cgeo/geocaching/cgData.java index 2ef5b27..6f535dc 100644 --- a/main/src/cgeo/geocaching/cgData.java +++ b/main/src/cgeo/geocaching/cgData.java @@ -67,8 +67,8 @@ public class cgData { "difficulty", "direction", "distance", "terrain", "latlon", "location", "elevation", "personal_note", "shortdesc", // 24 25 26 27 28 29 30 31 32 "favourite_cnt", "rating", "votes", "myvote", "disabled", "archived", "members", "found", "favourite", - // 33 34 35 36 37 38 39 40 41 42 - "inventoryunknown", "onWatchlist", "reliable_latlon", "coordsChanged", "latitude", "longitude", "finalDefined", "_id", "inventorycoins", "inventorytags" + // 33 34 35 36 37 38 39 40 41 42 43 + "inventoryunknown", "onWatchlist", "reliable_latlon", "coordsChanged", "latitude", "longitude", "finalDefined", "_id", "inventorycoins", "inventorytags", "logPasswordRequired" // reason is replaced by listId in Geocache }; @@ -86,7 +86,7 @@ public class cgData { private static int[] cacheColumnIndex; private static CacheCache cacheCache = new CacheCache(); private static SQLiteDatabase database = null; - private static final int dbVersion = 67; + private static final int dbVersion = 68; public static final int customListIdOffset = 10; private static final String dbName = "data"; private static final String dbTableCaches = "cg_caches"; @@ -146,6 +146,7 @@ public class cgData { + "onWatchlist integer default 0, " + "coordsChanged integer default 0, " + "finalDefined integer default 0" + + "logPasswordRequired integer default 0" + "); "; private static final String dbCreateLists = "" + "create table " + dbTableLists + " (" @@ -685,6 +686,15 @@ public class cgData { } } + // Introduces logPasswordRequired on caches + if (oldVersion < 68) { + try { + db.execSQL("alter table " + dbTableCaches + " add column logPasswordRequired integer default 0"); + } catch (Exception e) { + Log.e("Failed to upgrade to ver. 68", e); + + } + } } db.setTransactionSuccessful(); @@ -1052,6 +1062,7 @@ public class cgData { values.put("onWatchlist", cache.isOnWatchlist() ? 1 : 0); values.put("coordsChanged", cache.hasUserModifiedCoords() ? 1 : 0); values.put("finalDefined", cache.hasFinalDefined() ? 1 : 0); + values.put("logPasswordRequired", cache.isLogPasswordRequired() ? 1 : 0); init(); @@ -1643,6 +1654,7 @@ public class cgData { cache.setReliableLatLon(cursor.getInt(cacheColumnIndex[35]) > 0); cache.setUserModifiedCoords(cursor.getInt(cacheColumnIndex[36]) > 0); cache.setFinalDefined(cursor.getInt(cacheColumnIndex[39]) > 0); + cache.setLogPasswordRequired(cursor.getInt(cacheColumnIndex[43]) > 0); Log.d("Loading " + cache.toString() + " (" + cache.getListId() + ") from DB"); diff --git a/main/src/cgeo/geocaching/connector/ILoggingManager.java b/main/src/cgeo/geocaching/connector/ILoggingManager.java index f0029f9..c5586b3 100644 --- a/main/src/cgeo/geocaching/connector/ILoggingManager.java +++ b/main/src/cgeo/geocaching/connector/ILoggingManager.java @@ -11,10 +11,23 @@ import java.util.List; public interface ILoggingManager { + /** + * Post a log for a cache online + * + * @param cache + * @param logType + * @param date + * @param log + * @param logPassword + * optional, maybe null + * @param trackableLogs + * @return + */ LogResult postLog(Geocache cache, LogType logType, Calendar date, String log, + String logPassword, List trackableLogs); ImageResult postLogImage(String logId, diff --git a/main/src/cgeo/geocaching/connector/NoLoggingManager.java b/main/src/cgeo/geocaching/connector/NoLoggingManager.java index bfea4ca..04a73c1 100644 --- a/main/src/cgeo/geocaching/connector/NoLoggingManager.java +++ b/main/src/cgeo/geocaching/connector/NoLoggingManager.java @@ -19,7 +19,7 @@ public class NoLoggingManager implements ILoggingManager { } @Override - public LogResult postLog(Geocache cache, LogType logType, Calendar date, String log, List trackableLogs) { + public LogResult postLog(Geocache cache, LogType logType, Calendar date, String log, String logPassword, List trackableLogs) { return new LogResult(StatusCode.LOG_POST_ERROR, ""); } diff --git a/main/src/cgeo/geocaching/connector/gc/GCLoggingManager.java b/main/src/cgeo/geocaching/connector/gc/GCLoggingManager.java index 4f2f8c4..dd150de 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCLoggingManager.java +++ b/main/src/cgeo/geocaching/connector/gc/GCLoggingManager.java @@ -1,10 +1,10 @@ package cgeo.geocaching.connector.gc; import cgeo.geocaching.Geocache; +import cgeo.geocaching.LogCacheActivity; import cgeo.geocaching.R; import cgeo.geocaching.Settings; import cgeo.geocaching.TrackableLog; -import cgeo.geocaching.LogCacheActivity; import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.connector.ILoggingManager; import cgeo.geocaching.connector.ImageResult; @@ -80,7 +80,7 @@ public class GCLoggingManager implements ILoggingManager, LoaderManager.LoaderCa } @Override - public LogResult postLog(Geocache cache, LogType logType, Calendar date, String log, List trackableLogs) { + public LogResult postLog(Geocache cache, LogType logType, Calendar date, String log, String logPassword, List trackableLogs) { try { final ImmutablePair postResult = GCParser.postLog(cache.getGeocode(), cache.getCacheId(), viewstates, logType, diff --git a/main/src/cgeo/geocaching/connector/oc/OkapiClient.java b/main/src/cgeo/geocaching/connector/oc/OkapiClient.java index e2cc7cd..b6f9711 100644 --- a/main/src/cgeo/geocaching/connector/oc/OkapiClient.java +++ b/main/src/cgeo/geocaching/connector/oc/OkapiClient.java @@ -94,6 +94,7 @@ final public class OkapiClient { private static final String CACHE_LOCATION = "location"; private static final String CACHE_NAME = "name"; private static final String CACHE_CODE = "code"; + private static final String CACHE_REQ_PASSWORD = "req_passwd"; private static final String LOG_TYPE = "type"; private static final String LOG_COMMENT = "comment"; @@ -109,7 +110,7 @@ final public class OkapiClient { // Additional: additional fields for full cache (L3 - only for level 3 auth, current - only for connectors with current api) private static final String SERVICE_CACHE_CORE_FIELDS = "code|name|location|type|status|difficulty|terrain|size"; private static final String SERVICE_CACHE_CORE_L3_FIELDS = "is_found"; - private static final String SERVICE_CACHE_ADDITIONAL_FIELDS = "owner|founds|notfounds|rating|rating_votes|recommendations|description|hint|images|latest_logs|date_hidden|alt_wpts|attrnames"; + private static final String SERVICE_CACHE_ADDITIONAL_FIELDS = "owner|founds|notfounds|rating|rating_votes|recommendations|description|hint|images|latest_logs|date_hidden|alt_wpts|attrnames|req_passwd"; private static final String SERVICE_CACHE_ADDITIONAL_CURRENT_FIELDS = "gc_code|attribution_note"; private static final String SERVICE_CACHE_ADDITIONAL_L3_FIELDS = "is_watched"; @@ -195,7 +196,7 @@ final public class OkapiClient { return true; } - public static LogResult postLog(final Geocache cache, LogType logType, Calendar date, String log, OCApiConnector connector) { + public static LogResult postLog(final Geocache cache, LogType logType, Calendar date, String log, String logPassword, OCApiConnector connector) { final Parameters params = new Parameters("cache_code", cache.getGeocode()); params.add("logtype", logType.oc_type); params.add("comment", log); @@ -204,6 +205,9 @@ final public class OkapiClient { if (logType.equals(LogType.NEEDS_MAINTENANCE)) { params.add("needs_maintenance", "true"); } + if (logPassword != null) { + params.add("password", logPassword); + } final JSONObject data = request(connector, OkapiService.SERVICE_SUBMIT_LOG, params); @@ -328,6 +332,7 @@ final public class OkapiClient { if (!response.isNull(CACHE_IS_WATCHED)) { cache.setOnWatchlist(response.getBoolean(CACHE_IS_WATCHED)); } + cache.setLogPasswordRequired(response.getBoolean(CACHE_REQ_PASSWORD)); cache.setDetailedUpdatedNow(); // save full detailed caches diff --git a/main/src/cgeo/geocaching/connector/oc/OkapiLoggingManager.java b/main/src/cgeo/geocaching/connector/oc/OkapiLoggingManager.java index 8a94218..c4bf91f 100644 --- a/main/src/cgeo/geocaching/connector/oc/OkapiLoggingManager.java +++ b/main/src/cgeo/geocaching/connector/oc/OkapiLoggingManager.java @@ -1,8 +1,8 @@ package cgeo.geocaching.connector.oc; import cgeo.geocaching.Geocache; -import cgeo.geocaching.TrackableLog; import cgeo.geocaching.LogCacheActivity; +import cgeo.geocaching.TrackableLog; import cgeo.geocaching.connector.ILoggingManager; import cgeo.geocaching.connector.ImageResult; import cgeo.geocaching.connector.LogResult; @@ -38,8 +38,8 @@ public class OkapiLoggingManager implements ILoggingManager { } @Override - public LogResult postLog(Geocache cache, LogType logType, Calendar date, String log, List trackableLogs) { - return OkapiClient.postLog(cache, logType, date, log, connector); + public LogResult postLog(Geocache cache, LogType logType, Calendar date, String log, String logPassword, List trackableLogs) { + return OkapiClient.postLog(cache, logType, date, log, logPassword, connector); } @Override -- cgit v1.1