diff options
Diffstat (limited to 'main/src')
10 files changed, 86 insertions, 100 deletions
diff --git a/main/src/cgeo/geocaching/ImageSelectActivity.java b/main/src/cgeo/geocaching/ImageSelectActivity.java index 572ac31..9b29c38 100644 --- a/main/src/cgeo/geocaching/ImageSelectActivity.java +++ b/main/src/cgeo/geocaching/ImageSelectActivity.java @@ -1,18 +1,17 @@ package cgeo.geocaching; import cgeo.geocaching.activity.AbstractActivity; +import cgeo.geocaching.compatibility.Compatibility; import cgeo.geocaching.utils.Log; import org.apache.commons.lang3.StringUtils; -import android.annotation.SuppressLint; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; -import android.os.Environment; import android.provider.MediaStore; import android.provider.MediaStore.MediaColumns; import android.view.View; @@ -46,7 +45,7 @@ public class ImageSelectActivity extends AbstractActivity { private Uri imageUri; public ImageSelectActivity() { - super("ImageSelectActivity"); + super("c:geo-selectimage"); } @Override @@ -126,14 +125,9 @@ public class ImageSelectActivity extends AbstractActivity { } @Override - public void onStop() { - super.onStop(); - } - - @Override protected void onSaveInstanceState(final Bundle outState) { super.onSaveInstanceState(outState); - currentEditTexts(); + syncEditTexts(); outState.putString(SAVED_STATE_IMAGE_CAPTION, imageCaption); outState.putString(SAVED_STATE_IMAGE_DESCRIPTION, imageDescription); outState.putString(SAVED_STATE_IMAGE_URI, imageUri != null ? imageUri.getPath() : StringUtils.EMPTY); @@ -142,7 +136,7 @@ public class ImageSelectActivity extends AbstractActivity { public void saveImageInfo(boolean saveInfo) { if (saveInfo) { Intent intent = new Intent(); - currentEditTexts(); + syncEditTexts(); intent.putExtra(EXTRAS_CAPTION, imageCaption); intent.putExtra(EXTRAS_DESCRIPTION, imageDescription); intent.putExtra(EXTRAS_URI_AS_STRING, imageUri.toString()); @@ -155,7 +149,7 @@ public class ImageSelectActivity extends AbstractActivity { finish(); } - private void currentEditTexts() { + private void syncEditTexts() { imageCaption = captionView.getText().toString(); imageDescription = descriptionView.getText().toString(); } @@ -172,10 +166,6 @@ public class ImageSelectActivity extends AbstractActivity { } private void selectImageFromStorage() { - //Intent intent = new Intent(Intent.ACTION_GET_CONTENT); - - //Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); - //intent.addCategory(Intent.CATEGORY_OPENABLE); Intent intent = new Intent(Intent.ACTION_GET_CONTENT); intent.setType("image/jpeg"); @@ -186,22 +176,12 @@ public class ImageSelectActivity extends AbstractActivity { protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_CANCELED) { // User cancelled the image capture - showToast("Cancelled"); + showToast(getResources().getString(R.string.info_select_logimage_cancelled)); return; } if (resultCode == RESULT_OK) { - if (requestCode == SELECT_NEW_IMAGE) { - - // Image captured and saved to fileUri specified in the Intent - //TODO: Some camera program ignore the URI passed in and store it in a location given in data - showToast("Image saved to:\n" + imageUri);//data.getData()); - if (data != null) { - Log.d("SELECT_NEW_IMAGE data = " + data.toString()); - } else { - Log.d("SELECT_NEW_IMAGE data is null"); - } - } else if (requestCode == SELECT_STORED_IMAGE) { + if (data != null) { Uri selectedImage = data.getData(); String[] filePathColumn = { MediaColumns.DATA }; @@ -212,16 +192,18 @@ public class ImageSelectActivity extends AbstractActivity { String filePath = cursor.getString(columnIndex); imageUri = Uri.parse(filePath); cursor.close(); - if (data != null) { - Log.d("SELECT_STORED_IMAGE data = " + data.toString()); - } else { - Log.d("SELECT_STORED_IMAGE data is null"); - } - // imageUri = data.getData(); + + Log.d("SELECT IMAGE data = " + data.toString()); + } else { + Log.d("SELECT IMAGE data is null"); + } + + if (requestCode == SELECT_NEW_IMAGE) { + showToast(getResources().getString(R.string.info_stored_image) + "\n" + imageUri); } } else { // Image capture failed, advise user - showToast("Unknown Error"); + showToast(getResources().getString(R.string.err_aquire_image_failed)); return; } @@ -231,7 +213,7 @@ public class ImageSelectActivity extends AbstractActivity { private void loadImagePreview() { if (!new File(imageUri.getPath()).exists()) { - Log.i("loading Image Preview with nonexistant file"); + Log.i("Image does not exist"); return; } @@ -248,14 +230,11 @@ public class ImageSelectActivity extends AbstractActivity { } /** Create a File for saving an image or video */ - @SuppressLint("NewApi") - // TODO: Get rid of that suppress private static File getOutputImageFile() { // To be safe, you should check that the SDCard is mounted // using Environment.getExternalStorageState() before doing this. - File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory( - Environment.DIRECTORY_PICTURES), "cgeo"); + File mediaStorageDir = new File(Compatibility.getExternalPictureDir(), "cgeo"); // This location works best if you want the created images to be shared // between applications and persist after your app has been uninstalled. diff --git a/main/src/cgeo/geocaching/VisitCacheActivity.java b/main/src/cgeo/geocaching/VisitCacheActivity.java index b2c6625..43c439b 100644 --- a/main/src/cgeo/geocaching/VisitCacheActivity.java +++ b/main/src/cgeo/geocaching/VisitCacheActivity.java @@ -324,6 +324,7 @@ public class VisitCacheActivity extends AbstractLoggingActivity implements DateD } } updatePostButtonText(); + setImageButtonText(); enablePostButton(false); final Button typeButton = (Button) findViewById(R.id.type); @@ -412,6 +413,8 @@ public class VisitCacheActivity extends AbstractLoggingActivity implements DateD final EditText logView = (EditText) findViewById(R.id.log); logView.setText(StringUtils.EMPTY); + setImageButtonText(); + showToast(res.getString(R.string.info_log_cleared)); } @@ -480,7 +483,8 @@ public class VisitCacheActivity extends AbstractLoggingActivity implements DateD outState.putInt(SAVED_STATE_TYPE, typeSelected.id); outState.putLong(SAVED_STATE_DATE, date.getTimeInMillis()); outState.putString(SAVED_STATE_IMAGE_URI, imageUri.getPath()); - Log.d("saved state"); + outState.putString(SAVED_STATE_IMAGE_CAPTION, imageCaption); + outState.putString(SAVED_STATE_IMAGE_DESCRIPTION, imageDescription); } @Override @@ -552,25 +556,23 @@ public class VisitCacheActivity extends AbstractLoggingActivity implements DateD } public StatusCode postLogFn(String log) { + + StatusCode result = StatusCode.LOG_POST_ERROR; + try { - // test call only - // if (imageUri != null) { - // final StatusCode status = GCParser.uploadLogImage("289163155", imageUri); - // if (status == StatusCode.LOG_POST_ERROR) { - // return status; - // } - // } final ImmutablePair<StatusCode, String> logResult = GCParser.postLog(geocode, cacheid, viewstates, typeSelected, date.get(Calendar.YEAR), (date.get(Calendar.MONTH) + 1), date.get(Calendar.DATE), log, trackables); + result = logResult.left; + if (logResult.left == StatusCode.NO_ERROR) { final LogEntry logNow = new LogEntry(date, typeSelected, log); cache.getLogs().add(0, logNow); - if (typeSelected == LogType.FOUND_IT) { + if (typeSelected == LogType.FOUND_IT || typeSelected == LogType.ATTENDED) { cache.setFound(true); } @@ -591,11 +593,11 @@ public class VisitCacheActivity extends AbstractLoggingActivity implements DateD GCVote.setRating(cache, rating); } - if (StringUtils.isNotBlank(imageUri.getPath())) { - final StatusCode status = GCParser.uploadLogImage(logResult.right, imageCaption, imageDescription, imageUri); + if (logResult.left == StatusCode.NO_ERROR && StringUtils.isNotBlank(imageUri.getPath())) { + result = GCParser.uploadLogImage(logResult.right, imageCaption, imageDescription, imageUri); } - return logResult.left; + return result; } catch (Exception e) { Log.e("cgeovisit.postLogFn", e); } @@ -707,19 +709,18 @@ public class VisitCacheActivity extends AbstractLoggingActivity implements DateD imageCaption = data.getStringExtra(ImageSelectActivity.EXTRAS_CAPTION); imageDescription = data.getStringExtra(ImageSelectActivity.EXTRAS_DESCRIPTION); imageUri = Uri.parse(data.getStringExtra(ImageSelectActivity.EXTRAS_URI_AS_STRING)); - // Image captured and saved to fileUri specified in the Intent - showToast("Image saved to:\n" + imageUri); - } else if (resultCode == RESULT_CANCELED) { - // User cancelled the image capture - showToast("Cancelled"); - } else { + } else if (resultCode != RESULT_CANCELED) { // Image capture failed, advise user - showToast("Unknown Error"); + showToast(getResources().getString(R.string.err_select_logimage_failed)); } - final Button imageButton = (Button) findViewById(R.id.image_btn); - imageButton.setText(StringUtils.isNotBlank(imageUri.getPath()) ? - res.getString(R.string.log_image_edit) : res.getString(R.string.log_image_attach)); + setImageButtonText(); } } + + private void setImageButtonText() { + final Button imageButton = (Button) findViewById(R.id.image_btn); + imageButton.setText(StringUtils.isNotBlank(imageUri.getPath()) ? + res.getString(R.string.log_image_edit) : res.getString(R.string.log_image_attach)); + } } diff --git a/main/src/cgeo/geocaching/compatibility/AndroidLevel8.java b/main/src/cgeo/geocaching/compatibility/AndroidLevel8.java index a388adb..e250934 100644 --- a/main/src/cgeo/geocaching/compatibility/AndroidLevel8.java +++ b/main/src/cgeo/geocaching/compatibility/AndroidLevel8.java @@ -5,9 +5,12 @@ import cgeo.geocaching.utils.Log; import android.annotation.TargetApi; import android.app.Activity; import android.app.backup.BackupManager; +import android.os.Environment; import android.view.Display; import android.view.Surface; +import java.io.File; + @TargetApi(8) public class AndroidLevel8 implements AndroidLevel8Interface { @@ -41,4 +44,10 @@ public class AndroidLevel8 implements AndroidLevel8Interface { return 0; } + + @Override + public File getExternalPictureDir() { + return Environment.getExternalStoragePublicDirectory( + Environment.DIRECTORY_PICTURES); + } } diff --git a/main/src/cgeo/geocaching/compatibility/AndroidLevel8Emulation.java b/main/src/cgeo/geocaching/compatibility/AndroidLevel8Emulation.java index 197993d..996c527 100644 --- a/main/src/cgeo/geocaching/compatibility/AndroidLevel8Emulation.java +++ b/main/src/cgeo/geocaching/compatibility/AndroidLevel8Emulation.java @@ -3,8 +3,11 @@ package cgeo.geocaching.compatibility; import android.annotation.TargetApi; import android.app.Activity; import android.content.res.Configuration; +import android.os.Environment; import android.view.Display; +import java.io.File; + @TargetApi(value = 7) public class AndroidLevel8Emulation implements AndroidLevel8Interface { @@ -27,4 +30,10 @@ public class AndroidLevel8Emulation implements AndroidLevel8Interface { } return 0; } + + @Override + public File getExternalPictureDir() { + // Use externalStorage/Pictures as default + return new File(Environment.getExternalStorageDirectory(), "Pictures"); + } } diff --git a/main/src/cgeo/geocaching/compatibility/AndroidLevel8Interface.java b/main/src/cgeo/geocaching/compatibility/AndroidLevel8Interface.java index 761c23a..75998aa 100644 --- a/main/src/cgeo/geocaching/compatibility/AndroidLevel8Interface.java +++ b/main/src/cgeo/geocaching/compatibility/AndroidLevel8Interface.java @@ -2,9 +2,13 @@ package cgeo.geocaching.compatibility; import android.app.Activity; +import java.io.File; + public interface AndroidLevel8Interface { public int getRotation(final Activity activity); public void dataChanged(final String name); public int getRotationOffset(final Activity activity); + + public File getExternalPictureDir(); }
\ No newline at end of file diff --git a/main/src/cgeo/geocaching/compatibility/Compatibility.java b/main/src/cgeo/geocaching/compatibility/Compatibility.java index 05a3331..d846bda 100644 --- a/main/src/cgeo/geocaching/compatibility/Compatibility.java +++ b/main/src/cgeo/geocaching/compatibility/Compatibility.java @@ -13,6 +13,8 @@ import android.os.Build; import android.text.InputType; import android.widget.EditText; +import java.io.File; + public final class Compatibility { private final static int sdkVersion = Build.VERSION.SDK_INT; @@ -108,4 +110,8 @@ public final class Compatibility { return level13.getDisplaySize(); } + public static File getExternalPictureDir() { + return level8.getExternalPictureDir(); + } + } diff --git a/main/src/cgeo/geocaching/connector/gc/GCConstants.java b/main/src/cgeo/geocaching/connector/gc/GCConstants.java index 8660ec4..295ffb8 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCConstants.java +++ b/main/src/cgeo/geocaching/connector/gc/GCConstants.java @@ -149,6 +149,7 @@ public final class GCConstants { public final static Pattern PATTERN_MAINTENANCE = Pattern.compile("<span id=\"ctl00_ContentBody_LogBookPanel1_lbConfirm\"[^>]*>([^<]*<font[^>]*>)?([^<]+)(</font>[^<]*)?</span>", Pattern.CASE_INSENSITIVE); public final static Pattern PATTERN_OK1 = Pattern.compile("<h2[^>]*>[^<]*<span id=\"ctl00_ContentBody_lbHeading\"[^>]*>[^<]*</span>[^<]*</h2>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE); public final static Pattern PATTERN_OK2 = Pattern.compile("<div id=[\"|']ctl00_ContentBody_LogBookPanel1_ViewLogPanel[\"|']>", Pattern.CASE_INSENSITIVE); + public final static Pattern PATTERN_OK_IMAGEUPLOAD = Pattern.compile("<div id=[\"|']ctl00_ContentBody_ImageUploadControl1_uxUploadDonePanel[\"|']>", Pattern.CASE_INSENSITIVE); public final static Pattern PATTERN_VIEWSTATEFIELDCOUNT = Pattern.compile("id=\"__VIEWSTATEFIELDCOUNT\"[^(value)]+value=\"(\\d+)\"[^>]+>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE); public final static Pattern PATTERN_VIEWSTATES = Pattern.compile("id=\"__VIEWSTATE(\\d*)\"[^(value)]+value=\"([^\"]+)\"[^>]+>", Pattern.CASE_INSENSITIVE | Pattern.MULTILINE); public final static Pattern PATTERN_USERTOKEN = Pattern.compile("userToken\\s*=\\s*'([^']+)'"); diff --git a/main/src/cgeo/geocaching/connector/gc/GCParser.java b/main/src/cgeo/geocaching/connector/gc/GCParser.java index 23102c9..494e040 100644 --- a/main/src/cgeo/geocaching/connector/gc/GCParser.java +++ b/main/src/cgeo/geocaching/connector/gc/GCParser.java @@ -1073,7 +1073,7 @@ public abstract class GCParser { if (loginState == StatusCode.NO_ERROR) { page = Network.getResponseData(Network.getRequest(uri)); } else { - Log.e("xxx upload: No login (error: " + loginState + ')'); + Log.e("Image upload: No login (error: " + loginState + ')'); return StatusCode.NOT_LOGGED_IN; } } @@ -1091,42 +1091,18 @@ public abstract class GCParser { final File image = new File(imageUri.getPath()); final String response = Network.getResponseData(Network.postRequest(uri, uploadParams, "ctl00$ContentBody$ImageUploadControl1$uxFileUpload", "image/jpeg", image)); - //TODO: check response and return correct error codes - - /* - * String page = Login.postRequestLogged(uri, params); - * if (!Login.getLoginStatus(page)) { - * Log.e("GCParser.postLogTrackable: Can not log in geocaching"); - * return StatusCode.NOT_LOGGED_IN; - * } - * - * try { - * - * final MatcherWrapper matcherOk = new MatcherWrapper(GCConstants.PATTERN_OK1, page); - * if (matcherOk.find()) { - * Log.i("Log successfully posted to cache #" + cacheid); - * - * if (geocode != null) { - * cgData.saveVisitDate(geocode); - * } - * - * Login.getLoginStatus(page); - * // the log-successful-page contains still the old value - * if (Login.getActualCachesFound() >= 0) { - * Login.setActualCachesFound(Login.getActualCachesFound() + 1); - * } - * - * final String logID = BaseUtils.getMatch(page, GCConstants.PATTERN_LOG_IMAGE_UPLOAD, ""); - * - * return StatusCode.NO_ERROR; - * } - * } catch (Exception e) { - * Log.e("GCParser.postLog.check", e); - * } - */ - Log.e("GCParser.postLog: Failed to post log because of unknown error"); - return StatusCode.LOG_POST_ERROR; + MatcherWrapper matcherOK = new MatcherWrapper(GCConstants.PATTERN_OK_IMAGEUPLOAD, response); + + if (matcherOK.find()) { + Log.i("Logimage successfully uploaded."); + + return StatusCode.NO_ERROR; + } + Log.e("GCParser.uploadLogIMage: Failed to upload image because of unknown error"); + + return StatusCode.LOGIMAGE_POST_ERROR; } + public static StatusCode postLogTrackable(final String tbid, final String trackingCode, final String[] viewstates, final LogType logType, final int year, final int month, final int day, final String log) { if (Login.isEmpty(viewstates)) { diff --git a/main/src/cgeo/geocaching/enumerations/StatusCode.java b/main/src/cgeo/geocaching/enumerations/StatusCode.java index dc62225..102b9e9 100644 --- a/main/src/cgeo/geocaching/enumerations/StatusCode.java +++ b/main/src/cgeo/geocaching/enumerations/StatusCode.java @@ -23,7 +23,8 @@ public enum StatusCode { LOG_POST_ERROR(R.string.err_log_post_failed), NO_LOG_TEXT(R.string.warn_log_text_fill), NO_DATA_FROM_SERVER(R.string.err_log_failed_server), - NOT_LOGGED_IN(R.string.init_login_popup_failed); + NOT_LOGGED_IN(R.string.init_login_popup_failed), + LOGIMAGE_POST_ERROR(R.string.err_logimage_post_failed); final private int error_string; diff --git a/main/src/cgeo/geocaching/utils/HtmlUtils.java b/main/src/cgeo/geocaching/utils/HtmlUtils.java index 9b627ac..30aa19b 100644 --- a/main/src/cgeo/geocaching/utils/HtmlUtils.java +++ b/main/src/cgeo/geocaching/utils/HtmlUtils.java @@ -54,8 +54,8 @@ public class HtmlUtils { } /** - * Convert any non-Latin characters into their HTML escaped equivalents - * + * Convert any non-Latin characters into HTML unicode entities + * * @param input * String * @return output String |
