From ac983928c26ed233739a220ad016c65cba240291 Mon Sep 17 00:00:00 2001 From: Jez Higgins Date: Thu, 15 Nov 2012 09:21:22 +0000 Subject: [PATCH 001/326] Prevent abend when POI icons haven't yet loaded. --- src/net/cyclestreets/views/overlay/POIOverlay.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/net/cyclestreets/views/overlay/POIOverlay.java b/src/net/cyclestreets/views/overlay/POIOverlay.java index 7e794d2a6..99b151bb5 100644 --- a/src/net/cyclestreets/views/overlay/POIOverlay.java +++ b/src/net/cyclestreets/views/overlay/POIOverlay.java @@ -513,7 +513,11 @@ public View getView(final int position, final View convertView, final ViewGroup n.setText(cat.name()); final ImageView iv = (ImageView)v.findViewById(R.id.icon); - iv.setImageDrawable(massiveIconCats_.get(cat.name()).icon()); + try { + iv.setImageDrawable(massiveIconCats_.get(cat.name()).icon()); + } catch(final NullPointerException e) { + // might get NPE here if icons haven't loaded yet + } // catch final CheckBox chk = (CheckBox)v.findViewById(R.id.checkbox); chk.setChecked(isSelected(cat)); From 2ab1f070f6456e28dd349564f392a6651f13c735 Mon Sep 17 00:00:00 2001 From: Rodrigo Brito Date: Sat, 8 Oct 2016 12:22:45 -0300 Subject: [PATCH 002/326] Trasnlation strings to portuguese --- .../src/main/res/values-pt/strings.xml | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 cyclestreets.vNext/src/main/res/values-pt/strings.xml diff --git a/cyclestreets.vNext/src/main/res/values-pt/strings.xml b/cyclestreets.vNext/src/main/res/values-pt/strings.xml new file mode 100644 index 000000000..e333cdf8e --- /dev/null +++ b/cyclestreets.vNext/src/main/res/values-pt/strings.xml @@ -0,0 +1,23 @@ + + + + CycleStreets + Planejador de viagem + Itinerário + Elevação + Photomap + Adicionar foto + Blog + Blog - Atualizado + + Erro inesperado, por favor envie um relatório … + CycleStreets parou de funcionar … + Por favor clique aqui para ajudar a corrigir o problema. + CycleStreets parou de funcionar + Ocorreu um erro inesperado forçando o aplicativo parar. Por favor, + ajude-nos a corrigir isso nos enviando os dados de erro, tudo que você literalmente tem que fazer + é clicar em \'OK\'. + Você pode adicionar seus comentários sobre o problema a seguir: + Muito Obrigado! + + From 2dcb95b2e803a72639d1b1529ec4cea7028e13ab Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Tue, 11 Oct 2016 15:57:15 +0100 Subject: [PATCH 003/326] Include build identifier in version on About page --- cyclestreets.vNext/src/main/assets/credits.html | 2 +- libraries/cyclestreets-core/build.gradle | 10 ++++++++++ .../src/main/java/net/cyclestreets/AppInfo.java | 15 +++++++++------ 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/cyclestreets.vNext/src/main/assets/credits.html b/cyclestreets.vNext/src/main/assets/credits.html index 410942fc5..6f98fb8ec 100644 --- a/cyclestreets.vNext/src/main/assets/credits.html +++ b/cyclestreets.vNext/src/main/assets/credits.html @@ -51,7 +51,7 @@

Routing


Android App

- Android App written by Jez Higgins with contributions by Christopher Fraser, Jonathan + Android App written by Jez Higgins with contributions by Oliver Lockwood, Christopher Fraser, Jonathan Gray, Theodore Hong, Farid Kurbanov, kyegupov, Shaun McDonald, Simon Nuttall, John Singleton, Colin Watson.

diff --git a/libraries/cyclestreets-core/build.gradle b/libraries/cyclestreets-core/build.gradle index 69b8039ea..0ad2c27fb 100644 --- a/libraries/cyclestreets-core/build.gradle +++ b/libraries/cyclestreets-core/build.gradle @@ -32,3 +32,13 @@ dependencies { testCompile 'org.robolectric:robolectric:3.0' testCompile 'commons-io:commons-io:2.4' } + +def buildNumber = { + System.getenv("BUILD_IDENTIFIER") ?: "local-build" +}() + +android { + defaultConfig { + buildConfigField 'String', 'BUILD_IDENTIFIER', "\"${buildNumber}\"" + } +} diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/AppInfo.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/AppInfo.java index 061d02ab0..39dfa04c8 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/AppInfo.java +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/AppInfo.java @@ -4,25 +4,28 @@ import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import net.cyclestreets.core.BuildConfig; + public class AppInfo { private static String version_ = null; public static String version(final Context context) { if (version_ == null) - version_ = String.format("%s/%s", context.getPackageName(), versionName(context)); + version_ = String.format("%s/%s/%s", context.getPackageName(), + versionName(context), BuildConfig.BUILD_IDENTIFIER); return version_; - } // version + } private static String versionName(final Context context) { try { final PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), 0); return info.versionName; - } // try + } catch (PackageManager.NameNotFoundException nnfe) { // like this is going to happen return UNKNOWN; - } // catch - } // versionName + } + } private static final String UNKNOWN = "unknown"; -} // versionName} +} From e3497a3391b37aab0d2b451eb34f96a6a899f793 Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Wed, 12 Oct 2016 09:22:58 +0100 Subject: [PATCH 004/326] Change indentation from tabs to 2-space to match majority of codebase --- .../net/cyclestreets/FeedbackActivity.java | 110 +++++++++--------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/FeedbackActivity.java b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/FeedbackActivity.java index 989d81673..76dac1f80 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/FeedbackActivity.java +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/FeedbackActivity.java @@ -15,64 +15,64 @@ public class FeedbackActivity extends Activity implements TextWatcher, OnClickListener { - private Button upload_; - - @Override - protected void onCreate(final Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - setContentView(R.layout.routefeedback); + private Button upload_; + + @Override + protected void onCreate(final Bundle savedInstanceState) + { + super.onCreate(savedInstanceState); + setContentView(R.layout.routefeedback); - upload_ = (Button)findViewById(R.id.upload); - - upload_.setEnabled(false); - upload_.setOnClickListener(this); - - setText(R.id.name, CycleStreetsPreferences.name()); - setText(R.id.email, CycleStreetsPreferences.email()); - - textView(R.id.comments).addTextChangedListener(this); - } // onCreate - - private TextView textView(final int id) - { - return (TextView)findViewById(id); - } // textView - - private void setText(final int id, final String value) - { - textView(id).setText(value); - } // setText - - private String text(final int id) - { - return textView(id).getText().toString(); - } // getText + upload_ = (Button)findViewById(R.id.upload); + + upload_.setEnabled(false); + upload_.setOnClickListener(this); + + setText(R.id.name, CycleStreetsPreferences.name()); + setText(R.id.email, CycleStreetsPreferences.email()); + + textView(R.id.comments).addTextChangedListener(this); + } // onCreate + + private TextView textView(final int id) + { + return (TextView)findViewById(id); + } // textView + + private void setText(final int id, final String value) + { + textView(id).setText(value); + } // setText + + private String text(final int id) + { + return textView(id).getText().toString(); + } // getText - @Override - public void afterTextChanged(Editable s) { } - @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { } + @Override + public void afterTextChanged(Editable s) { } + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { } - @Override - public void onTextChanged(CharSequence s, int start, int before, int count) - { - upload_.setEnabled(s.length() != 0); - } //onTextChanged + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) + { + upload_.setEnabled(s.length() != 0); + } //onTextChanged - @Override - public void onClick(View v) - { - try { - final Feedback.Result result = Feedback.send(Route.journey().itinerary(), - text(R.id.comments), - text(R.id.name), - text(R.id.email)); - MessageBox.OKAndFinish(this.getCurrentFocus(), result.message(), this, result.ok()); - } - catch(Exception e) { - MessageBox.OK(v, "There was a problem sending your comments:\n" + e.getMessage()); - } - } // onClick + @Override + public void onClick(View v) + { + try { + final Feedback.Result result = Feedback.send(Route.journey().itinerary(), + text(R.id.comments), + text(R.id.name), + text(R.id.email)); + MessageBox.OKAndFinish(this.getCurrentFocus(), result.message(), this, result.ok()); + } + catch(Exception e) { + MessageBox.OK(v, "There was a problem sending your comments:\n" + e.getMessage()); + } + } // onClick } // FeedbackActivity From 2b4f029f675d2d5e792ce27a8382f181fe15ef1f Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Wed, 12 Oct 2016 10:45:21 +0100 Subject: [PATCH 005/326] Generalise Result class for Feedback and Registration --- .../java/net/cyclestreets/api/ApiClient.java | 16 +++--- .../java/net/cyclestreets/api/Feedback.java | 41 +++++++-------- .../net/cyclestreets/api/Registration.java | 39 +++++---------- .../java/net/cyclestreets/api/Result.java | 26 ++++++++++ .../api/client/RetrofitApiClient.java | 19 ++++--- .../client/dto/SendFeedbackResponseDto.java | 5 +- .../api/client/dto/UserCreateResponseDto.java | 9 ++-- .../RetrofitApiClientIntegrationTest.java | 5 +- .../api/client/RetrofitApiClientTest.java | 7 +-- .../cyclestreets/AccountDetailsActivity.java | 7 +-- .../net/cyclestreets/FeedbackActivity.java | 50 ++++++++----------- 11 files changed, 111 insertions(+), 113 deletions(-) create mode 100644 libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Result.java diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/ApiClient.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/ApiClient.java index b0bfcfb73..14d9adad1 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/ApiClient.java +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/ApiClient.java @@ -94,10 +94,10 @@ static GeoPlaces geoCoder(final String search, return retrofitApiClient.geoCoder(search, w, s, e, n); } - static Feedback.Result sendFeedback(final int itinerary, - final String comments, - final String name, - final String email) throws IOException { + static Result sendFeedback(final int itinerary, + final String comments, + final String name, + final String email) throws IOException { return retrofitApiClient.sendFeedback(itinerary, comments, name, email); } @@ -119,10 +119,10 @@ static Signin.Result signin(final String username, return retrofitApiClient.authenticate(username, password); } - static Registration.Result register(final String username, - final String password, - final String name, - final String email) throws IOException { + static Result register(final String username, + final String password, + final String name, + final String email) throws IOException { return retrofitApiClient.register(username, password, name, email); } diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Feedback.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Feedback.java index 41fb2d480..59474ae24 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Feedback.java +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Feedback.java @@ -3,33 +3,26 @@ import java.io.IOException; public class Feedback { - static public class Result { - private final boolean ok; - private final String message; + private static final String okMessage = "Thank you for submitting this feedback. We will get back to you when we have checked this out."; + private static final String errorPrefix = "Your feedback could not be sent."; - public Result(String errorMessage) { - ok = false; - message = errorMessage; - } - - public Result() { - ok = true; - message = "Thank you for submitting this feedback. We will get back to you when we have checked this out."; - } - - public boolean ok() { - return ok; - } + public static Result ok() { + return new Result(okMessage); + } - public String message() { - return message; - } + public static Result error(String errorMessage) { + return new Result(errorPrefix, errorMessage); } - public static Feedback.Result send(final int itinerary, - final String comments, - final String name, - final String email) throws IOException { - return ApiClient.sendFeedback(itinerary, comments, name, email); + ////////////////////////////////////////////////////// + public static Result send(final int itinerary, + final String comments, + final String name, + final String email) { + try { + return ApiClient.sendFeedback(itinerary, comments, name, email); + } catch (IOException e) { + return error(e.getMessage()); + } } } diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Registration.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Registration.java index f0e6a900f..c38d29352 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Registration.java +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Registration.java @@ -2,42 +2,27 @@ import java.io.IOException; -public class Registration -{ - static public class Result { - private final boolean ok; - private final String errorMessage; +public class Registration { + private static final String okMessage = "Your account has been registered.\n\nAn email has been sent to the address you gave.\n\nWhen the email arrives, follow the instructions it contains to complete the registration."; + private static final String errorPrefix = "Your account could not be registered."; - public Result() { - ok = false; - errorMessage = "Unknown reason"; - } - - public Result(final boolean ok, final String errorMessage) { - this.ok = ok; - this.errorMessage = errorMessage; - } - - public boolean ok() { return ok; } + public static Result ok() { + return new Result(okMessage); + } - public String message() { - if (ok) { - return "Your account has been registered.\n\nAn email has been sent to the address you gave.\n\nWhen the email arrives, follow the instructions it contains to complete the registration."; - } - return "Your account could not be registered.\n\n" + errorMessage; - } + public static Result error(String errorMessage) { + return new Result(errorPrefix, errorMessage); } - + ////////////////////////////////////////////////////// - static public Result register(final String username, + public static Result register(final String username, final String password, final String name, final String email) { try { return ApiClient.register(username, password, name, email); - } - catch (IOException e) { - return new Result(false, e.getMessage()); + } catch (IOException e) { + return error(e.getMessage()); } } } diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Result.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Result.java new file mode 100644 index 000000000..8a5b47783 --- /dev/null +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Result.java @@ -0,0 +1,26 @@ +package net.cyclestreets.api; + +public class Result { + + private String okMessage; + private String errorPrefix; + private boolean ok; + private String errorMessage; + + Result(String okMessage) { + this.ok = true; + this.okMessage = okMessage; + } + + Result (String errorPrefix, String errorMessage) { + this.ok = false; + this.errorPrefix = errorPrefix; + this.errorMessage = errorMessage; + } + + public final boolean ok() { return ok; } + + public final String message() { + return (ok) ? okMessage : errorPrefix + "\n\n" + errorMessage; + } +} diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/RetrofitApiClient.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/RetrofitApiClient.java index 681e9d32e..966bcffa1 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/RetrofitApiClient.java +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/RetrofitApiClient.java @@ -6,13 +6,12 @@ import com.fasterxml.jackson.databind.ObjectMapper; import net.cyclestreets.api.Blog; -import net.cyclestreets.api.Feedback; import net.cyclestreets.api.GeoPlaces; import net.cyclestreets.api.POI; import net.cyclestreets.api.POICategories; import net.cyclestreets.api.PhotomapCategories; import net.cyclestreets.api.Photos; -import net.cyclestreets.api.Registration; +import net.cyclestreets.api.Result; import net.cyclestreets.api.Signin; import net.cyclestreets.api.Upload; import net.cyclestreets.api.UserJourneys; @@ -200,10 +199,10 @@ public UserJourneys getUserJourneys(final String username) throws IOException { return response.body().toUserJourneys(); } - public Registration.Result register(final String username, - final String password, - final String name, - final String email) throws IOException { + public Result register(final String username, + final String password, + final String name, + final String email) throws IOException { Response response = v2Api.register(username, password, name, email).execute(); return response.body().toRegistrationResult(); } @@ -214,10 +213,10 @@ public Signin.Result authenticate(final String identifier, return response.body().toSigninResult(); } - public Feedback.Result sendFeedback(final int itinerary, - final String comments, - final String name, - final String email) throws IOException { + public Result sendFeedback(final int itinerary, + final String comments, + final String name, + final String email) throws IOException { Response response = v2Api.sendFeedback("routing", itinerary, comments, name, email).execute(); return response.body().toFeedbackResult(); } diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/dto/SendFeedbackResponseDto.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/dto/SendFeedbackResponseDto.java index 58c849186..815e8679c 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/dto/SendFeedbackResponseDto.java +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/dto/SendFeedbackResponseDto.java @@ -3,12 +3,13 @@ import com.fasterxml.jackson.annotation.JsonProperty; import net.cyclestreets.api.Feedback; +import net.cyclestreets.api.Result; public class SendFeedbackResponseDto extends ApiResponseDto { @JsonProperty private String id; - public Feedback.Result toFeedbackResult() { - return wasSuccessful() ? new Feedback.Result() : new Feedback.Result(error); + public Result toFeedbackResult() { + return wasSuccessful() ? Feedback.ok() : Feedback.error(error); } } diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/dto/UserCreateResponseDto.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/dto/UserCreateResponseDto.java index 69b27bdae..3ce96af19 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/dto/UserCreateResponseDto.java +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/dto/UserCreateResponseDto.java @@ -3,16 +3,13 @@ import com.fasterxml.jackson.annotation.JsonProperty; import net.cyclestreets.api.Registration; +import net.cyclestreets.api.Result; public class UserCreateResponseDto extends ApiResponseDto { @JsonProperty(value = "successmessage") private String successMessage; - private String getMessage() { - return wasSuccessful() ? successMessage : error; - } - - public Registration.Result toRegistrationResult() { - return new Registration.Result(wasSuccessful(), getMessage()); + public Result toRegistrationResult() { + return wasSuccessful() ? Registration.ok(): Registration.error(error); } } diff --git a/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientIntegrationTest.java b/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientIntegrationTest.java index 186d1c9e8..cfee247a5 100644 --- a/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientIntegrationTest.java +++ b/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientIntegrationTest.java @@ -13,6 +13,7 @@ import net.cyclestreets.api.PhotomapCategories; import net.cyclestreets.api.Photos; import net.cyclestreets.api.Registration; +import net.cyclestreets.api.Result; import net.cyclestreets.api.Signin; import net.cyclestreets.api.Upload; import net.cyclestreets.api.UserJourney; @@ -117,7 +118,7 @@ public void hitRegistrationApi() throws Exception { // Apologies for the test users that this method generates - we should probably delete them... String random = String.valueOf(new Random().nextInt(100000)); System.out.println("Registering user test" + random); - Registration.Result result = apiClient.register("test" + random, "pwd1234", "friendlyname", "test" + random + "@nosuchdomain.com"); + Result result = apiClient.register("test" + random, "pwd1234", "friendlyname", "test" + random + "@nosuchdomain.com"); System.out.println(result.ok()); System.out.println(result.message()); assertThat(result.ok(), is(true)); @@ -135,7 +136,7 @@ public void hitAuthenticateApi() throws Exception { @Test public void hitSendFeedbackApi() throws Exception { - Feedback.Result result = apiClient.sendFeedback(1234, "test comment", "test", "test@nosuchdomain.com"); + Result result = apiClient.sendFeedback(1234, "test comment", "test", "test@nosuchdomain.com"); System.out.println(result.ok()); System.out.println(result.message()); assertThat(result.ok(), is(true)); diff --git a/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientTest.java b/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientTest.java index 69bbea781..95b9e4754 100644 --- a/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientTest.java +++ b/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientTest.java @@ -17,6 +17,7 @@ import net.cyclestreets.api.PhotomapCategory; import net.cyclestreets.api.Photos; import net.cyclestreets.api.Registration; +import net.cyclestreets.api.Result; import net.cyclestreets.api.Signin; import net.cyclestreets.api.Upload; import net.cyclestreets.api.UserJourney; @@ -292,7 +293,7 @@ public void testRegisterReturnsOk() throws Exception { .withBodyFile("registration-ok.json"))); // when - Registration.Result result = apiClient.register("arnold", "cyberdyne101", "The Terminator", "101@skynet.com"); + Result result = apiClient.register("arnold", "cyberdyne101", "The Terminator", "101@skynet.com"); // then verify(postRequestedFor(urlPathEqualTo("/v2/user.create")) @@ -314,7 +315,7 @@ public void testRegisterReturnsError() throws Exception { .withBodyFile("api-error.json"))); // when - Registration.Result result = apiClient.register("username", "pwd", "name", "email@bob.com"); + Result result = apiClient.register("username", "pwd", "name", "email@bob.com"); // then verify(postRequestedFor(urlPathEqualTo("/v2/user.create")) @@ -358,7 +359,7 @@ public void testSendFeedbackReturnsOk() throws Exception { .withBodyFile("feedback-ok.json"))); // when - Feedback.Result result = apiClient.sendFeedback(1234, "Comments I want to make", "My Name", "ballboy@wimbledon.com"); + Result result = apiClient.sendFeedback(1234, "Comments I want to make", "My Name", "ballboy@wimbledon.com"); // then verify(postRequestedFor(urlPathEqualTo("/v2/feedback.add")) diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/AccountDetailsActivity.java b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/AccountDetailsActivity.java index 9641e1acc..0ec0a45df 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/AccountDetailsActivity.java +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/AccountDetailsActivity.java @@ -1,5 +1,6 @@ package net.cyclestreets; +import net.cyclestreets.api.Result; import net.cyclestreets.view.R; import net.cyclestreets.util.Dialog; import net.cyclestreets.util.MessageBox; @@ -316,7 +317,7 @@ private void register() task.execute(); } // register - private class RegisterTask extends AsyncTask + private class RegisterTask extends AsyncTask { private final String username_; private final String password_; @@ -345,7 +346,7 @@ protected void onPreExecute() progress_.show(); } // onPreExecute - protected Registration.Result doInBackground(Object... params) + protected Result doInBackground(Object... params) { return Registration.register(username_, password_, @@ -354,7 +355,7 @@ protected Registration.Result doInBackground(Object... params) } // doInBackground @Override - protected void onPostExecute(final Registration.Result result) + protected void onPostExecute(final Result result) { progress_.dismiss(); CycleStreetsPreferences.setPendingUsernamePassword(username_, password_, name_, email_, result.ok()); diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/FeedbackActivity.java b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/FeedbackActivity.java index 76dac1f80..fde1d60db 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/FeedbackActivity.java +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/FeedbackActivity.java @@ -1,5 +1,6 @@ package net.cyclestreets; +import net.cyclestreets.api.Result; import net.cyclestreets.view.R; import net.cyclestreets.api.Feedback; import net.cyclestreets.routing.Route; @@ -13,13 +14,11 @@ import android.widget.Button; import android.widget.TextView; -public class FeedbackActivity extends Activity implements TextWatcher, OnClickListener -{ +public class FeedbackActivity extends Activity implements TextWatcher, OnClickListener { private Button upload_; @Override - protected void onCreate(final Bundle savedInstanceState) - { + protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.routefeedback); @@ -32,47 +31,42 @@ protected void onCreate(final Bundle savedInstanceState) setText(R.id.email, CycleStreetsPreferences.email()); textView(R.id.comments).addTextChangedListener(this); - } // onCreate + } - private TextView textView(final int id) - { + private TextView textView(final int id) { return (TextView)findViewById(id); - } // textView + } - private void setText(final int id, final String value) - { + private void setText(final int id, final String value) { textView(id).setText(value); - } // setText + } - private String text(final int id) - { + private String text(final int id) { return textView(id).getText().toString(); - } // getText + } @Override - public void afterTextChanged(Editable s) { } + public void afterTextChanged(Editable s) {} + @Override - public void beforeTextChanged(CharSequence s, int start, int count, int after) { } + public void beforeTextChanged(CharSequence s, int start, int count, int after) {} @Override - public void onTextChanged(CharSequence s, int start, int before, int count) - { + public void onTextChanged(CharSequence s, int start, int before, int count) { upload_.setEnabled(s.length() != 0); - } //onTextChanged + } @Override - public void onClick(View v) - { + public void onClick(View v) { try { - final Feedback.Result result = Feedback.send(Route.journey().itinerary(), - text(R.id.comments), - text(R.id.name), - text(R.id.email)); + final Result result = Feedback.send(Route.journey().itinerary(), + text(R.id.comments), + text(R.id.name), + text(R.id.email)); MessageBox.OKAndFinish(this.getCurrentFocus(), result.message(), this, result.ok()); } catch(Exception e) { MessageBox.OK(v, "There was a problem sending your comments:\n" + e.getMessage()); } - } // onClick - -} // FeedbackActivity + } +} From 06b4c8591ba586a9477e305df30c8f253b93f2a8 Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Wed, 12 Oct 2016 11:33:18 +0100 Subject: [PATCH 006/326] Send route feedback asynchronously (so it works) --- .../net/cyclestreets/FeedbackActivity.java | 55 ++++++++++++++++--- .../src/main/res/values/strings.xml | 1 + 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/FeedbackActivity.java b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/FeedbackActivity.java index fde1d60db..25a184d93 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/FeedbackActivity.java +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/FeedbackActivity.java @@ -1,11 +1,15 @@ package net.cyclestreets; import net.cyclestreets.api.Result; +import net.cyclestreets.util.Dialog; import net.cyclestreets.view.R; import net.cyclestreets.api.Feedback; import net.cyclestreets.routing.Route; import net.cyclestreets.util.MessageBox; import android.app.Activity; +import android.app.ProgressDialog; +import android.content.Context; +import android.os.AsyncTask; import android.os.Bundle; import android.text.Editable; import android.text.TextWatcher; @@ -58,15 +62,50 @@ public void onTextChanged(CharSequence s, int start, int before, int count) { @Override public void onClick(View v) { - try { - final Result result = Feedback.send(Route.journey().itinerary(), - text(R.id.comments), - text(R.id.name), - text(R.id.email)); - MessageBox.OKAndFinish(this.getCurrentFocus(), result.message(), this, result.ok()); + FeedbackTask task = new FeedbackTask(this, Route.journey().itinerary(), text(R.id.comments), + text(R.id.name), text(R.id.email)); + task.execute(); + } + + private void messageBox(Result result) { + MessageBox.OKAndFinish(this.getCurrentFocus(), result.message(), this, result.ok()); + } + + private class FeedbackTask extends AsyncTask { + private final int itinerary; + private final String comments; + private final String name; + private final String email; + private final ProgressDialog progress; + + public FeedbackTask(Context context, + int itinerary, + String comments, + String name, + String email) { + this.itinerary = itinerary; + this.comments = comments; + this.name = name; + this.email = email; + + this.progress = Dialog.createProgressDialog(context, R.string.sending_feedback); } - catch(Exception e) { - MessageBox.OK(v, "There was a problem sending your comments:\n" + e.getMessage()); + + @Override + protected void onPreExecute() { + super.onPreExecute(); + progress.show(); + } + + @Override + protected Result doInBackground(final Object... params) { + return Feedback.send(itinerary, comments, name, email); + } + + @Override + protected void onPostExecute(final Result result) { + progress.dismiss(); + messageBox(result); } } } diff --git a/libraries/cyclestreets-view/src/main/res/values/strings.xml b/libraries/cyclestreets-view/src/main/res/values/strings.xml index 637255634..36e84e5e4 100644 --- a/libraries/cyclestreets-view/src/main/res/values/strings.xml +++ b/libraries/cyclestreets-view/src/main/res/values/strings.xml @@ -46,6 +46,7 @@ Signing into CycleStreets.net Registering with CycleStreets.net + Sending route feedback to CycleStreets.net You do not have any map packs installed. Vector maps for offline use are available as separate downloads. From 69f2563d96e7827bbf69356af4cfd604bd12b0f4 Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Thu, 13 Oct 2016 09:30:31 +0100 Subject: [PATCH 007/326] Extract hardcoded text values from cyclestreets-view module so they can be translated --- .../src/main/res/layout/itinerary_item.xml | 1 - .../res/layout/itinerary_not_available.xml | 1 - .../src/main/res/layout/locations_list.xml | 1 - .../src/main/res/layout/storedroutes_item.xml | 2 - .../net/cyclestreets/PhotoUploadActivity.java | 14 +++--- .../src/main/res/layout/accountdetails.xml | 14 +++--- .../src/main/res/layout/accountregister.xml | 20 ++++----- .../src/main/res/layout/accountsignin.xml | 14 +++--- .../src/main/res/layout/addphotocaption.xml | 7 ++- .../src/main/res/layout/addphotocategory.xml | 4 +- .../src/main/res/layout/addphotolocation.xml | 4 +- .../src/main/res/layout/addphotonext.xml | 24 +++++----- .../src/main/res/layout/addphotostart.xml | 18 ++++---- .../src/main/res/layout/addphotoview.xml | 12 ++--- .../src/main/res/layout/journey_type.xml | 2 +- .../main/res/layout/poicategories_item.xml | 3 +- .../src/main/res/layout/routefeedback.xml | 13 +++--- .../src/main/res/values/strings.xml | 45 ++++++++++++++++++- 18 files changed, 118 insertions(+), 81 deletions(-) diff --git a/libraries/cyclestreets-fragments/src/main/res/layout/itinerary_item.xml b/libraries/cyclestreets-fragments/src/main/res/layout/itinerary_item.xml index 9021934ab..f6b9bb6f4 100644 --- a/libraries/cyclestreets-fragments/src/main/res/layout/itinerary_item.xml +++ b/libraries/cyclestreets-fragments/src/main/res/layout/itinerary_item.xml @@ -25,7 +25,6 @@ android:layout_height="wrap_content" android:gravity="center_vertical" android:textAppearance="?android:attr/textAppearanceMedium" - android:singleLine="false" android:ellipsize="marquee" android:text="Street" /> diff --git a/libraries/cyclestreets-fragments/src/main/res/layout/locations_list.xml b/libraries/cyclestreets-fragments/src/main/res/layout/locations_list.xml index 100d4248a..8d6ecff7c 100644 --- a/libraries/cyclestreets-fragments/src/main/res/layout/locations_list.xml +++ b/libraries/cyclestreets-fragments/src/main/res/layout/locations_list.xml @@ -15,7 +15,6 @@ android:gravity="center_vertical|center_horizontal" android:textAppearance="?android:attr/textAppearanceMediumInverse" android:padding="6dip" - android:singleLine="false" android:text="@string/location_list_header" /> diff --git a/libraries/cyclestreets-fragments/src/main/res/layout/storedroutes_item.xml b/libraries/cyclestreets-fragments/src/main/res/layout/storedroutes_item.xml index 442d1faff..c45be5850 100644 --- a/libraries/cyclestreets-fragments/src/main/res/layout/storedroutes_item.xml +++ b/libraries/cyclestreets-fragments/src/main/res/layout/storedroutes_item.xml @@ -14,7 +14,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="left" - android:singleLine="false" android:ellipsize="marquee" android:text="Route " android:textAppearance="?android:attr/textAppearanceMedium" @@ -24,7 +23,6 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="left" - android:singleLine="false" android:ellipsize="marquee" android:text="Details" android:textAppearance="?android:attr/textAppearanceSmall" diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/PhotoUploadActivity.java b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/PhotoUploadActivity.java index 610a3e8cd..8252230e1 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/PhotoUploadActivity.java +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/PhotoUploadActivity.java @@ -176,13 +176,13 @@ protected void onCreate(Bundle savedInstanceState) } photoCategory_ = inflater_.inflate(R.layout.addphotocategory, null); - backNextButtons(photoCategory_, "Back", android.R.drawable.ic_media_rew, "Next", android.R.drawable.ic_media_ff); + backNextButtons(photoCategory_, getString(R.string.photo_back), android.R.drawable.ic_media_rew, getString(R.string.photo_next), android.R.drawable.ic_media_ff); photoLocation_ = inflater_.inflate(R.layout.addphotolocation, null); - backNextButtons(photoLocation_, "Back", android.R.drawable.ic_media_rew, "Upload!", android.R.drawable.ic_menu_upload); + backNextButtons(photoLocation_, getString(R.string.photo_back), android.R.drawable.ic_media_rew, getString(R.string.common_upload), android.R.drawable.ic_menu_upload); photoWebView_ = inflater_.inflate(R.layout.addphotoview, null); - backNextButtons(photoWebView_, "Upload another", android.R.drawable.ic_menu_revert, "Close", android.R.drawable.ic_menu_close_clear_cancel); + backNextButtons(photoWebView_, getString(R.string.photo_upload_another), android.R.drawable.ic_menu_revert, getString(R.string.photo_close), android.R.drawable.ic_menu_close_clear_cancel); // start reading categories if(photomapCategories == null) @@ -392,11 +392,11 @@ private void setupView() // keyboard to hide, if we don't recreate the view afresh, Android won't redisplay // the keyboard if we come back to this view photoCaption_ = inflater_.inflate(R.layout.addphotocaption, null); - backNextButtons(photoCaption_, "Back", android.R.drawable.ic_media_rew, "Next", android.R.drawable.ic_media_ff); + backNextButtons(photoCaption_, getString(R.string.photo_back), android.R.drawable.ic_media_rew, getString(R.string.photo_next), android.R.drawable.ic_media_ff); setUploadView(photoCaption_); captionEditor().setText(caption_); if (photo_ == null && allowTextOnly_) { - ((TextView)photoRoot_.findViewById(R.id.label)).setText("Your Report"); + ((TextView)photoRoot_.findViewById(R.id.label)).setText(getString(R.string.report_title)); ((EditText)photoRoot_.findViewById(R.id.caption)).setLines(10); } // if ... break; @@ -412,9 +412,9 @@ private void setupView() setUploadView(photoLocation_); there_.recentre(); if (photo_ == null && allowTextOnly_) - ((TextView)photoRoot_.findViewById(R.id.label)).setText("Where is the location your report describes?"); + ((TextView)photoRoot_.findViewById(R.id.label)).setText(getString(R.string.report_where)); else - ((TextView)photoRoot_.findViewById(R.id.label)).setText("Where was this photo taken?"); + ((TextView)photoRoot_.findViewById(R.id.label)).setText(getString(R.string.photo_where)); break; case VIEW: setUploadView(photoWebView_); diff --git a/libraries/cyclestreets-view/src/main/res/layout/accountdetails.xml b/libraries/cyclestreets-view/src/main/res/layout/accountdetails.xml index 53c2447f9..ffde84efe 100644 --- a/libraries/cyclestreets-view/src/main/res/layout/accountdetails.xml +++ b/libraries/cyclestreets-view/src/main/res/layout/accountdetails.xml @@ -6,36 +6,36 @@ - + + + android:textStyle="bold" + android:textSize="18sp"/> diff --git a/libraries/cyclestreets-track/src/main/res/layout/save.xml b/libraries/cyclestreets-track/src/main/res/layout/save.xml index 2cb9d14dc..28f497ac9 100644 --- a/libraries/cyclestreets-track/src/main/res/layout/save.xml +++ b/libraries/cyclestreets-track/src/main/res/layout/save.xml @@ -1,159 +1,211 @@ + android:id="@+id/ScrollView01" android:layout_width="wrap_content" + android:layout_height="wrap_content"> + android:layout_height="fill_parent"> + - + android:layout_width="fill_parent" android:layout_height="wrap_content"> + + android:layout_height="wrap_content" + android:orientation="horizontal" + android:layout_width="fill_parent"/> - - - - - + android:layout_height="wrap_content" + android:layout_width="fill_parent"> + + + + + + + + + + + + + - - - - - - - - - + + - - - - - - - - - - - + + + android:textSize="16sp" + android:text="@string/save_age"/> + + + - - - - - + android:textSize="16sp" + android:text="@string/save_gender"/> + + + + + + + + + + + - - + android:layout_height="wrap_content" + android:layout_width="fill_parent" + android:paddingTop="10sp"> + - + android:layout_width="30dip"/> diff --git a/libraries/cyclestreets-fragments/src/main/res/layout/routenumber.xml b/libraries/cyclestreets-fragments/src/main/res/layout/routenumber.xml index 9e01a101f..d1055d8ab 100644 --- a/libraries/cyclestreets-fragments/src/main/res/layout/routenumber.xml +++ b/libraries/cyclestreets-fragments/src/main/res/layout/routenumber.xml @@ -14,7 +14,7 @@ android:layout_height="wrap_content" android:layout_width="fill_parent" android:inputType="number" - android:hint="Route number"/> + android:hint="@string/routenumber_hint"/> + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:gravity="left" + android:ellipsize="marquee" + android:text="@string/storedroutes_title_default" + android:textAppearance="?android:attr/textAppearanceMedium"/> + android:text="@string/storedroutes_detail_default" + android:textAppearance="?android:attr/textAppearanceSmall"/> \ No newline at end of file diff --git a/libraries/cyclestreets-fragments/src/main/res/menu/route_map.xml b/libraries/cyclestreets-fragments/src/main/res/menu/route_map.xml index 521d6bcaa..7591f18d5 100644 --- a/libraries/cyclestreets-fragments/src/main/res/menu/route_map.xml +++ b/libraries/cyclestreets-fragments/src/main/res/menu/route_map.xml @@ -11,10 +11,10 @@ android:showAsAction="ifRoom|withText"/> \ No newline at end of file diff --git a/libraries/cyclestreets-fragments/src/main/res/values/strings.xml b/libraries/cyclestreets-fragments/src/main/res/values/strings.xml index d61730904..e0b289d84 100644 --- a/libraries/cyclestreets-fragments/src/main/res/values/strings.xml +++ b/libraries/cyclestreets-fragments/src/main/res/values/strings.xml @@ -18,9 +18,9 @@ Plan a route - Saved routes - Open route by number - Find place + Saved routes + Open route by number + Find place Settings Open Rename @@ -41,9 +41,32 @@ Hello blank fragment Add new locations using the button above.\nTouch and hold a location in the list to edit or delete. - CO₂ saving: - Calories: - Time: - Journey number: + + CO₂ saving: + Calories: + Time: + Journey number: + + Fruit + route + + net.cyclestreets + + Place name or address + + direction + Street + 00m00 + 0m + (0km) + Turn-by-turn route information will be shown\nhere once a route is planned. + + Place the mark on the map and then name the location. + Location name : + Route number + + Route + Details + %1$s route, %2$s diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/LocationOverlay.java b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/LocationOverlay.java index 969bb3dfc..b314ce320 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/LocationOverlay.java +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/LocationOverlay.java @@ -19,9 +19,6 @@ public class LocationOverlay extends MyLocationNewOverlay implements ButtonTapListener, MenuListener { - static private String LOCATION_ON = "Follow Location"; - static private String LOCATION_OFF = "Location Off"; - private final int offset_; private final float radius_; @@ -131,7 +128,7 @@ public void onCreateOptionsMenu(final Menu menu) { public void onPrepareOptionsMenu(final Menu menu) { final MenuItem item = enableMenuItem(menu, R.string.location_menu_mylocation, true); if(item != null) - item.setTitle(isMyLocationEnabled() ? LOCATION_OFF : LOCATION_ON); + item.setTitle(isMyLocationEnabled() ? R.string.location_menu_off : R.string.location_menu_on); } // onPrepareOptionsMenu @Override diff --git a/libraries/cyclestreets-view/src/main/res/values/strings.xml b/libraries/cyclestreets-view/src/main/res/values/strings.xml index 669387229..faa958184 100644 --- a/libraries/cyclestreets-view/src/main/res/values/strings.xml +++ b/libraries/cyclestreets-view/src/main/res/values/strings.xml @@ -5,6 +5,8 @@ " " Back Next + Save + Cancel Close Back Start again @@ -13,6 +15,8 @@ Your email address Show location + Follow Location + Location Off Route type Obtaining route from CycleStreets.net, please wait From 8e867fb1c0d0abbb58747bcbb8e3f34dae0db182 Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Sat, 22 Oct 2016 12:33:15 +0200 Subject: [PATCH 021/326] Extract more hardcoded strings --- .../java/net/cyclestreets/api/Feedback.java | 2 +- .../net/cyclestreets/api/Registration.java | 2 +- .../java/net/cyclestreets/api/Result.java | 2 +- .../java/net/cyclestreets/api/Signin.java | 38 +++++----- .../java/net/cyclestreets/api/Upload.java | 29 ++++---- .../client/dto/UploadPhotoResponseDto.java | 2 +- .../dto/UserAuthenticateResponseDto.java | 2 +- .../RetrofitApiClientIntegrationTest.java | 6 +- .../net/cyclestreets/PhotoUploadFragment.java | 11 ++- .../java/net/cyclestreets/track/SaveTrip.java | 58 +++++++-------- .../src/main/res/values/strings.xml | 20 ++++++ .../cyclestreets/AccountDetailsActivity.java | 70 ++++++++----------- .../net/cyclestreets/PhotoUploadActivity.java | 15 ++-- .../src/main/res/values/strings.xml | 10 +++ 14 files changed, 141 insertions(+), 126 deletions(-) diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Feedback.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Feedback.java index 59474ae24..58ecf2e99 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Feedback.java +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Feedback.java @@ -4,7 +4,7 @@ public class Feedback { private static final String okMessage = "Thank you for submitting this feedback. We will get back to you when we have checked this out."; - private static final String errorPrefix = "Your feedback could not be sent."; + private static final String errorPrefix = "Your feedback could not be sent.\n\n"; public static Result ok() { return new Result(okMessage); diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Registration.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Registration.java index c38d29352..aef18d1b7 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Registration.java +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Registration.java @@ -4,7 +4,7 @@ public class Registration { private static final String okMessage = "Your account has been registered.\n\nAn email has been sent to the address you gave.\n\nWhen the email arrives, follow the instructions it contains to complete the registration."; - private static final String errorPrefix = "Your account could not be registered."; + private static final String errorPrefix = "Your account could not be registered.\n\n"; public static Result ok() { return new Result(okMessage); diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Result.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Result.java index 8a5b47783..cba7cdb15 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Result.java +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Result.java @@ -21,6 +21,6 @@ public class Result { public final boolean ok() { return ok; } public final String message() { - return (ok) ? okMessage : errorPrefix + "\n\n" + errorMessage; + return (ok) ? okMessage : errorPrefix + errorMessage; } } diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Signin.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Signin.java index ab8780389..e95fb76b1 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Signin.java +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Signin.java @@ -1,36 +1,34 @@ package net.cyclestreets.api; -public class Signin -{ - public static class Result { - private final boolean success; +public class Signin { + public static class Result extends net.cyclestreets.api.Result { private String name; private String email; - private String error; - public Result(String name, String email) { - this.success = true; + private static final String okMessage = "You have successfully signed into CycleStreets."; + private static final String errorPrefix = "Error : "; + private static final String defaultError = "Could not sign into CycleStreets. Please check your username and password."; + + public static Result forNameAndEmail(String name, String email) { + return new Result(name, email); + } + + public static Result error(String error) { + return new Result(error); + } + + private Result(String name, String email) { + super(okMessage); this.name = name; this.email = email; } - public Result(final String errorMessage) { - this.success = false; - this.error = errorMessage; - } - - public boolean ok() { - return success; + private Result(final String error) { + super(errorPrefix, error != null ? error : defaultError); } public String email() { return email; } public String name() { return name; } - - public String error() { - if (error != null) - return "Error : " + error; - return "Unknown error"; - } } // class Result public static Result signin(final String username, diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Upload.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Upload.java index 8c5aa1955..999487dbe 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Upload.java +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Upload.java @@ -5,25 +5,30 @@ import java.io.IOException; public class Upload { - public static class Result { + public static class Result extends net.cyclestreets.api.Result { private String url; - private String error; - public static Result forError(final String error) { - Result result = new Result(); - result.error = error; - return result; + private static final String okMessage = "You have successfully signed into CycleStreets."; + private static final String errorPrefix = "There was a problem uploading your photo: \n"; + + public static Result forUrl(String url) { + return new Result(url); + } + + public static Result error(String error) { + return new Result(errorPrefix, error); + } + + private Result(String url) { + super(okMessage); + this.url = url; } - public static Result forUrl(final String url) { - Result result = new Result(); - result.url = url; - return result; + private Result(String prefix, String error) { + super(prefix, error); } - public boolean ok() { return url != null; } public String url() { return url; } - public String error() { return error; } } static public Upload.Result photo(final String filename, diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/dto/UploadPhotoResponseDto.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/dto/UploadPhotoResponseDto.java index 68827d327..0ef9d6dd0 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/dto/UploadPhotoResponseDto.java +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/dto/UploadPhotoResponseDto.java @@ -17,6 +17,6 @@ public class UploadPhotoResponseDto extends ApiResponseDto { String thumbnailUrl; public Upload.Result toUploadResult() { - return wasSuccessful() ? Upload.Result.forUrl(url) : Upload.Result.forError(error); + return wasSuccessful() ? Upload.Result.forUrl(url) : Upload.Result.error(error); } } diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/dto/UserAuthenticateResponseDto.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/dto/UserAuthenticateResponseDto.java index 38c1c27d1..2f7fc3112 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/dto/UserAuthenticateResponseDto.java +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/dto/UserAuthenticateResponseDto.java @@ -15,6 +15,6 @@ public class UserAuthenticateResponseDto extends ApiResponseDto { private String[] privileges; public Signin.Result toSigninResult() { - return wasSuccessful() ? new Signin.Result(name, email) : new Signin.Result(error); + return wasSuccessful() ? Signin.Result.forNameAndEmail(name, email) : Signin.Result.error(error); } } diff --git a/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientIntegrationTest.java b/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientIntegrationTest.java index cfee247a5..2aadb55fb 100644 --- a/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientIntegrationTest.java +++ b/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientIntegrationTest.java @@ -130,7 +130,7 @@ public void hitAuthenticateApi() throws Exception { System.out.println(result.ok()); System.out.println(result.name()); System.out.println(result.email()); - System.out.println(result.error()); + System.out.println(result.message()); assertThat(result.ok(), is(true)); } @@ -155,7 +155,7 @@ public void hitUploadPhotoApiWithoutPhoto() throws Exception { "cycleparking", "good", "Caption: THIS IS TEST DATA and should not be on the map", null); System.out.println(result.ok()); System.out.println(result.url()); - System.out.println(result.error()); + System.out.println(result.message()); // Important - remove the test data from the map, otherwise we look pretty unprofessional! System.out.println("Don't forgot to log on as this user and delete the photo afterwards..."); } @@ -166,7 +166,7 @@ public void hitUploadPhotoApiWithPhoto() throws Exception { "cycleparking", "good", "Caption: THIS IS TEST DATA and should not be on the map", "/tmp/test-image.png"); System.out.println(result.ok()); System.out.println(result.url()); - System.out.println(result.error()); + System.out.println(result.message()); // Important - remove the test data from the map, otherwise we look pretty unprofessional! System.out.println("Don't forgot to log on as this user and delete the photo afterwards..."); } diff --git a/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/PhotoUploadFragment.java b/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/PhotoUploadFragment.java index 2daf55488..65ba887d5 100644 --- a/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/PhotoUploadFragment.java +++ b/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/PhotoUploadFragment.java @@ -663,7 +663,7 @@ private void upload() } catch(Exception e) { - Toast.makeText(getActivity(), "Could not upload photo. Please check your network connection.", Toast.LENGTH_LONG).show(); + Toast.makeText(getActivity(), R.string.photo_could_not_upload, Toast.LENGTH_LONG).show(); step_ = AddStep.LOCATION; } } // upload @@ -758,7 +758,7 @@ protected void onPostExecute(PhotomapCategories photomapCategories) { if(photomapCategories == null) { - Toast.makeText(getActivity(), "Could not load photomap categories. Please check network connection.", Toast.LENGTH_LONG).show(); + Toast.makeText(getActivity(), R.string.photo_could_not_load_categories, Toast.LENGTH_LONG).show(); return; } // if ... PhotoUploadFragment.photomapCategories = photomapCategories; @@ -822,20 +822,19 @@ protected Upload.Result doInBackground(Object... params) dateTime_, caption_); } catch (Exception e) { - return Upload.Result.forError("There was a problem uploading your photo: \n" + e.getMessage()); + return Upload.Result.error(e.getMessage()); } } // doInBackground @Override - protected void onPostExecute(final Upload.Result result) - { + protected void onPostExecute(final Upload.Result result) { if(smallImage_) new File(filename_).delete(); progress_.dismiss(); if(result.ok()) uploadComplete(result.url()); else - uploadFailed(result.error()); + uploadFailed(result.message()); } // onPostExecute } // class UploadPhotoTask diff --git a/libraries/cyclestreets-track/src/main/java/net/cyclestreets/track/SaveTrip.java b/libraries/cyclestreets-track/src/main/java/net/cyclestreets/track/SaveTrip.java index ed3f72521..3539092ed 100644 --- a/libraries/cyclestreets-track/src/main/java/net/cyclestreets/track/SaveTrip.java +++ b/libraries/cyclestreets-track/src/main/java/net/cyclestreets/track/SaveTrip.java @@ -99,7 +99,7 @@ public void onClick(final View v) { } // onClick private void discardTrip() { - Toast.makeText(getBaseContext(), "Trip discarded.", Toast.LENGTH_SHORT).show(); + Toast.makeText(getBaseContext(), R.string.savetrip_discarded, Toast.LENGTH_SHORT).show(); trip_.dropTrip(); @@ -110,7 +110,7 @@ private void discardTrip() { private void uploadTrip() { if (purpose_.equals("")) { // Oh no! No trip purpose! - Toast.makeText(getBaseContext(), "You must select a trip purpose before submitting! Choose from the purposes above.", Toast.LENGTH_SHORT).show(); + Toast.makeText(getBaseContext(), R.string.savetrip_no_purpose, Toast.LENGTH_SHORT).show(); return; } @@ -120,10 +120,10 @@ private void uploadTrip() { // "3.5 miles in 26 minutes" final long minutes = trip_.secondsElapsed() / 60; - String fancyEndInfo = String.format("%1.1f miles, %d minutes. %s", - trip_.distanceTravelled(), - minutes, - notes.getEditableText().toString()); + String fancyEndInfo = getString(R.string.savetrip_end_info_format, + trip_.distanceTravelled(), + minutes, + notes.getEditableText().toString()); // Save the trip details to the phone database. W00t! trip_.updateTrip(purpose_, @@ -148,7 +148,7 @@ private void uploadTrip() { } // uploadTrip private void setupAge(final Spinner age) { - final List ages = ListFactory.list("Please select", + final List ages = ListFactory.list(getString(R.string.savetrip_please_select), "0-10", "11-16", "17-24", @@ -164,11 +164,11 @@ private void setupAge(final Spinner age) { } // setupAge private void setupGender(final Spinner gender) { - final List genders = ListFactory.list("Please select", - "male", - "female", - "prefer not to say"); - gender.setPrompt("Please select gender"); + final List genders = ListFactory.list(getString(R.string.savetrip_please_select), + getString(R.string.savetrip_gender_male), + getString(R.string.savetrip_gender_female), + getString(R.string.savetrip_gender_private)); + gender.setPrompt(getString(R.string.savetrip_gender_prompt)); gender.setAdapter(new SpinnerList(this, genders)); int index = prefs_.getInt("gender", 0); gender.setSelection(index); @@ -176,11 +176,11 @@ private void setupGender(final Spinner gender) { } // setupGender private void setupExperience(final Spinner experience) { - final List experienceLevels = ListFactory.list("Please select", - "experienced", - "infrequent", - "beginner"); - experience.setPrompt("Please select experience level"); + final List experienceLevels = ListFactory.list(getString(R.string.savetrip_please_select), + getString(R.string.savetrip_experience_experienced), + getString(R.string.savetrip_experience_infrequent), + getString(R.string.savetrip_experience_beginner)); + experience.setPrompt(getString(R.string.savetrip_experience_prompt)); experience.setAdapter(new SpinnerList(this, experienceLevels)); int index = prefs_.getInt("experience", 0); experience.setSelection(index); @@ -197,22 +197,14 @@ private void setupPurposeButtons() { purpButtons.put(R.id.ToggleErrand, (ToggleButton)findViewById(R.id.ToggleErrand)); purpButtons.put(R.id.ToggleOther, (ToggleButton)findViewById(R.id.ToggleOther)); - purpDescriptions.put(R.id.ToggleCommute, - "Commute: this bike trip was primarily to get between home and your main workplace."); - purpDescriptions.put(R.id.ToggleSchool, - "School: this bike trip was primarily to go to or from school or college."); - purpDescriptions.put(R.id.ToggleWorkRel, - "Work-Related: this bike trip was primarily to go to or from a business related meeting, function, or work-related errand for your job."); - purpDescriptions.put(R.id.ToggleExercise, - "Exercise: this bike trip was primarily for exercise, or biking for the sake of biking."); - purpDescriptions.put(R.id.ToggleSocial, - "Social: this bike trip was primarily for going to or from a social activity, e.g. at a friend's house, the park, a restaurant, the movies."); - purpDescriptions.put(R.id.ToggleShopping, - "Shopping: this bike trip was primarily to purchase or bring home goods or groceries."); - purpDescriptions.put(R.id.ToggleErrand, - "Errand: this bike trip was primarily to attend to personal business such as banking, a doctor visit, going to the gym, etc."); - purpDescriptions.put(R.id.ToggleOther, - "Other: if none of the other reasons applied to this trip, you can enter comments below to tell us more."); + purpDescriptions.put(R.id.ToggleCommute, getString(R.string.savetrip_purpose_commute)); + purpDescriptions.put(R.id.ToggleSchool, getString(R.string.savetrip_purpose_school)); + purpDescriptions.put(R.id.ToggleWorkRel, getString(R.string.savetrip_purpose_work_related)); + purpDescriptions.put(R.id.ToggleExercise, getString(R.string.savetrip_purpose_exercise)); + purpDescriptions.put(R.id.ToggleSocial, getString(R.string.savetrip_purpose_social)); + purpDescriptions.put(R.id.ToggleShopping, getString(R.string.savetrip_purpose_shopping)); + purpDescriptions.put(R.id.ToggleErrand, getString(R.string.savetrip_purpose_errand)); + purpDescriptions.put(R.id.ToggleOther, getString(R.string.savetrip_purpose_other)); for (Entry e: purpButtons.entrySet()) e.getValue().setOnCheckedChangeListener(this); diff --git a/libraries/cyclestreets-track/src/main/res/values/strings.xml b/libraries/cyclestreets-track/src/main/res/values/strings.xml index 440e74291..571cb9ded 100644 --- a/libraries/cyclestreets-track/src/main/res/values/strings.xml +++ b/libraries/cyclestreets-track/src/main/res/values/strings.xml @@ -30,5 +30,25 @@ Submit Discard + Trip discarded. + You must select a trip purpose before submitting! Choose from the purposes above. + Commute: this bike trip was primarily to get between home and your main workplace.]]> + School: this bike trip was primarily to go to or from school or college.]]> + Work-Related: this bike trip was primarily to go to or from a business related meeting, function, or work-related errand for your job.]]> + Exercise: this bike trip was primarily for exercise, or biking for the sake of biking.]]> + Social: this bike trip was primarily for going to or from a social activity, e.g. at a friend\'s house, the park, a restaurant, the movies.]]> + Shopping: this bike trip was primarily to purchase or bring home goods or groceries.]]> + Errand: this bike trip was primarily to attend to personal business such as banking, a doctor visit, going to the gym, etc.]]> + Other: if none of the other reasons applied to this trip, you can enter comments below to tell us more.]]> + Please select + Please select gender + male + female + prefer not to say + Please select experience level + experienced + infrequent + beginner + %1$1.1f miles, %2$d minutes. %3$s diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/AccountDetailsActivity.java b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/AccountDetailsActivity.java index d5e1f13ae..c32c24daf 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/AccountDetailsActivity.java +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/AccountDetailsActivity.java @@ -122,22 +122,19 @@ private void setupView() } // switch } // setupView - private String signinMessage() - { - if(CycleStreetsPreferences.accountOK()) - return String.format("You are already signed in as\n%s, %s", - CycleStreetsPreferences.name(), - CycleStreetsPreferences.email()); - return "Please enter your account username and password to sign in."; - } // signinMessage + private String signinMessage() { + if (CycleStreetsPreferences.accountOK()) + return getString(R.string.account_already_signed_in_format, + CycleStreetsPreferences.name(), + CycleStreetsPreferences.email()); + return getString(R.string.account_signin_message); + } - private String registrationMessage() - { - if(CycleStreetsPreferences.accountPending()) - return "You have already registered an account. Please check your email for the verification email."; - return "Registration is free and registered users can add photos. To start " + - "the registration process please enter your details in the form below."; - } // registrationMessage + private String registrationMessage() { + if (CycleStreetsPreferences.accountPending()) + return getString(R.string.account_pending); + return getString(R.string.account_registration_is_free_long); + } private void hookUpButton(final View v, final int id) { @@ -206,7 +203,7 @@ public void onTextChanged(CharSequence s, int start, int before, int count) private void confirmClear() { MessageBox.YesNo(signinDetails_, - "Are you sure you want to clear the stored account details?", + getString(R.string.account_clear_details_confirm), new DialogInterface.OnClickListener() { public void onClick(DialogInterface arg0, int arg1) { CycleStreetsPreferences.clearUsernamePassword(); @@ -276,10 +273,7 @@ protected void onPostExecute(final Signin.Result result) result.ok()); setText(signinDetails_, R.id.signin_message, signinMessage()); - String msg = "You have successfully signed into CycleStreets."; - if(!result.ok()) - msg = result.error().startsWith("Error:") ? result.error() : "Could not sign into CycleStreets. Please check your username and password."; - MessageBox(msg, result.ok()); + MessageBox(result.message(), result.ok()); } // onPostExecute } // class SignInTask @@ -296,24 +290,23 @@ private void register() String oops = null; - if(!email.toLowerCase().matches(emailRegex)) - oops = "The email address entered is not a properly formatted address."; - if(!password.equals(password2)) - oops = "Password and confirmation password do not match."; - if(username.length() < 5) - oops = "Username must be at least five letters/numbers long."; + if (!email.toLowerCase().matches(emailRegex)) + oops = getString(R.string.account_email_format); + if (!password.equals(password2)) + oops = getString(R.string.account_password_mismatch); + if (username.length() < 5) + oops = getString(R.string.account_username_too_short); - if(oops != null) - { + if (oops != null) { MessageBox(oops, false); return; - } // if(oops) + } final RegisterTask task = new RegisterTask(this, - username, - password, - name, - email); + username, + password, + name, + email); task.execute(); } // register @@ -326,18 +319,17 @@ private class RegisterTask extends AsyncTask private final ProgressDialog progress_; RegisterTask(final Context context, - final String username, - final String password, - final String name, - final String email) - { + final String username, + final String password, + final String name, + final String email) { username_ = username; password_ = password; name_ = name; email_ = email; progress_ = Dialog.createProgressDialog(context, R.string.account_registering); - } // RegisterTask + } // RegisterTask @Override protected void onPreExecute() diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/PhotoUploadActivity.java b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/PhotoUploadActivity.java index 4ba7120b1..1984ebbd4 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/PhotoUploadActivity.java +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/PhotoUploadActivity.java @@ -647,7 +647,7 @@ private void upload() } catch(Exception e) { - Toast.makeText(this, "Could not upload photo. Please check your network connection.", Toast.LENGTH_LONG).show(); + Toast.makeText(this, R.string.photo_could_not_upload, Toast.LENGTH_LONG).show(); step_ = AddStep.LOCATION; } } // upload @@ -742,7 +742,7 @@ protected void onPostExecute(PhotomapCategories photomapCategories) { if(photomapCategories == null) { - Toast.makeText(PhotoUploadActivity.this, "Could not load photomap categories. Please check network connection.", Toast.LENGTH_LONG).show(); + Toast.makeText(PhotoUploadActivity.this, R.string.photo_could_not_load_categories, Toast.LENGTH_LONG).show(); return; } // if ... PhotoUploadActivity.photomapCategories = photomapCategories; @@ -807,20 +807,19 @@ protected Upload.Result doInBackground(Object... params) caption_); } // try catch (IOException e) { - return Upload.Result.forError("There was a problem uploading your photo: \n" + e.getMessage()); + return Upload.Result.error(e.getMessage()); } } // doInBackground @Override - protected void onPostExecute(final Upload.Result result) - { - if(smallImage_) + protected void onPostExecute(final Upload.Result result) { + if (smallImage_) new File(filename_).delete(); progress_.dismiss(); - if(result.ok()) + if (result.ok()) uploadComplete(result.url()); else - uploadFailed(result.error()); + uploadFailed(result.message()); } // onPostExecute } // class UploadPhotoTask diff --git a/libraries/cyclestreets-view/src/main/res/values/strings.xml b/libraries/cyclestreets-view/src/main/res/values/strings.xml index faa958184..57c1340ad 100644 --- a/libraries/cyclestreets-view/src/main/res/values/strings.xml +++ b/libraries/cyclestreets-view/src/main/res/values/strings.xml @@ -43,10 +43,12 @@ Describe this photo Is this a problem or good practice? What type of feature is being shown? + Could not load photomap categories. Please check network connection. Where was this photo taken? The photo could not be geolocated. To automatically locate photos, please turn on geolocation in your Camera settings. Share this photo Uploading report, please wait + Could not upload photo. Please check your network connection. Upload another Continue without photo @@ -89,10 +91,18 @@ Registering with CycleStreets.net Please enter your account username and password to sign in. + You are already signed in as\n%1$s, %2$s Username Password Clear stored details Sign in Signing into CycleStreets.net + The email address entered is not a properly formatted address. + Password and confirmation password do not match. + Username must be at least five letters/numbers long. + Are you sure you want to clear the stored account details? + You have already registered an account. Please check your email for the verification email. + Registration is free and registered users can add photos. To start the registration process please enter your details in the form below. + From 65fd2325d9f604d05df96bb707cc68cca3043ff2 Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Sat, 22 Oct 2016 12:47:18 +0200 Subject: [PATCH 022/326] Extract hard-coded strings from cyclestreets-core --- .../main/java/net/cyclestreets/api/Feedback.java | 9 ++++----- .../java/net/cyclestreets/api/Registration.java | 9 ++++----- .../src/main/java/net/cyclestreets/api/Signin.java | 13 ++++++------- .../src/main/java/net/cyclestreets/api/Upload.java | 9 ++++----- .../src/main/res/values/strings.xml | 13 +++++++++++++ 5 files changed, 31 insertions(+), 22 deletions(-) diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Feedback.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Feedback.java index 58ecf2e99..7df0a79d6 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Feedback.java +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Feedback.java @@ -1,17 +1,16 @@ package net.cyclestreets.api; +import net.cyclestreets.core.R; + import java.io.IOException; public class Feedback { - private static final String okMessage = "Thank you for submitting this feedback. We will get back to you when we have checked this out."; - private static final String errorPrefix = "Your feedback could not be sent.\n\n"; - public static Result ok() { - return new Result(okMessage); + return new Result(ApiClient.context().getString(R.string.feedback_ok)); } public static Result error(String errorMessage) { - return new Result(errorPrefix, errorMessage); + return new Result(ApiClient.context().getString(R.string.feedback_error_prefix), errorMessage); } ////////////////////////////////////////////////////// diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Registration.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Registration.java index aef18d1b7..825e8f59e 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Registration.java +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Registration.java @@ -1,17 +1,16 @@ package net.cyclestreets.api; +import net.cyclestreets.core.R; + import java.io.IOException; public class Registration { - private static final String okMessage = "Your account has been registered.\n\nAn email has been sent to the address you gave.\n\nWhen the email arrives, follow the instructions it contains to complete the registration."; - private static final String errorPrefix = "Your account could not be registered.\n\n"; - public static Result ok() { - return new Result(okMessage); + return new Result(ApiClient.context().getString(R.string.registration_ok)); } public static Result error(String errorMessage) { - return new Result(errorPrefix, errorMessage); + return new Result(ApiClient.context().getString(R.string.registration_error_prefix), errorMessage); } ////////////////////////////////////////////////////// diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Signin.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Signin.java index e95fb76b1..4b9f038d6 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Signin.java +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Signin.java @@ -1,14 +1,12 @@ package net.cyclestreets.api; +import net.cyclestreets.core.R; + public class Signin { public static class Result extends net.cyclestreets.api.Result { private String name; private String email; - private static final String okMessage = "You have successfully signed into CycleStreets."; - private static final String errorPrefix = "Error : "; - private static final String defaultError = "Could not sign into CycleStreets. Please check your username and password."; - public static Result forNameAndEmail(String name, String email) { return new Result(name, email); } @@ -18,18 +16,19 @@ public static Result error(String error) { } private Result(String name, String email) { - super(okMessage); + super(ApiClient.context().getString(R.string.signin_ok)); this.name = name; this.email = email; } private Result(final String error) { - super(errorPrefix, error != null ? error : defaultError); + super(ApiClient.context().getString(R.string.signin_error_prefix), + error != null ? error : ApiClient.context().getString(R.string.signin_default_error)); } public String email() { return email; } public String name() { return name; } - } // class Result + } public static Result signin(final String username, final String password) { diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Upload.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Upload.java index 999487dbe..a34536c95 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Upload.java +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/Upload.java @@ -1,5 +1,7 @@ package net.cyclestreets.api; +import net.cyclestreets.core.R; + import org.osmdroid.api.IGeoPoint; import java.io.IOException; @@ -8,19 +10,16 @@ public class Upload { public static class Result extends net.cyclestreets.api.Result { private String url; - private static final String okMessage = "You have successfully signed into CycleStreets."; - private static final String errorPrefix = "There was a problem uploading your photo: \n"; - public static Result forUrl(String url) { return new Result(url); } public static Result error(String error) { - return new Result(errorPrefix, error); + return new Result(ApiClient.context().getString(R.string.upload_error_prefix), error); } private Result(String url) { - super(okMessage); + super(ApiClient.context().getString(R.string.upload_ok)); this.url = url; } diff --git a/libraries/cyclestreets-core/src/main/res/values/strings.xml b/libraries/cyclestreets-core/src/main/res/values/strings.xml index fe1617bdb..537504476 100644 --- a/libraries/cyclestreets-core/src/main/res/values/strings.xml +++ b/libraries/cyclestreets-core/src/main/res/values/strings.xml @@ -1,4 +1,17 @@ Show Blog update notifications + + Thank you for submitting this feedback. We will get back to you when we have checked this out. + Your feedback could not be sent.\n\n + + Your account has been registered.\n\nAn email has been sent to the address you gave.\n\nWhen the email arrives, follow the instructions it contains to complete the registration. + Your account could not be registered.\n\n + + You have successfully signed into CycleStreets. + "Error : " + Could not sign into CycleStreets. Please check your username and password. + + You have successfully signed into CycleStreets. + There was a problem uploading your photo: \n From d7a241721e7c2298e40318158943c193ad8e107a Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Sat, 22 Oct 2016 12:51:32 +0200 Subject: [PATCH 023/326] Remove all files in unused package net.cyclestreets.api.json --- .../api/json/JsonArrayHandler.java | 61 - .../api/json/JsonItemHandler.java | 7 - .../api/json/JsonObjectHandler.java | 84 -- .../net/cyclestreets/api/json/JsonReader.java | 1017 ----------------- .../api/json/JsonRootHandler.java | 10 - .../api/json/JsonRootObjectHandler.java | 25 - .../net/cyclestreets/api/json/JsonScope.java | 49 - .../api/json/JsonStringHandler.java | 26 - .../net/cyclestreets/api/json/JsonToken.java | 17 - .../net/cyclestreets/api/json/StringPool.java | 44 - 10 files changed, 1340 deletions(-) delete mode 100644 libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonArrayHandler.java delete mode 100644 libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonItemHandler.java delete mode 100644 libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonObjectHandler.java delete mode 100644 libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonReader.java delete mode 100644 libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonRootHandler.java delete mode 100644 libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonRootObjectHandler.java delete mode 100644 libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonScope.java delete mode 100644 libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonStringHandler.java delete mode 100644 libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonToken.java delete mode 100644 libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/StringPool.java diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonArrayHandler.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonArrayHandler.java deleted file mode 100644 index 7bdcd80cb..000000000 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonArrayHandler.java +++ /dev/null @@ -1,61 +0,0 @@ -package net.cyclestreets.api.json; - -import java.io.IOException; - -public class JsonArrayHandler implements JsonItemHandler { - public interface BeginListener { - void begin(String name); - } - public interface EndListener { - void end(); - } - public interface Listener extends BeginListener, EndListener { - } - - private JsonItemHandler itemHandler_; - private BeginListener begin_; - private EndListener end_; - - public JsonArrayHandler() { - itemHandler_ = null; - begin_ = null; - end_ = null; - } // JsonRootObject - - public void setBeginObjectListener(final BeginListener begin) { begin_ = begin; } - public void setEndObjectListener(final EndListener end) { end_ = end; } - public void setObjectListener(final Listener obj) { - begin_ = obj; - end_ = obj; - } // setObjectListener - - public final JsonObjectHandler getObject() { - if (itemHandler_ == null) - itemHandler_ = new JsonObjectHandler(); - return (JsonObjectHandler)itemHandler_; - } // getObject - public final JsonStringHandler getString() { - if (itemHandler_ == null) - itemHandler_ = new JsonStringHandler(); - return (JsonStringHandler)itemHandler_; - } // getString - - @Override - public final void read(final String objectName, final JsonReader reader) throws IOException { - if (begin_ != null) - begin_.begin(objectName); - - reader.beginArray(); - - while(reader.hasNext()) - if (itemHandler_ != null) - itemHandler_.read(objectName, reader); - else - reader.skipValue(); - - reader.endArray(); - - if (end_ != null) - end_.end(); - } // read -} // JsonArrayHandler diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonItemHandler.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonItemHandler.java deleted file mode 100644 index f8b63588c..000000000 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonItemHandler.java +++ /dev/null @@ -1,7 +0,0 @@ -package net.cyclestreets.api.json; - -import java.io.IOException; - -public interface JsonItemHandler { - void read(final String name, final JsonReader reader) throws IOException; -} diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonObjectHandler.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonObjectHandler.java deleted file mode 100644 index 77c4da1d6..000000000 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonObjectHandler.java +++ /dev/null @@ -1,84 +0,0 @@ -package net.cyclestreets.api.json; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -public class JsonObjectHandler implements JsonItemHandler { - public interface BeginListener { - void begin(String name); - } - public interface EndListener { - void end(); - } - public interface Listener extends BeginListener, EndListener { - } - - public static String ANY_OBJECT = null; - - private Map items_; - private JsonItemHandler anyItem_; - private BeginListener begin_; - private EndListener end_; - - public JsonObjectHandler() { - items_ = new HashMap<>(); - anyItem_ = null; - begin_ = null; - end_ = null; - } // JsonRootObject - - public void setBeginObjectListener(final BeginListener begin) { begin_ = begin; } - public void setEndObjectListener(final EndListener end) { end_ = end; } - public void setObjectListener(final Listener obj) { - begin_ = obj; - end_ = obj; - } // setObjectListener - - public final JsonArrayHandler getArray(final String name) { - return (JsonArrayHandler)getChild(name, new JsonArrayHandler()); - } // getObject - public final JsonObjectHandler getObject(final String name) { - return (JsonObjectHandler)getChild(name, new JsonObjectHandler()); - } // getObject - public final JsonStringHandler getString(final String name) { - return (JsonStringHandler)getChild(name, new JsonStringHandler()); - } // getString - - private JsonItemHandler getChild(final String name, final JsonItemHandler newHandler) { - if (name == ANY_OBJECT) { - if (anyItem_ == null) - anyItem_ = newHandler; - return anyItem_; - } // if ... - - if (!items_.containsKey(name)) - items_.put(name, newHandler); - return items_.get(name); - } // getChild - - @Override - public final void read(final String objectName, final JsonReader reader) throws IOException { - if (begin_ != null) - begin_.begin(objectName); - - reader.beginObject(); - - while(reader.hasNext()) { - final String name = reader.nextName(); - - final JsonItemHandler item = items_.get(name); - if (item != null) - item.read(name, reader); - else if (anyItem_ != null) - anyItem_.read(name, reader); - else - reader.skipValue(); - } // while ... - - reader.endObject(); - - if (end_ != null) - end_.end(); - } // read -} // JsonObject diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonReader.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonReader.java deleted file mode 100644 index 80f4587a6..000000000 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonReader.java +++ /dev/null @@ -1,1017 +0,0 @@ -package net.cyclestreets.api.json; - -/* - * Copyright (C) 2010 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import java.io.Closeable; -import java.io.EOFException; -import java.io.IOException; -import java.io.Reader; -import java.util.ArrayList; -import java.util.List; - -public final class JsonReader implements Closeable { - - private static final String TRUE = "true"; - private static final String FALSE = "false"; - - private final StringPool stringPool = new StringPool(); - - /** The input JSON. */ - private final Reader in; - - /** True to accept non-spec compliant JSON */ - private boolean lenient = false; - - /** - * Use a manual buffer to easily read and unread upcoming characters, and - * also so we can create strings without an intermediate StringBuilder. - * We decode literals directly out of this buffer, so it must be at least as - * long as the longest token that can be reported as a number. - */ - private final char[] buffer = new char[1024]; - private int pos = 0; - private int limit = 0; - - /* - * The offset of the first character in the buffer. - */ - private int bufferStartLine = 1; - private int bufferStartColumn = 1; - - private final List stack = new ArrayList<>(); - { - push(JsonScope.EMPTY_DOCUMENT); - } - - /** - * The type of the next token to be returned by {@link #peek} and {@link - * #advance}. If null, peek() will assign a value. - */ - private JsonToken token; - - /** The text of the next name. */ - private String name; - - /* - * For the next literal value, we may have the text value, or the position - * and length in the buffer. - */ - private String value; - private int valuePos; - private int valueLength; - - /** True if we're currently handling a skipValue() call. */ - private boolean skipping = false; - - /** - * Creates a new instance that reads a JSON-encoded stream from {@code in}. - */ - public JsonReader(Reader in) { - if (in == null) { - throw new NullPointerException("in == null"); - } - this.in = in; - } - - /** - * Configure this parser to be be liberal in what it accepts. By default, - * this parser is strict and only accepts JSON as specified by RFC 4627. Setting the - * parser to lenient causes it to ignore the following syntax errors: - * - *

    - *
  • End of line comments starting with {@code //} or {@code #} and - * ending with a newline character. - *
  • C-style comments starting with {@code /*} and ending with - * {@code *}{@code /}. Such comments may not be nested. - *
  • Names that are unquoted or {@code 'single quoted'}. - *
  • Strings that are unquoted or {@code 'single quoted'}. - *
  • Array elements separated by {@code ;} instead of {@code ,}. - *
  • Unnecessary array separators. These are interpreted as if null - * was the omitted value. - *
  • Names and values separated by {@code =} or {@code =>} instead of - * {@code :}. - *
  • Name/value pairs separated by {@code ;} instead of {@code ,}. - *
- */ - public void setLenient(boolean lenient) { - this.lenient = lenient; - } - - /** - * Returns true if this parser is liberal in what it accepts. - */ - public boolean isLenient() { - return lenient; - } - - /** - * Consumes the next token from the JSON stream and asserts that it is the - * beginning of a new array. - */ - public void beginArray() throws IOException { - expect(JsonToken.BEGIN_ARRAY); - } - - /** - * Consumes the next token from the JSON stream and asserts that it is the - * end of the current array. - */ - public void endArray() throws IOException { - expect(JsonToken.END_ARRAY); - } - - /** - * Consumes the next token from the JSON stream and asserts that it is the - * beginning of a new object. - */ - public void beginObject() throws IOException { - expect(JsonToken.BEGIN_OBJECT); - } - - /** - * Consumes the next token from the JSON stream and asserts that it is the - * end of the current array. - */ - public void endObject() throws IOException { - expect(JsonToken.END_OBJECT); - } - - /** - * Consumes {@code expected}. - */ - private void expect(JsonToken expected) throws IOException { - peek(); - if (token != expected) { - throw new IllegalStateException("Expected " + expected + " but was " + peek()); - } - advance(); - } - - /** - * Returns true if the current array or object has another element. - */ - public boolean hasNext() throws IOException { - peek(); - return token != JsonToken.END_OBJECT && token != JsonToken.END_ARRAY; - } - - /** - * Returns the type of the next token without consuming it. - */ - public JsonToken peek() throws IOException { - if (token != null) { - return token; - } - - switch (peekStack()) { - case EMPTY_DOCUMENT: - replaceTop(JsonScope.NONEMPTY_DOCUMENT); - JsonToken firstToken = nextValue(); - if (!lenient && token != JsonToken.BEGIN_ARRAY && token != JsonToken.BEGIN_OBJECT) { - throw new IOException( - "Expected JSON document to start with '[' or '{' but was " + token); - } - return firstToken; - case EMPTY_ARRAY: - return nextInArray(true); - case NONEMPTY_ARRAY: - return nextInArray(false); - case EMPTY_OBJECT: - return nextInObject(true); - case DANGLING_NAME: - return objectValue(); - case NONEMPTY_OBJECT: - return nextInObject(false); - case NONEMPTY_DOCUMENT: - try { - JsonToken token = nextValue(); - if (lenient) { - return token; - } - throw syntaxError("Expected EOF"); - } catch (EOFException e) { - return token = JsonToken.END_DOCUMENT; // TODO: avoid throwing here? - } - case CLOSED: - throw new IllegalStateException("JsonReader is closed"); - default: - throw new AssertionError(); - } - } - - /** - * Advances the cursor in the JSON stream to the next token. - */ - private JsonToken advance() throws IOException { - peek(); - - JsonToken result = token; - token = null; - value = null; - name = null; - return result; - } - - /** - * Returns the next token, a {@link JsonToken#NAME property name}, and - * consumes it. - * - * @throws IOException if the next token in the stream is not a property - * name. - */ - public String nextName() throws IOException { - peek(); - if (token != JsonToken.NAME) { - throw new IllegalStateException("Expected a name but was " + peek()); - } - String result = name; - advance(); - return result; - } - - /** - * Returns the {@link JsonToken#STRING string} value of the next token, - * consuming it. If the next token is a number, this method will return its - * string form. - * - * @throws IllegalStateException if the next token is not a string or if - * this reader is closed. - */ - public String nextString() throws IOException { - peek(); - if (token != JsonToken.STRING && token != JsonToken.NUMBER) { - throw new IllegalStateException("Expected a string but was " + peek()); - } - - String result = value; - advance(); - return result; - } - - /** - * Returns the {@link JsonToken#BOOLEAN boolean} value of the next token, - * consuming it. - * - * @throws IllegalStateException if the next token is not a boolean or if - * this reader is closed. - */ - public boolean nextBoolean() throws IOException { - peek(); - if (token != JsonToken.BOOLEAN) { - throw new IllegalStateException("Expected a boolean but was " + token); - } - - boolean result = (TRUE.equals(value)); - advance(); - return result; - } - - /** - * Consumes the next token from the JSON stream and asserts that it is a - * literal null. - * - * @throws IllegalStateException if the next token is not null or if this - * reader is closed. - */ - public void nextNull() throws IOException { - peek(); - if (token != JsonToken.NULL) { - throw new IllegalStateException("Expected null but was " + token); - } - - advance(); - } - - /** - * Returns the {@link JsonToken#NUMBER double} value of the next token, - * consuming it. If the next token is a string, this method will attempt to - * parse it as a double using {@link Double#parseDouble(String)}. - * - * @throws IllegalStateException if the next token is not a literal value. - */ - public double nextDouble() throws IOException { - peek(); - if (token != JsonToken.STRING && token != JsonToken.NUMBER) { - throw new IllegalStateException("Expected a double but was " + token); - } - - double result = Double.parseDouble(value); - advance(); - return result; - } - - /** - * Returns the {@link JsonToken#NUMBER long} value of the next token, - * consuming it. If the next token is a string, this method will attempt to - * parse it as a long. If the next token's numeric value cannot be exactly - * represented by a Java {@code long}, this method throws. - * - * @throws IllegalStateException if the next token is not a literal value. - * @throws NumberFormatException if the next literal value cannot be parsed - * as a number, or exactly represented as a long. - */ - public long nextLong() throws IOException { - peek(); - if (token != JsonToken.STRING && token != JsonToken.NUMBER) { - throw new IllegalStateException("Expected a long but was " + token); - } - - long result; - try { - result = Long.parseLong(value); - } catch (NumberFormatException ignored) { - double asDouble = Double.parseDouble(value); // don't catch this NumberFormatException - result = (long) asDouble; - if ((double) result != asDouble) { - throw new NumberFormatException(value); - } - } - - advance(); - return result; - } - - /** - * Returns the {@link JsonToken#NUMBER int} value of the next token, - * consuming it. If the next token is a string, this method will attempt to - * parse it as an int. If the next token's numeric value cannot be exactly - * represented by a Java {@code int}, this method throws. - * - * @throws IllegalStateException if the next token is not a literal value. - * @throws NumberFormatException if the next literal value cannot be parsed - * as a number, or exactly represented as an int. - */ - public int nextInt() throws IOException { - peek(); - if (token != JsonToken.STRING && token != JsonToken.NUMBER) { - throw new IllegalStateException("Expected an int but was " + token); - } - - int result; - try { - result = Integer.parseInt(value); - } catch (NumberFormatException ignored) { - double asDouble = Double.parseDouble(value); // don't catch this NumberFormatException - result = (int) asDouble; - if ((double) result != asDouble) { - throw new NumberFormatException(value); - } - } - - advance(); - return result; - } - - /** - * Closes this JSON reader and the underlying {@link Reader}. - */ - public void close() throws IOException { - value = null; - token = null; - stack.clear(); - stack.add(JsonScope.CLOSED); - in.close(); - } - - /** - * Skips the next value recursively. If it is an object or array, all nested - * elements are skipped. This method is intended for use when the JSON token - * stream contains unrecognized or unhandled values. - */ - public void skipValue() throws IOException { - skipping = true; - try { - int count = 0; - do { - JsonToken token = advance(); - if (token == JsonToken.BEGIN_ARRAY || token == JsonToken.BEGIN_OBJECT) { - count++; - } else if (token == JsonToken.END_ARRAY || token == JsonToken.END_OBJECT) { - count--; - } - } while (count != 0); - } finally { - skipping = false; - } - } - - private JsonScope peekStack() { - return stack.get(stack.size() - 1); - } - - private JsonScope pop() { - return stack.remove(stack.size() - 1); - } - - private void push(JsonScope newTop) { - stack.add(newTop); - } - - /** - * Replace the value on the top of the stack with the given value. - */ - private void replaceTop(JsonScope newTop) { - stack.set(stack.size() - 1, newTop); - } - - private JsonToken nextInArray(boolean firstElement) throws IOException { - if (firstElement) { - replaceTop(JsonScope.NONEMPTY_ARRAY); - } else { - /* Look for a comma before each element after the first element. */ - switch (nextNonWhitespace()) { - case ']': - pop(); - return token = JsonToken.END_ARRAY; - case ';': - checkLenient(); // fall-through - case ',': - break; - default: - throw syntaxError("Unterminated array"); - } - } - - switch (nextNonWhitespace()) { - case ']': - if (firstElement) { - pop(); - return token = JsonToken.END_ARRAY; - } - // fall-through to handle ",]" - case ';': - case ',': - /* In lenient mode, a 0-length literal means 'null' */ - checkLenient(); - pos--; - value = "null"; - return token = JsonToken.NULL; - default: - pos--; - return nextValue(); - } - } - - private JsonToken nextInObject(boolean firstElement) throws IOException { - /* - * Read delimiters. Either a comma/semicolon separating this and the - * previous name-value pair, or a close brace to denote the end of the - * object. - */ - if (firstElement) { - /* Peek to see if this is the empty object. */ - switch (nextNonWhitespace()) { - case '}': - pop(); - return token = JsonToken.END_OBJECT; - default: - pos--; - } - } else { - switch (nextNonWhitespace()) { - case '}': - pop(); - return token = JsonToken.END_OBJECT; - case ';': - case ',': - break; - default: - throw syntaxError("Unterminated object"); - } - } - - /* Read the name. */ - int quote = nextNonWhitespace(); - switch (quote) { - case '\'': - checkLenient(); // fall-through - case '"': - name = nextString((char) quote); - break; - default: - checkLenient(); - pos--; - name = nextLiteral(false); - if (name.length() == 0) { - throw syntaxError("Expected name"); - } - } - - replaceTop(JsonScope.DANGLING_NAME); - return token = JsonToken.NAME; - } - - private JsonToken objectValue() throws IOException { - /* - * Read the name/value separator. Usually a colon ':'. In lenient mode - * we also accept an equals sign '=', or an arrow "=>". - */ - switch (nextNonWhitespace()) { - case ':': - break; - case '=': - checkLenient(); - if ((pos < limit || fillBuffer(1)) && buffer[pos] == '>') { - pos++; - } - break; - default: - throw syntaxError("Expected ':'"); - } - - replaceTop(JsonScope.NONEMPTY_OBJECT); - return nextValue(); - } - - private JsonToken nextValue() throws IOException { - int c = nextNonWhitespace(); - switch (c) { - case '{': - push(JsonScope.EMPTY_OBJECT); - return token = JsonToken.BEGIN_OBJECT; - - case '[': - push(JsonScope.EMPTY_ARRAY); - return token = JsonToken.BEGIN_ARRAY; - - case '\'': - checkLenient(); // fall-through - case '"': - value = nextString((char) c); - return token = JsonToken.STRING; - - default: - pos--; - return readLiteral(); - } - } - - /** - * Returns true once {@code limit - pos >= minimum}. If the data is - * exhausted before that many characters are available, this returns - * false. - */ - private boolean fillBuffer(int minimum) throws IOException { - // Before clobbering the old characters, update where buffer starts - for (int i = 0; i < pos; i++) { - if (buffer[i] == '\n') { - bufferStartLine++; - bufferStartColumn = 1; - } else { - bufferStartColumn++; - } - } - - if (limit != pos) { - limit -= pos; - System.arraycopy(buffer, pos, buffer, 0, limit); - } else { - limit = 0; - } - - pos = 0; - int total; - while ((total = in.read(buffer, limit, buffer.length - limit)) != -1) { - limit += total; - - // if this is the first read, consume an optional byte order mark (BOM) if it exists - if (bufferStartLine == 1 && bufferStartColumn == 1 - && limit > 0 && buffer[0] == '\ufeff') { - pos++; - bufferStartColumn--; - } - - if (limit >= minimum) { - return true; - } - } - return false; - } - - private int getLineNumber() { - int result = bufferStartLine; - for (int i = 0; i < pos; i++) { - if (buffer[i] == '\n') { - result++; - } - } - return result; - } - - private int getColumnNumber() { - int result = bufferStartColumn; - for (int i = 0; i < pos; i++) { - if (buffer[i] == '\n') { - result = 1; - } else { - result++; - } - } - return result; - } - - private int nextNonWhitespace() throws IOException { - while (pos < limit || fillBuffer(1)) { - int c = buffer[pos++]; - switch (c) { - case '\t': - case ' ': - case '\n': - case '\r': - continue; - - case '/': - if (pos == limit && !fillBuffer(1)) { - return c; - } - - checkLenient(); - char peek = buffer[pos]; - switch (peek) { - case '*': - // skip a /* c-style comment */ - pos++; - if (!skipTo("*/")) { - throw syntaxError("Unterminated comment"); - } - pos += 2; - continue; - - case '/': - // skip a // end-of-line comment - pos++; - skipToEndOfLine(); - continue; - - default: - return c; - } - - case '#': - /* - * Skip a # hash end-of-line comment. The JSON RFC doesn't - * specify this behaviour, but it's required to parse - * existing documents. See http://b/2571423. - */ - checkLenient(); - skipToEndOfLine(); - continue; - - default: - return c; - } - } - - throw new EOFException("End of input"); - } - - private void checkLenient() throws IOException { - if (!lenient) { - throw syntaxError("Use JsonReader.setLenient(true) to accept malformed JSON"); - } - } - - /** - * Advances the position until after the next newline character. If the line - * is terminated by "\r\n", the '\n' must be consumed as whitespace by the - * caller. - */ - private void skipToEndOfLine() throws IOException { - while (pos < limit || fillBuffer(1)) { - char c = buffer[pos++]; - if (c == '\r' || c == '\n') { - break; - } - } - } - - private boolean skipTo(String toFind) throws IOException { - outer: - for (; pos + toFind.length() <= limit || fillBuffer(toFind.length()); pos++) { - for (int c = 0; c < toFind.length(); c++) { - if (buffer[pos + c] != toFind.charAt(c)) { - continue outer; - } - } - return true; - } - return false; - } - - /** - * Returns the string up to but not including {@code quote}, unescaping any - * character escape sequences encountered along the way. The opening quote - * should have already been read. This consumes the closing quote, but does - * not include it in the returned string. - * - * @param quote either ' or ". - * @throws NumberFormatException if any unicode escape sequences are - * malformed. - */ - private String nextString(char quote) throws IOException { - StringBuilder builder = null; - do { - /* the index of the first character not yet appended to the builder. */ - int start = pos; - while (pos < limit) { - int c = buffer[pos++]; - - if (c == quote) { - if (skipping) { - return "skipped!"; - } else if (builder == null) { - return stringPool.get(buffer, start, pos - start - 1); - } else { - builder.append(buffer, start, pos - start - 1); - return builder.toString(); - } - - } else if (c == '\\') { - if (builder == null) { - builder = new StringBuilder(); - } - builder.append(buffer, start, pos - start - 1); - builder.append(readEscapeCharacter()); - start = pos; - } - } - - if (builder == null) { - builder = new StringBuilder(); - } - builder.append(buffer, start, pos - start); - } while (fillBuffer(1)); - - throw syntaxError("Unterminated string"); - } - - /** - * Reads the value up to but not including any delimiter characters. This - * does not consume the delimiter character. - * - * @param assignOffsetsOnly true for this method to only set the valuePos - * and valueLength fields and return a null result. This only works if - * the literal is short; a string is returned otherwise. - */ - private String nextLiteral(boolean assignOffsetsOnly) throws IOException { - StringBuilder builder = null; - valuePos = -1; - valueLength = 0; - int i = 0; - - findNonLiteralCharacter: - while (true) { - for (; pos + i < limit; i++) { - switch (buffer[pos + i]) { - case '/': - case '\\': - case ';': - case '#': - case '=': - checkLenient(); // fall-through - case '{': - case '}': - case '[': - case ']': - case ':': - case ',': - case ' ': - case '\t': - case '\f': - case '\r': - case '\n': - break findNonLiteralCharacter; - } - } - - /* - * Attempt to load the entire literal into the buffer at once. If - * we run out of input, add a non-literal character at the end so - * that decoding doesn't need to do bounds checks. - */ - if (i < buffer.length) { - if (fillBuffer(i + 1)) { - continue; - } else { - buffer[limit] = '\0'; - break; - } - } - - // use a StringBuilder when the value is too long. It must be an unquoted string. - if (builder == null) { - builder = new StringBuilder(); - } - builder.append(buffer, pos, i); - valueLength += i; - pos += i; - i = 0; - if (!fillBuffer(1)) { - break; - } - } - - String result; - if (assignOffsetsOnly && builder == null) { - valuePos = pos; - result = null; - } else if (skipping) { - result = "skipped!"; - } else if (builder == null) { - result = stringPool.get(buffer, pos, i); - } else { - builder.append(buffer, pos, i); - result = builder.toString(); - } - valueLength += i; - pos += i; - return result; - } - - @Override public String toString() { - return getClass().getSimpleName() + " near " + getSnippet(); - } - - /** - * Unescapes the character identified by the character or characters that - * immediately follow a backslash. The backslash '\' should have already - * been read. This supports both unicode escapes "u000A" and two-character - * escapes "\n". - * - * @throws NumberFormatException if any unicode escape sequences are - * malformed. - */ - private char readEscapeCharacter() throws IOException { - if (pos == limit && !fillBuffer(1)) { - throw syntaxError("Unterminated escape sequence"); - } - - char escaped = buffer[pos++]; - switch (escaped) { - case 'u': - if (pos + 4 > limit && !fillBuffer(4)) { - throw syntaxError("Unterminated escape sequence"); - } - String hex = stringPool.get(buffer, pos, 4); - pos += 4; - return (char) Integer.parseInt(hex, 16); - - case 't': - return '\t'; - - case 'b': - return '\b'; - - case 'n': - return '\n'; - - case 'r': - return '\r'; - - case 'f': - return '\f'; - - case '\'': - case '"': - case '\\': - default: - return escaped; - } - } - - /** - * Reads a null, boolean, numeric or unquoted string literal value. - */ - private JsonToken readLiteral() throws IOException { - value = nextLiteral(true); - if (valueLength == 0) { - throw syntaxError("Expected literal value"); - } - token = decodeLiteral(); - if (token == JsonToken.STRING) { - checkLenient(); - } - return token; - } - - /** - * Assigns {@code nextToken} based on the value of {@code nextValue}. - */ - private JsonToken decodeLiteral() throws IOException { - if (valuePos == -1) { - // it was too long to fit in the buffer so it can only be a string - return JsonToken.STRING; - } else if (valueLength == 4 - && ('n' == buffer[valuePos ] || 'N' == buffer[valuePos ]) - && ('u' == buffer[valuePos + 1] || 'U' == buffer[valuePos + 1]) - && ('l' == buffer[valuePos + 2] || 'L' == buffer[valuePos + 2]) - && ('l' == buffer[valuePos + 3] || 'L' == buffer[valuePos + 3])) { - value = "null"; - return JsonToken.NULL; - } else if (valueLength == 4 - && ('t' == buffer[valuePos ] || 'T' == buffer[valuePos ]) - && ('r' == buffer[valuePos + 1] || 'R' == buffer[valuePos + 1]) - && ('u' == buffer[valuePos + 2] || 'U' == buffer[valuePos + 2]) - && ('e' == buffer[valuePos + 3] || 'E' == buffer[valuePos + 3])) { - value = TRUE; - return JsonToken.BOOLEAN; - } else if (valueLength == 5 - && ('f' == buffer[valuePos ] || 'F' == buffer[valuePos ]) - && ('a' == buffer[valuePos + 1] || 'A' == buffer[valuePos + 1]) - && ('l' == buffer[valuePos + 2] || 'L' == buffer[valuePos + 2]) - && ('s' == buffer[valuePos + 3] || 'S' == buffer[valuePos + 3]) - && ('e' == buffer[valuePos + 4] || 'E' == buffer[valuePos + 4])) { - value = FALSE; - return JsonToken.BOOLEAN; - } else { - value = stringPool.get(buffer, valuePos, valueLength); - return decodeNumber(buffer, valuePos, valueLength); - } - } - - /** - * Determine whether the characters is a JSON number. Numbers are of the - * form -12.34e+56. Fractional and exponential parts are optional. Leading - * zeroes are not allowed in the value or exponential part, but are allowed - * in the fraction. - */ - private JsonToken decodeNumber(char[] chars, int offset, int length) { - int i = offset; - int c = chars[i]; - - if (c == '-') { - c = chars[++i]; - } - - if (c == '0') { - c = chars[++i]; - } else if (c >= '1' && c <= '9') { - c = chars[++i]; - while (c >= '0' && c <= '9') { - c = chars[++i]; - } - } else { - return JsonToken.STRING; - } - - if (c == '.') { - c = chars[++i]; - while (c >= '0' && c <= '9') { - c = chars[++i]; - } - } - - if (c == 'e' || c == 'E') { - c = chars[++i]; - if (c == '+' || c == '-') { - c = chars[++i]; - } - if (c >= '0' && c <= '9') { - c = chars[++i]; - while (c >= '0' && c <= '9') { - c = chars[++i]; - } - } else { - return JsonToken.STRING; - } - } - - if (i == offset + length) { - return JsonToken.NUMBER; - } else { - return JsonToken.STRING; - } - } - - /** - * Throws a new IO exception with the given message and a context snippet - * with this reader's content. - */ - private IOException syntaxError(String message) throws IOException { - throw new RuntimeException(message - + " at line " + getLineNumber() + " column " + getColumnNumber()); - } - - private CharSequence getSnippet() { - StringBuilder snippet = new StringBuilder(); - int beforePos = Math.min(pos, 20); - snippet.append(buffer, pos - beforePos, beforePos); - int afterPos = Math.min(limit - pos, 20); - snippet.append(buffer, pos, afterPos); - return snippet; - } -} diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonRootHandler.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonRootHandler.java deleted file mode 100644 index 1dbdd8b34..000000000 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonRootHandler.java +++ /dev/null @@ -1,10 +0,0 @@ -package net.cyclestreets.api.json; - -import java.io.IOException; - -public interface JsonRootHandler { - JsonArrayHandler getArray(final String name); - JsonObjectHandler getObject(final String name); - - void read(final JsonReader reader) throws IOException; -} diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonRootObjectHandler.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonRootObjectHandler.java deleted file mode 100644 index 6a470f1fe..000000000 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonRootObjectHandler.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.cyclestreets.api.json; - -import java.io.IOException; - -public class JsonRootObjectHandler implements JsonRootHandler { - private JsonObjectHandler objectHandler_; - - public JsonRootObjectHandler() { - objectHandler_ = new JsonObjectHandler(); - } // JsonRootObject - - @Override - public JsonArrayHandler getArray(final String name) { - return objectHandler_.getArray(name); - } // getArray - @Override - public JsonObjectHandler getObject(final String name) { - return objectHandler_.getObject(name); - } // getObject - - @Override - public void read(final JsonReader reader) throws IOException { - objectHandler_.read(null, reader); - } // read -} // JsonRootObject diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonScope.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonScope.java deleted file mode 100644 index 09dfd1e68..000000000 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonScope.java +++ /dev/null @@ -1,49 +0,0 @@ -package net.cyclestreets.api.json; - -enum JsonScope { - - /** - * An array with no elements requires no separators or newlines before - * it is closed. - */ - EMPTY_ARRAY, - - /** - * A array with at least one value requires a comma and newline before - * the next element. - */ - NONEMPTY_ARRAY, - - /** - * An object with no name/value pairs requires no separators or newlines - * before it is closed. - */ - EMPTY_OBJECT, - - /** - * An object whose most recent element is a key. The next element must - * be a value. - */ - DANGLING_NAME, - - /** - * An object with at least one name/value pair requires a comma and - * newline before the next element. - */ - NONEMPTY_OBJECT, - - /** - * No object or array has been started. - */ - EMPTY_DOCUMENT, - - /** - * A document with at an array or object. - */ - NONEMPTY_DOCUMENT, - - /** - * A document that's been closed and cannot be accessed. - */ - CLOSED, -} diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonStringHandler.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonStringHandler.java deleted file mode 100644 index db8901e2e..000000000 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonStringHandler.java +++ /dev/null @@ -1,26 +0,0 @@ -package net.cyclestreets.api.json; - - -import java.io.IOException; - -public class JsonStringHandler implements JsonItemHandler { - public interface Listener { - void string(final String name, final String value); - } // Listener - - private Listener listener_; - - public void setListener(final Listener listener) { listener_ = listener; } - - public final void read(final String name, final JsonReader reader) throws IOException { - String value = null; - - if (reader.peek() != JsonToken.NULL) - value = reader.nextString(); - else - reader.nextNull(); - - if (listener_ != null) - listener_.string(name, value); - } // read -} // JsonStringHandler diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonToken.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonToken.java deleted file mode 100644 index 9b048ed23..000000000 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/JsonToken.java +++ /dev/null @@ -1,17 +0,0 @@ -package net.cyclestreets.api.json; - -/** - * A structure, name or value type in a JSON-encoded string. - */ -public enum JsonToken { - BEGIN_ARRAY, - END_ARRAY, - BEGIN_OBJECT, - END_OBJECT, - NAME, - STRING, - NUMBER, - BOOLEAN, - NULL, - END_DOCUMENT -} diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/StringPool.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/StringPool.java deleted file mode 100644 index 0a2e96f0a..000000000 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/json/StringPool.java +++ /dev/null @@ -1,44 +0,0 @@ -package net.cyclestreets.api.json; - -/** - * A pool of string instances. Unlike the {@link String#intern() VM's - * interned strings}, this pool provides no guarantee of reference equality. - * It is intended only to save allocations. This class is not thread safe. - */ -final class StringPool { - private final String[] pool = new String[512]; - private static boolean contentEquals(String s, char[] chars, int start, int length) { - if (s.length() != length) { - return false; - } - for (int i = 0; i < length; i++) { - if (chars[start + i] != s.charAt(i)) { - return false; - } - } - return true; - } - /** - * Returns a string equal to {@code new String(array, start, length)}. - */ - public String get(char[] array, int start, int length) { - // Compute an arbitrary hash of the content - int hashCode = 0; - for (int i = start; i < start + length; i++) { - hashCode = (hashCode * 31) + array[i]; - } - // Pick a bucket using Doug Lea's supplemental secondaryHash function (from HashMap) - hashCode ^= (hashCode >>> 20) ^ (hashCode >>> 12); - hashCode ^= (hashCode >>> 7) ^ (hashCode >>> 4); - int index = hashCode & (pool.length - 1); - String pooled = pool[index]; - if (pooled != null && contentEquals(pooled, array, start, length)) { - return pooled; - } - String result = new String(array, start, length); - pool[index] = result; - return result; - } -} - - From 520e236b6d8f6fdcae833b1b1eabdb73a0654f1a Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Sun, 23 Oct 2016 12:21:31 +0100 Subject: [PATCH 024/326] Minor fixes (thanks, Travis) --- .../src/main/res/values/strings.xml | 4 ++-- .../RetrofitApiClientIntegrationTest.java | 17 +++++++++++++++++ .../api/client/RetrofitApiClientTest.java | 19 +++++++++++++++++-- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/libraries/cyclestreets-core/src/main/res/values/strings.xml b/libraries/cyclestreets-core/src/main/res/values/strings.xml index 537504476..323ca553f 100644 --- a/libraries/cyclestreets-core/src/main/res/values/strings.xml +++ b/libraries/cyclestreets-core/src/main/res/values/strings.xml @@ -9,9 +9,9 @@ Your account could not be registered.\n\n You have successfully signed into CycleStreets. - "Error : " + Error : Could not sign into CycleStreets. Please check your username and password. - You have successfully signed into CycleStreets. + Your photo was uploaded successfully. There was a problem uploading your photo: \n diff --git a/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientIntegrationTest.java b/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientIntegrationTest.java index 2aadb55fb..fd7633341 100644 --- a/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientIntegrationTest.java +++ b/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientIntegrationTest.java @@ -2,6 +2,7 @@ import android.content.Context; +import net.cyclestreets.api.ApiClient; import net.cyclestreets.api.Blog; import net.cyclestreets.api.Feedback; import net.cyclestreets.api.GeoPlace; @@ -18,6 +19,7 @@ import net.cyclestreets.api.Upload; import net.cyclestreets.api.UserJourney; import net.cyclestreets.api.UserJourneys; +import net.cyclestreets.core.R; import org.apache.commons.io.IOUtils; import org.junit.Before; @@ -27,6 +29,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.lang.reflect.Field; import java.util.List; import java.util.Random; @@ -52,6 +55,20 @@ public void setUp() throws Exception { .withV1Host("https://www.cyclestreets.net") .withV2Host("https://api.cyclestreets.net") .build(); + + when(testContext.getString(R.string.feedback_ok)).thenReturn("Thank you for submitting this feedback. We will get back to you when we have checked this out."); + when(testContext.getString(R.string.feedback_error_prefix)).thenReturn("Your feedback could not be sent.\n\n"); + when(testContext.getString(R.string.registration_ok)).thenReturn("Your account has been registered.\n\nAn email has been sent to the address you gave.\n\nWhen the email arrives, follow the instructions it contains to complete the registration."); + when(testContext.getString(R.string.registration_error_prefix)).thenReturn("Your account could not be registered.\n\n"); + when(testContext.getString(R.string.signin_ok)).thenReturn("You have successfully signed into CycleStreets."); + when(testContext.getString(R.string.signin_error_prefix)).thenReturn("Error : "); + when(testContext.getString(R.string.signin_default_error)).thenReturn("Could not sign into CycleStreets. Please check your username and password."); + when(testContext.getString(R.string.upload_ok)).thenReturn("Your photo was uploaded successfully."); + when(testContext.getString(R.string.upload_error_prefix)).thenReturn("There was a problem uploading your photo: \n"); + // Use reflection to set context without doing full initialise + Field contextField = ApiClient.class.getDeclaredField("context"); + contextField.setAccessible(true); + contextField.set(ApiClient.class, testContext); } private String getApiKey() throws IOException { diff --git a/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientTest.java b/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientTest.java index 95b9e4754..34e8b91dd 100644 --- a/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientTest.java +++ b/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientTest.java @@ -5,8 +5,8 @@ import com.github.tomakehurst.wiremock.junit.WireMockRule; import com.github.tomakehurst.wiremock.verification.LoggedRequest; +import net.cyclestreets.api.ApiClient; import net.cyclestreets.api.Blog; -import net.cyclestreets.api.Feedback; import net.cyclestreets.api.GeoPlace; import net.cyclestreets.api.GeoPlaces; import net.cyclestreets.api.POI; @@ -16,12 +16,12 @@ import net.cyclestreets.api.PhotomapCategories; import net.cyclestreets.api.PhotomapCategory; import net.cyclestreets.api.Photos; -import net.cyclestreets.api.Registration; import net.cyclestreets.api.Result; import net.cyclestreets.api.Signin; import net.cyclestreets.api.Upload; import net.cyclestreets.api.UserJourney; import net.cyclestreets.api.UserJourneys; +import net.cyclestreets.core.R; import org.apache.commons.io.FileUtils; import org.junit.Before; @@ -34,6 +34,7 @@ import org.robolectric.annotation.Config; import java.io.File; +import java.lang.reflect.Field; import java.util.Iterator; import java.util.List; @@ -81,6 +82,20 @@ public void setUp() throws Exception { .withV1Host("http://localhost:8089") .withV2Host("http://localhost:8089") .build(); + + when(testContext.getString(R.string.feedback_ok)).thenReturn("Thank you for submitting this feedback. We will get back to you when we have checked this out."); + when(testContext.getString(R.string.feedback_error_prefix)).thenReturn("Your feedback could not be sent.\n\n"); + when(testContext.getString(R.string.registration_ok)).thenReturn("Your account has been registered.\n\nAn email has been sent to the address you gave.\n\nWhen the email arrives, follow the instructions it contains to complete the registration."); + when(testContext.getString(R.string.registration_error_prefix)).thenReturn("Your account could not be registered.\n\n"); + when(testContext.getString(R.string.signin_ok)).thenReturn("You have successfully signed into CycleStreets."); + when(testContext.getString(R.string.signin_error_prefix)).thenReturn("Error : "); + when(testContext.getString(R.string.signin_default_error)).thenReturn("Could not sign into CycleStreets. Please check your username and password."); + when(testContext.getString(R.string.upload_ok)).thenReturn("Your photo was uploaded successfully."); + when(testContext.getString(R.string.upload_error_prefix)).thenReturn("There was a problem uploading your photo: \n"); + // Use reflection to set context without doing full initialise + Field contextField = ApiClient.class.getDeclaredField("context"); + contextField.setAccessible(true); + contextField.set(ApiClient.class, testContext); } @Test From c12144eddb4893f2f900090b6c45ed30a0414d88 Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Tue, 25 Oct 2016 17:18:53 +0100 Subject: [PATCH 025/326] Add initial Transifex config file --- .tx/config | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .tx/config diff --git a/.tx/config b/.tx/config new file mode 100644 index 000000000..85a8d9abe --- /dev/null +++ b/.tx/config @@ -0,0 +1,8 @@ +[main] +host = https://www.transifex.com + +[cyclestreets-android.app] +source_file = cyclestreets.vNext/src/main/res/values/strings.xml +source_lang = en +type = ANDROID +file_filter = cyclestreets.vNext/src/main/res/values-/strings.xml From 6b5039313c11cc39220a14188a8d2576d3f9306b Mon Sep 17 00:00:00 2001 From: Rafael Auyer Date: Tue, 25 Oct 2016 20:46:05 -0200 Subject: [PATCH 026/326] Brazilian Portuguese Translation --- .../src/main/res/values-pt/arrays.xml | 125 ++++++++++++++++++ .../src/main/res/values-pt/strings.xml | 17 +++ .../src/main/res/values-pt/colors.xml | 4 + .../src/main/res/values-pt/dimens.xml | 12 ++ .../src/main/res/values-pt/strings.xml | 72 ++++++++++ .../src/main/res/values-pt/styles.xml | 21 +++ .../src/main/res/values-pt/strings.xml | 54 ++++++++ .../src/main/res/values-pt/strings.xml | 107 +++++++++++++++ .../src/main/res/values-pt/styles.xml | 12 ++ 9 files changed, 424 insertions(+) create mode 100644 libraries/cyclestreets-core/src/main/res/values-pt/arrays.xml create mode 100644 libraries/cyclestreets-core/src/main/res/values-pt/strings.xml create mode 100755 libraries/cyclestreets-fragments/src/main/res/values-pt/colors.xml create mode 100644 libraries/cyclestreets-fragments/src/main/res/values-pt/dimens.xml create mode 100644 libraries/cyclestreets-fragments/src/main/res/values-pt/strings.xml create mode 100644 libraries/cyclestreets-fragments/src/main/res/values-pt/styles.xml create mode 100644 libraries/cyclestreets-track/src/main/res/values-pt/strings.xml create mode 100644 libraries/cyclestreets-view/src/main/res/values-pt/strings.xml create mode 100644 libraries/cyclestreets-view/src/main/res/values-pt/styles.xml diff --git a/libraries/cyclestreets-core/src/main/res/values-pt/arrays.xml b/libraries/cyclestreets-core/src/main/res/values-pt/arrays.xml new file mode 100644 index 000000000..4c8beb89a --- /dev/null +++ b/libraries/cyclestreets-core/src/main/res/values-pt/arrays.xml @@ -0,0 +1,125 @@ + + + + Kilometres + Miles + + + km + miles + + + Unhurried 10mph (16km/h) + Cruising 12mph (20km/h) + Quick 15mph (24km/h) + + + 16 + 20 + 24 + + + Quietest + Balanced + Fastest + Shortest + + + quietest + balanced + fastest + shortest + + + Always resize to 640 pixels wide + Full size when WiFi, 3.5G or 4G available + Full size + + + 640px + bigIfWifi + big + + + + 15 m + 20 m + 25 m + 30 m + 35 m + 40 m + 45 m + 50 m + 55 m + 60 m + 65 m + 70 m + 75 m + 80 m + 85 m + 90 m + 95 m + 100 m + 105 m + 110 m + 115 m + 120 m + 125 m + 130 m + 135 m + 140 m + 145 m + 150 m + 155 m + 160 m + 165 m + 170 m + 175 m + 180 m + 185 m + 190 m + 195 m + 200 m + + + 15 + 20 + 25 + 30 + 35 + 40 + 45 + 50 + 55 + 60 + 65 + 70 + 75 + 80 + 85 + 90 + 95 + 100 + 105 + 110 + 115 + 120 + 125 + 130 + 135 + 140 + 145 + 150 + 155 + 160 + 165 + 170 + 175 + 180 + 185 + 190 + 195 + 200 + + + diff --git a/libraries/cyclestreets-core/src/main/res/values-pt/strings.xml b/libraries/cyclestreets-core/src/main/res/values-pt/strings.xml new file mode 100644 index 000000000..83c30977f --- /dev/null +++ b/libraries/cyclestreets-core/src/main/res/values-pt/strings.xml @@ -0,0 +1,17 @@ + + + Mostrar notificações de atualização do Blog + + Obrigado por enviar seus comentários. Iremos retornar a você quando tivermos um resultado. + Seu comentário não pode ser enviado.\n\n + + Sua conta foi cadastrada.\n\nUm email de confirmação vai ser enviado ao endereço fornecido\n\nQuando o email chegar, siga as instruções nele para completar o registro. + Sua conta não pode ser cadastrada.\n\n + + Você entrou com sucesso em CycleStreets. + Erro : + Não foi possível entrar em CycleStreets. Favor checar seu usuário e senha. + + Sua foto foi enviada com sucesso. + Houve um erro enviando sua foto: \n + diff --git a/libraries/cyclestreets-fragments/src/main/res/values-pt/colors.xml b/libraries/cyclestreets-fragments/src/main/res/values-pt/colors.xml new file mode 100755 index 000000000..2624fa272 --- /dev/null +++ b/libraries/cyclestreets-fragments/src/main/res/values-pt/colors.xml @@ -0,0 +1,4 @@ + + + #0000ff + diff --git a/libraries/cyclestreets-fragments/src/main/res/values-pt/dimens.xml b/libraries/cyclestreets-fragments/src/main/res/values-pt/dimens.xml new file mode 100644 index 000000000..3d6e299df --- /dev/null +++ b/libraries/cyclestreets-fragments/src/main/res/values-pt/dimens.xml @@ -0,0 +1,12 @@ + + + 632.0dip + 598.0dip + 632.0dip + 598.0dip + + + 320dp + + diff --git a/libraries/cyclestreets-fragments/src/main/res/values-pt/strings.xml b/libraries/cyclestreets-fragments/src/main/res/values-pt/strings.xml new file mode 100644 index 000000000..784e65598 --- /dev/null +++ b/libraries/cyclestreets-fragments/src/main/res/values-pt/strings.xml @@ -0,0 +1,72 @@ + + + + Abrir gaveta de navegação + Fechar gaveta de navegação + CycleStreets + Configuração + Sobre + Blog + Encontrar Rota + Adicionar destino + Atualizações do blog CycleStreets + Atualizar Blog + Iniciar marcador + Terminar marcador + Destino %d + Iniciar nova rota? + + + Planejar uma rota + Rotas salvas + Abrir rota por número + Encontrar lugar + Configurações + Abrir + Renomear + Editar + Deletar + + Intierário + Elevação + + + Encontrar + Escolher lugar + + + Iniciar LiveRide + Terminar LiveRide + Nova localização + Olá fragmento em branco + + Adicione novas localizações usando o botão acima.\nToque e segure em uma localização na listapara editar ou deletar. + + Economia de CO₂: + Calorias: + Hora: + Número da jornada: + + Fruta + Rota + + net.cyclestreets + + Nome ou endereço do local + + caminho + Rua + 00m00 + 0m + (0km) + Navegação curva-a-curva vai ser mostrada\naqui quando a rota for planejada. + + Coloque a marca no mapa e nomeie a nova localização. + Nome do local : + Número da rota + + Rota + Detalhes + %1$s rota, %2$s + + diff --git a/libraries/cyclestreets-fragments/src/main/res/values-pt/styles.xml b/libraries/cyclestreets-fragments/src/main/res/values-pt/styles.xml new file mode 100644 index 000000000..9b634e6f7 --- /dev/null +++ b/libraries/cyclestreets-fragments/src/main/res/values-pt/styles.xml @@ -0,0 +1,21 @@ + + + + + \ No newline at end of file diff --git a/libraries/cyclestreets-track/src/main/res/values-pt/strings.xml b/libraries/cyclestreets-track/src/main/res/values-pt/strings.xml new file mode 100644 index 000000000..932354b0b --- /dev/null +++ b/libraries/cyclestreets-track/src/main/res/values-pt/strings.xml @@ -0,0 +1,54 @@ + + + Velocidade atual: + Tempo decorrido: + Distancia: + Terminar + + Informações de jornada + Iniciar tempo + razão da viagem + + Parar de gravar.Escolha razão da viagem: + Trasporte + Estudos + Negócios + Exercício + Social + Compras + Pessoal + Outra + " " + Comentários sobre sua viagem + Idade: + Gênero: + + + Nível + pedalada + experiência: + + Enviar + Discartar + Viagem discartada. + Você deve escolher um propósito para a viagem antes de enviar! Escolha nas opções acima. + Transporte: sua viagem de bicicleta foi de transporte entre sua casa e seu local de trabalho.]]> + Estudos: sua viagem de bicicleta foi de transporte para a escola ou faculdade.]]> + Negócios: sua viagem de bicicleta foi com o propósito de negócios, transporte para reunião, ou transporte para realizar qualquer função relacioanda com trabalho.]]> + Exercício: sua viagem de bicicleta foi primariamente para se exercitar, ou apenas para pedalar.]]> + Social: sua viagem de bicicleta foi pripariamente para transporte a uma atividade social, como ir para a casa de um amigo, ir ao parque, a um restaurante ou ao cinema.]]> + Compras: sua viagem de bicicleta foi primariamente para compras.]]> + Pessoal: sua viagem de bicicleta foi para atender a necessidaes pessoais, como ir ao banco, ao médico, ir para a academia, e etc.]]> + Outros: se nenhuma das razões acima se aplica, comente abaixo e nos diga mais.]]> + Favor selecionar + Favor selecionar seu gênero + Masculino + Feminino + Outro + Favor selecionar seu nível de esperiência + Experiente + Médio + Iniciante + %1$1.1f milhas, %2$d minutos. %3$s + + diff --git a/libraries/cyclestreets-view/src/main/res/values-pt/strings.xml b/libraries/cyclestreets-view/src/main/res/values-pt/strings.xml new file mode 100644 index 000000000..0d1a179ca --- /dev/null +++ b/libraries/cyclestreets-view/src/main/res/values-pt/strings.xml @@ -0,0 +1,107 @@ + + + CycleStreets + + " " + Anterior + Próximo + Salvar + Cancelar + Fechar + Voltar + Começar novamente + Enviar! + Seu nome + Seu endereço de email + + Mostrar localização + Seguir localização + Desligar localização + + Tipo de rota + Obtendo rotas de CycleStreets.net, favor esperar + Buscando rotas de CycleStreets.net, favor esperar + A busca da rota falhou + Carregando rota, favor esperar + + Mudar tipo de rota + Inverter rota + Compartilhar esta rota + Comentar esta rota + Replanejar priorizando velocidade + Replanejar de forma balanceada + Replanejar priorizando tranquilidade + Replanejar priorizando menor distância + Mudar rota a partir de sua localização atual + + Localização atual não disponível + + Relatar problema ou boas práticas relacionadas a ciclismo. + Isso será usado para reportar problemas a tomadores de decisões. + Tirar foto + Selecionar foto existente + Descrição da foto + Isso é um problema ou uma boa prática? + Que tipo de característica está sendo mostrada? + Falha ao carregar Could not load categorias de mapa fotogáfico. Favor conecte-se à rede. + Onde esta foto foi tirada? + A localização automática falhou. Para usar a geolocalização automática de fotos, favor ativar esta função nas configurações da câmera + Compartilhar esta foto + Enviado relatório, favor esperar + Não pode enviar foto. Favor verificar coneção com a rede. + Enviar outra + + Continuar sem foto + Seu relatório + Qual a localização descrita no seu relatório? + + Este mapa não pode ser utilizado com esta versão do aplicativo. \n\nGostaria de procurar por uma atualização? + + Menu + Localização atual + Escolher localização + Localização não encontrada + Procurando por localização + Cntatos + Nenhum de seus contatos tem endereço. + Carregando contatos. + Remover + Localização salva. + + Pontos de interesse + categorias + + Você não tem nenhum mapa instalado. Mapas vetoriais para uso offline estão disponíveis como download separado. + \n\nGostaria de procurar por um pacote de mapas agora? + Logado em CycleStreets + Registro da conta aguardando confirmação + + Seus comentários + Enviando comentários para CycleStreets.net + + Para enviar fotos, você precisa estar logado em uma conta CycleStreets. + O cadastro para uma conta é gratuito + Cadastrar uma conta + Entrando com uma conta existente + Usuário escolhido + Senha escolhida + Confirmação de senha + Cadastrar + Cadastrando em CycleStreets.net + + Favor fornecer seu usuário e senha para logar. + Você já está logado como\n%1$s, %2$s + Usuário + Senha + Limpar dados salvos + Entrar + Entrando em CycleStreets.net + + O endereço de email não está correto. + Senha e confirmação não são iguais + Usuário precisa ter no mínimo 5 caracteres. + Tem certeza que deseja limpar os dados salvos? + Você já tem uma conta registrada. Favor verificar sua caixa de emails para um email de confimação. + O cadastro é gratúito, e usuários registrados podem adicionar fotos. Para iniciar um cadastro digite seus dados no formulário abaixo. + + diff --git a/libraries/cyclestreets-view/src/main/res/values-pt/styles.xml b/libraries/cyclestreets-view/src/main/res/values-pt/styles.xml new file mode 100644 index 000000000..92001bb6e --- /dev/null +++ b/libraries/cyclestreets-view/src/main/res/values-pt/styles.xml @@ -0,0 +1,12 @@ + + + + \ No newline at end of file From 81af79382e0082175fb946ad25e65b2ed2dfaae2 Mon Sep 17 00:00:00 2001 From: Rafael Auyer Date: Wed, 26 Oct 2016 18:00:12 -0200 Subject: [PATCH 027/326] remove duplicate files. Localized arrays.xml. --- .../src/main/res/values-pt/arrays.xml | 26 +++++++++---------- .../src/main/res/values-pt/colors.xml | 4 --- .../src/main/res/values-pt/dimens.xml | 12 --------- .../src/main/res/values-pt/styles.xml | 21 --------------- .../src/main/res/values-pt/styles.xml | 12 --------- 5 files changed, 13 insertions(+), 62 deletions(-) delete mode 100755 libraries/cyclestreets-fragments/src/main/res/values-pt/colors.xml delete mode 100644 libraries/cyclestreets-fragments/src/main/res/values-pt/dimens.xml delete mode 100644 libraries/cyclestreets-fragments/src/main/res/values-pt/styles.xml delete mode 100644 libraries/cyclestreets-view/src/main/res/values-pt/styles.xml diff --git a/libraries/cyclestreets-core/src/main/res/values-pt/arrays.xml b/libraries/cyclestreets-core/src/main/res/values-pt/arrays.xml index 4c8beb89a..9629e0100 100644 --- a/libraries/cyclestreets-core/src/main/res/values-pt/arrays.xml +++ b/libraries/cyclestreets-core/src/main/res/values-pt/arrays.xml @@ -1,17 +1,17 @@ - Kilometres - Miles + Quilômetros + Milhas km - miles + mi - Unhurried 10mph (16km/h) - Cruising 12mph (20km/h) - Quick 15mph (24km/h) + Unhurried 16km/h (10mph) + Cruising 20km/h (12mph) + Rápido 24km/h (15mph) 16 @@ -19,10 +19,10 @@ 24 - Quietest - Balanced - Fastest - Shortest + Mais tranquila + Balanceada + Mais rápida + Mais curta quietest @@ -31,9 +31,9 @@ shortest - Always resize to 640 pixels wide - Full size when WiFi, 3.5G or 4G available - Full size + Sempre redimensionar para 640 pixels de largura + Tamanho completo quando conectado a uma raede WiFi, 3.5G ou 4G + Tamanho completo 640px diff --git a/libraries/cyclestreets-fragments/src/main/res/values-pt/colors.xml b/libraries/cyclestreets-fragments/src/main/res/values-pt/colors.xml deleted file mode 100755 index 2624fa272..000000000 --- a/libraries/cyclestreets-fragments/src/main/res/values-pt/colors.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - #0000ff - diff --git a/libraries/cyclestreets-fragments/src/main/res/values-pt/dimens.xml b/libraries/cyclestreets-fragments/src/main/res/values-pt/dimens.xml deleted file mode 100644 index 3d6e299df..000000000 --- a/libraries/cyclestreets-fragments/src/main/res/values-pt/dimens.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - 632.0dip - 598.0dip - 632.0dip - 598.0dip - - - 320dp - - diff --git a/libraries/cyclestreets-fragments/src/main/res/values-pt/styles.xml b/libraries/cyclestreets-fragments/src/main/res/values-pt/styles.xml deleted file mode 100644 index 9b634e6f7..000000000 --- a/libraries/cyclestreets-fragments/src/main/res/values-pt/styles.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - \ No newline at end of file diff --git a/libraries/cyclestreets-view/src/main/res/values-pt/styles.xml b/libraries/cyclestreets-view/src/main/res/values-pt/styles.xml deleted file mode 100644 index 92001bb6e..000000000 --- a/libraries/cyclestreets-view/src/main/res/values-pt/styles.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - \ No newline at end of file From f1d635a82e5272d02e22671815cc9587947024e0 Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Wed, 26 Oct 2016 21:08:25 +0100 Subject: [PATCH 028/326] Mark arrays as untranslatable where appropriate --- .../cyclestreets-core/src/main/res/values/arrays.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/libraries/cyclestreets-core/src/main/res/values/arrays.xml b/libraries/cyclestreets-core/src/main/res/values/arrays.xml index 4c8beb89a..bccd2f1fb 100644 --- a/libraries/cyclestreets-core/src/main/res/values/arrays.xml +++ b/libraries/cyclestreets-core/src/main/res/values/arrays.xml @@ -4,7 +4,7 @@ Kilometres Miles - + km miles @@ -13,7 +13,7 @@ Cruising 12mph (20km/h) Quick 15mph (24km/h) - + 16 20 24 @@ -24,7 +24,7 @@ Fastest Shortest - + quietest balanced fastest @@ -35,13 +35,13 @@ Full size when WiFi, 3.5G or 4G available Full size - + 640px bigIfWifi big - + 15 m 20 m 25 m @@ -81,7 +81,7 @@ 195 m 200 m - + 15 20 25 From 6d899d82a13849724e22b2612d4924562d06ea85 Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Thu, 27 Oct 2016 10:03:52 +0100 Subject: [PATCH 029/326] Minor change to test TXGH integration --- .tx/config | 1 + 1 file changed, 1 insertion(+) diff --git a/.tx/config b/.tx/config index 85a8d9abe..b67b39513 100644 --- a/.tx/config +++ b/.tx/config @@ -6,3 +6,4 @@ source_file = cyclestreets.vNext/src/main/res/values/strings.xml source_lang = en type = ANDROID file_filter = cyclestreets.vNext/src/main/res/values-/strings.xml + From 42ef3652faed109b240411962431dfd349f192bc Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Thu, 27 Oct 2016 10:24:06 +0100 Subject: [PATCH 030/326] Minor change to test TXGH integration --- cyclestreets.vNext/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cyclestreets.vNext/src/main/res/values/strings.xml b/cyclestreets.vNext/src/main/res/values/strings.xml index 4db2c2a5e..3b64b92cc 100644 --- a/cyclestreets.vNext/src/main/res/values/strings.xml +++ b/cyclestreets.vNext/src/main/res/values/strings.xml @@ -14,7 +14,7 @@ CycleStreets has crashed … Please click here to help fix the issue. CycleStreets has crashed - An unexpected error occurred forcing the + An unexpected error occurred forcing the application to stop. Please help us fix this by sending us error data, all you have to do is click \'OK\'. You might add your comments about the problem below: From 6c6688c04b8f64d00675745dae9d131dbdf79ef9 Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Thu, 27 Oct 2016 11:15:27 +0100 Subject: [PATCH 031/326] Update Transifex config; change all translatable files to trigger load --- .tx/config | 34 +++++- .../src/main/res/values/arrays.xml | 4 + .../src/main/res/values/strings.xml | 2 + .../src/main/res/values/strings.xml | 112 +++++++++--------- .../src/main/res/values/strings.xml | 1 + .../src/main/res/values/strings.xml | 1 + 6 files changed, 97 insertions(+), 57 deletions(-) diff --git a/.tx/config b/.tx/config index b67b39513..3c73c9d16 100644 --- a/.tx/config +++ b/.tx/config @@ -1,9 +1,41 @@ +### N.B. Currently this file needs to be included with our TXGH deployment. +### See https://github.com/transifex/txgh/issues/65 for more details. + [main] host = https://www.transifex.com -[cyclestreets-android.app] +[cyclestreets-android.app-strings] source_file = cyclestreets.vNext/src/main/res/values/strings.xml source_lang = en type = ANDROID file_filter = cyclestreets.vNext/src/main/res/values-/strings.xml +[cyclestreets-android.lib-core-strings] +source_file = libraries/cyclestreets-core/src/main/res/values/strings.xml +source_lang = en +type = ANDROID +file_filter = cyclestreets.vNext/src/main/res/values-/strings.xml + +[cyclestreets-android.lib-core-arrays] +source_file = libraries/cyclestreets-core/src/main/res/values/arrays.xml +source_lang = en +type = ANDROID +file_filter = cyclestreets.vNext/src/main/res/values-/arrays.xml + +[cyclestreets-android.lib-fragments-strings] +source_file = libraries/cyclestreets-fragments/src/main/res/values/strings.xml +source_lang = en +type = ANDROID +file_filter = cyclestreets.vNext/src/main/res/values-/strings.xml + +[cyclestreets-android.lib-track-strings] +source_file = libraries/cyclestreets-track/src/main/res/values/strings.xml +source_lang = en +type = ANDROID +file_filter = cyclestreets.vNext/src/main/res/values-/strings.xml + +[cyclestreets-android.lib-view-strings] +source_file = libraries/cyclestreets-view/src/main/res/values/strings.xml +source_lang = en +type = ANDROID +file_filter = cyclestreets.vNext/src/main/res/values-/strings.xml diff --git a/libraries/cyclestreets-core/src/main/res/values/arrays.xml b/libraries/cyclestreets-core/src/main/res/values/arrays.xml index bccd2f1fb..bd3d4f5fe 100644 --- a/libraries/cyclestreets-core/src/main/res/values/arrays.xml +++ b/libraries/cyclestreets-core/src/main/res/values/arrays.xml @@ -1,5 +1,6 @@ + Kilometres Miles @@ -8,6 +9,7 @@ km miles + Unhurried 10mph (16km/h) Cruising 12mph (20km/h) @@ -18,6 +20,7 @@ 20 24 + Quietest Balanced @@ -30,6 +33,7 @@ fastest shortest + Always resize to 640 pixels wide Full size when WiFi, 3.5G or 4G available diff --git a/libraries/cyclestreets-core/src/main/res/values/strings.xml b/libraries/cyclestreets-core/src/main/res/values/strings.xml index 323ca553f..c6a69b9ab 100644 --- a/libraries/cyclestreets-core/src/main/res/values/strings.xml +++ b/libraries/cyclestreets-core/src/main/res/values/strings.xml @@ -1,5 +1,6 @@ + Show Blog update notifications Thank you for submitting this feedback. We will get back to you when we have checked this out. @@ -14,4 +15,5 @@ Your photo was uploaded successfully. There was a problem uploading your photo: \n + diff --git a/libraries/cyclestreets-fragments/src/main/res/values/strings.xml b/libraries/cyclestreets-fragments/src/main/res/values/strings.xml index e0b289d84..e995e62ba 100644 --- a/libraries/cyclestreets-fragments/src/main/res/values/strings.xml +++ b/libraries/cyclestreets-fragments/src/main/res/values/strings.xml @@ -1,72 +1,72 @@ - Open navigation drawer - Close navigation drawer - CycleStreets - Settings - About - Blog - Find route - Add waypoint - CycleStreets blog update - Blog update - Start marker - Finish marker - Waypoint %d - Start a new route? + Open navigation drawer + Close navigation drawer + CycleStreets + Settings + About + Blog + Find route + Add waypoint + CycleStreets blog update + Blog update + Start marker + Finish marker + Waypoint %d + Start a new route? - - Plan a route - Saved routes - Open route by number - Find place - Settings - Open - Rename - Edit - Delete + + Plan a route + Saved routes + Open route by number + Find place + Settings + Open + Rename + Edit + Delete - Itinerary - Elevation + Itinerary + Elevation - - Find - Choose Place + + Find + Choose Place - - Start LiveRide - End LiveRide - New Location - Hello blank fragment + + Start LiveRide + End LiveRide + New Location + Hello blank fragment - Add new locations using the button above.\nTouch and hold a location in the list to edit or delete. + Add new locations using the button above.\nTouch and hold a location in the list to edit or delete. - CO₂ saving: - Calories: - Time: - Journey number: - - Fruit - route + CO₂ saving: + Calories: + Time: + Journey number: + + Fruit + route - net.cyclestreets + net.cyclestreets - Place name or address + Place name or address - direction - Street - 00m00 - 0m - (0km) - Turn-by-turn route information will be shown\nhere once a route is planned. + direction + Street + 00m00 + 0m + (0km) + Turn-by-turn route information will be shown\nhere once a route is planned. - Place the mark on the map and then name the location. - Location name : - Route number + Place the mark on the map and then name the location. + Location name : + Route number - Route - Details - %1$s route, %2$s + Route + Details + %1$s route, %2$s diff --git a/libraries/cyclestreets-track/src/main/res/values/strings.xml b/libraries/cyclestreets-track/src/main/res/values/strings.xml index 571cb9ded..350e701d6 100644 --- a/libraries/cyclestreets-track/src/main/res/values/strings.xml +++ b/libraries/cyclestreets-track/src/main/res/values/strings.xml @@ -1,5 +1,6 @@ + Current Speed: Journey Time: Distance: diff --git a/libraries/cyclestreets-view/src/main/res/values/strings.xml b/libraries/cyclestreets-view/src/main/res/values/strings.xml index 57c1340ad..a379d6aab 100644 --- a/libraries/cyclestreets-view/src/main/res/values/strings.xml +++ b/libraries/cyclestreets-view/src/main/res/values/strings.xml @@ -1,5 +1,6 @@ + CycleStreets " " From 79ceeff539fb92bc411baeb75185c0dad61ef1b4 Mon Sep 17 00:00:00 2001 From: GiORg1 Date: Thu, 27 Oct 2016 18:16:43 +0200 Subject: [PATCH 032/326] Russian translation --- .../src/main/res/values-ru/strings.xml | 23 ++++ .../src/main/res/values-ru/arrays.xml | 129 ++++++++++++++++++ .../src/main/res/values-ru/strings.xml | 19 +++ .../src/main/res/values-ru/strings.xml | 72 ++++++++++ .../src/main/res/values-ru/strings.xml | 55 ++++++++ .../src/main/res/values-ru/strings.xml | 109 +++++++++++++++ 6 files changed, 407 insertions(+) create mode 100644 cyclestreets.vNext/src/main/res/values-ru/strings.xml create mode 100644 libraries/cyclestreets-core/src/main/res/values-ru/arrays.xml create mode 100644 libraries/cyclestreets-core/src/main/res/values-ru/strings.xml create mode 100644 libraries/cyclestreets-fragments/src/main/res/values-ru/strings.xml create mode 100644 libraries/cyclestreets-track/src/main/res/values-ru/strings.xml create mode 100644 libraries/cyclestreets-view/src/main/res/values-ru/strings.xml diff --git a/cyclestreets.vNext/src/main/res/values-ru/strings.xml b/cyclestreets.vNext/src/main/res/values-ru/strings.xml new file mode 100644 index 000000000..ec1dc1e26 --- /dev/null +++ b/cyclestreets.vNext/src/main/res/values-ru/strings.xml @@ -0,0 +1,23 @@ + + + + CycleStreets + Планировщик путешествий + Маршрут + Высота + Фотокарта + Добавить фото + Блог + Блог - обновился + + Неожиданная ошибка, пожалуйста, отправить отчет … + CycleStreets аварийно завершилось … + Пожалуйста, нажмите здесь, чтобы помочь решить проблему. + CycleStreets аварийно завершилось + Произошла неожиданная ошибка заставляя + Приложение остановиться. Пожалуйста, помогите нам исправить это, отправив нам данные об ошибках, + все, что вам нужно сделать, это нажать \ "OK \". + Вы можете добавить свои комментарии о следующей проблеме: + Спасибо ! + + diff --git a/libraries/cyclestreets-core/src/main/res/values-ru/arrays.xml b/libraries/cyclestreets-core/src/main/res/values-ru/arrays.xml new file mode 100644 index 000000000..1aea0eea4 --- /dev/null +++ b/libraries/cyclestreets-core/src/main/res/values-ru/arrays.xml @@ -0,0 +1,129 @@ + + + + + Километры + Мили + + + km + miles + + + + Неторопливый 10миля/ч (16км / ч) + Запас хода 12миля/ч (20 км / ч) + Быстрый 15миля/ч (24км / ч) + + + 16 + 20 + 24 + + + + Бесшумный + Уравновешенный + Быстрый + Короткий + + + quietest + balanced + fastest + shortest + + + + Всегда изменять размер в ширину 640 пикселей + Полный размер, когда WiFi, 3.5G или 4G доступен + Полный размер + + + 640px + bigIfWifi + big + + + + 15 m + 20 m + 25 m + 30 m + 35 m + 40 m + 45 m + 50 m + 55 m + 60 m + 65 m + 70 m + 75 m + 80 m + 85 m + 90 m + 95 m + 100 m + 105 m + 110 m + 115 m + 120 m + 125 m + 130 m + 135 m + 140 m + 145 m + 150 m + 155 m + 160 m + 165 m + 170 m + 175 m + 180 m + 185 m + 190 m + 195 m + 200 m + + + 15 + 20 + 25 + 30 + 35 + 40 + 45 + 50 + 55 + 60 + 65 + 70 + 75 + 80 + 85 + 90 + 95 + 100 + 105 + 110 + 115 + 120 + 125 + 130 + 135 + 140 + 145 + 150 + 155 + 160 + 165 + 170 + 175 + 180 + 185 + 190 + 195 + 200 + + + diff --git a/libraries/cyclestreets-core/src/main/res/values-ru/strings.xml b/libraries/cyclestreets-core/src/main/res/values-ru/strings.xml new file mode 100644 index 000000000..f76497c6b --- /dev/null +++ b/libraries/cyclestreets-core/src/main/res/values-ru/strings.xml @@ -0,0 +1,19 @@ + + + + Показать уведомления об обновлениях в блоге + + Благодарим Вас за отправку обратную связь. Мы свяжемся с вами, когда мы проверим ее. + Ваша обратная связь не может быть отправлено.\n\n + + Ваш аккаунт был зарегистрирован.\n\n Электронное сообщение было отправлено по адресу, который вы дали.\n Когда почта придет, следуйте инструкциям, которые оно содержит, чтобы завершить регистрацию. + Ваша учетная запись не может быть зарегистрировано.\n\n + + Вы успешно вошли в CycleStreets. + Ошибка : + Не удалось войти в CycleStreets. Пожалуйста, проверьте имя пользователя и пароль. + + Ваше фото загружено успешно. + Произошла ошибка при загрузке вашей фотографии: \n + + diff --git a/libraries/cyclestreets-fragments/src/main/res/values-ru/strings.xml b/libraries/cyclestreets-fragments/src/main/res/values-ru/strings.xml new file mode 100644 index 000000000..1549c54f5 --- /dev/null +++ b/libraries/cyclestreets-fragments/src/main/res/values-ru/strings.xml @@ -0,0 +1,72 @@ + + + + Открыть панель навигации + Закрыть панель навигации + CycleStreets + Настройки + О апликации + Блог + Найти маршрут + Добавить точку + Обновление блога CycleStreets + Обновлении блога + Запустить маркер + Закончить маркер + Точка %d + Начать новый маршрут? + + + Планирование маршрута + Сохраненные маршруты + Открыть маршрут по номеру + Найти место + Настройки + Открыть + Переименовывать + Редактировать + Удалить + + Маршрут + Высота + + + Найти + Выберите место + + + Начатъ LiveRide + Закончить LiveRide + Новое место + Привет пустой фрагмент + + Добавить новые места с помощью кнопки выше.\nНажмите и удерживайте местоположение в списке, чтобы изменить или удалить. + + CO₂ экономия: + Калории: + Время: + Количество Путешествие: + + Фрукты + маршрут + + net.cyclestreets + + Поместите имя или адрес + + Направление + Улица + 00м00 + + (0км) + Turn-by-turn route information will be shown\nhere once a route is planned. + + Поместите метку на карте, а затем назовите местоположение. + Название местоположения : + Номер маршрута + + Маршрут + Детали + %1$s маршрут, %2$s + + diff --git a/libraries/cyclestreets-track/src/main/res/values-ru/strings.xml b/libraries/cyclestreets-track/src/main/res/values-ru/strings.xml new file mode 100644 index 000000000..5d14558f8 --- /dev/null +++ b/libraries/cyclestreets-track/src/main/res/values-ru/strings.xml @@ -0,0 +1,55 @@ + + + + Текущая скорость: + Время путешествий: + Расстояние: + Конец + + Информация о путешествие + Время начала + Цель поездки + + Запись окончена. Выберите цель поездки: + Ездить + Школа + Связанная с работой + Упражнение + Социальное + Покупка + Поручение + Другое + " " + Комментарии о вашей поездке + Возраст: + Пол: + + + Уровень + езда на велосипеде + опыт: + + Отправить + Отбросить + Поездка отброшена. + Вы должны выбрать цель поездки перед отправкой! Выберите один из указанных выше целей. + Ездить: эта поездка была в первую очередь, чтобы дойти до дом с работы или наоборот.]]> + Школа: эта поездка была в первую очередь, чтобы прийти или уйти с школа или колледжа.]]> + Связанная с работой: эта поездка была в первую очередь, чтобы прийти или уйти с деловой встречи, функции или дело связанное с моей работой.]]> + Упражнение: это поездка была в первую очередь для физических упражнений, или езда на велосипеде ради езды на велосипеде.]]> + Социальное: это поездка была в первую очередь для перехода к или от социальной активности, например, в другом доме, парк, ресторан, кино.]]> + Покупка: это поездка была в первую очередь, чтобы купить или привезти домой товары или продукты.]]> + Поручение: это поездка была в первую очередь для участия в личном бизнесе таких как банковское дело, визит врача, поход в тренажерный зал и т.д.]]> + Другое: если ни одна из других причин, не применяется к этой поездке, вы можете ввести комментарии ниже, чтобы рассказать нам больше.]]> + Пожалуйста выберите + Пожалуйста, выберите пол + мужской + женский + Предпочитаю не говорить + Пожалуйста, выберите уровень опыта + опытный + нечастый + начинающий + %1$1.1f мили, %2$d минут. %3$s + + diff --git a/libraries/cyclestreets-view/src/main/res/values-ru/strings.xml b/libraries/cyclestreets-view/src/main/res/values-ru/strings.xml new file mode 100644 index 000000000..72bd83209 --- /dev/null +++ b/libraries/cyclestreets-view/src/main/res/values-ru/strings.xml @@ -0,0 +1,109 @@ + + + + CycleStreets + + " " + Назад + Следующий + Сохранить + Отмена + Закрыть + Назад + Начать заново + Загрузить! + Ваше имя + Ваш адрес электронной почты + + Показать расположение + Следовать расположение + Отключить расположение + + Тип маршрута + Получение маршрута от CycleStreets.net, пожалуйста, подождите + Получение маршрута от CycleStreets.net, пожалуйста, подождите + Маршрут не удалось найти + Загрузка маршрута, пожалуйста, подождите + + Изменить тип маршрута + Обратный маршрут + Поделитесь этим маршрутом + Сделать комментарии по этому маршруту + Перепланировать как сами быстры + Перепланировать как сами балансированы + Перепланировать как самый бесшумный + Перепланировать как самый короткий + Перенаправить от текущего местоположения + + Расположение в настоящее время недоступно. + + Загрузить сообщения о проблемах, связанных с велосипедным или хорошей практики. + Они будут использоваться, чтобы мы могли сообщить о проблемах, кто принимает решения. + Сфотографировать + Выберите существующую фотографию + Опишите эту фотографию + Является ли это проблемой или хорошей практикой? + Какой тип функции показывается? + Не удалось загрузить категории фотокарти. Пожалуйста, проверьте подключение к сети. + Где была сделана эта фотография? + Фотография не может быть привязываемого. Чтобы автоматически находить фотографии, пожалуйста, включите геолокации в настройках камеры. + Поделиться этим фото + Загрузка отчета, пожалуйста, подождите + Не удалось загрузить фотографию. Пожалуйста, проверьте подключение к сети. + Загрузить другой + + Продолжить без фото + Ваш отчет + Где это место, которую отчет описывает? + + Этот пакет карты не может быть использована с этой версией приложения.\n\nвы хотите найти обновление? + + Меню + Текущее местоположение + Выберите местоположение + Не найдено ни одного места + Поиск местоположения + Контакты + Ни одного из ваших контактов нет адресов. + Загрузка контактов + Удалить + Сохраненные местоположения + + Точки интереса + категория + + У вас нет каких-либо карту пакеты установлены. Векторные карты для +использования в автономном режиме доступны в виде отдельных загружаемых файлов. +\n\nВы хотите искать карты пакетов сейчас? + Вы вошли в CycleStreets + Регистрация аккаунта в ожидании проверки + + Ваши комментарии + Отправка обратной связи о маршрута к CycleStreets.net + + Для того, чтобы загрузить фотографии вы должны иметь CycleStreets счет и войти в свой аккаунт. + Регистрация учетной записи является бесплатным. + Зарегистрировать учетную запись + Войти в свой аккаунт/string> + Желаемое имя пользователя + Желаемый пароль + Подтвердите Пароль + Регистрация + Регистрация с CycleStreets.net + + Пожалуйста, введите ваше имя пользователя и пароль для входа в систему. + Вы уже вошли в систему \n%1$s, %2$s + Имя пользователя + Пароль + Очистить сохраненные детали + Войти в систему + Войти в CycleStreets.net + + Адрес электронной почты, введенный неправильный + Пароль и подтверждение пароля не совпадают. + Имя пользователя должно быть не менее пяти букв / цифр длиной. + Вы уверены, что хотите удалить сохраненные данные учетной записи? + Вы уже зарегистрировали аккаунт. Пожалуйста, проверьте свою электронную почту для проверки электронной почты. + Регистрация абсолютно бесплатна и зарегистрированные пользователи могут добавлять фотографии. Для того, чтобы начать процесс регистрации, пожалуйста, введите свои данные в форму ниже. + + From b5dfca401ba063a00297b1866f0a7b42127f8d32 Mon Sep 17 00:00:00 2001 From: Laura Date: Thu, 27 Oct 2016 18:49:45 +0200 Subject: [PATCH 033/326] Spanish translation --- .../main/res/values-es/colors_apptheme.xml | 4 + .../main/res/values-es/dimens_apptheme.xml | 4 + .../src/main/res/values-es/strings.xml | 21 ++++ .../main/res/values-es/styles_apptheme.xml | 89 +++++++++++++++ .../main/res/values-es/themes_apptheme.xml | 40 +++++++ .../main/res/{values => values-es}/arrays.xml | 26 ++--- .../src/main/res/values-es/strings.xml | 18 +++ .../src/main/res/values-es/colors.xml | 4 + .../src/main/res/values-es/dimens.xml | 12 ++ .../src/main/res/values-es/strings.xml | 72 ++++++++++++ .../src/main/res/values-es/styles.xml | 21 ++++ .../src/main/res/values-es/strings.xml | 55 +++++++++ .../src/main/res/values-es/strings.xml | 108 ++++++++++++++++++ .../main/res/{values => values-es}/styles.xml | 0 14 files changed, 461 insertions(+), 13 deletions(-) create mode 100755 cyclestreets.vNext/src/main/res/values-es/colors_apptheme.xml create mode 100755 cyclestreets.vNext/src/main/res/values-es/dimens_apptheme.xml create mode 100644 cyclestreets.vNext/src/main/res/values-es/strings.xml create mode 100755 cyclestreets.vNext/src/main/res/values-es/styles_apptheme.xml create mode 100755 cyclestreets.vNext/src/main/res/values-es/themes_apptheme.xml rename libraries/cyclestreets-core/src/main/res/{values => values-es}/arrays.xml (84%) create mode 100644 libraries/cyclestreets-core/src/main/res/values-es/strings.xml create mode 100755 libraries/cyclestreets-fragments/src/main/res/values-es/colors.xml create mode 100644 libraries/cyclestreets-fragments/src/main/res/values-es/dimens.xml create mode 100644 libraries/cyclestreets-fragments/src/main/res/values-es/strings.xml create mode 100644 libraries/cyclestreets-fragments/src/main/res/values-es/styles.xml create mode 100644 libraries/cyclestreets-track/src/main/res/values-es/strings.xml create mode 100644 libraries/cyclestreets-view/src/main/res/values-es/strings.xml rename libraries/cyclestreets-view/src/main/res/{values => values-es}/styles.xml (100%) diff --git a/cyclestreets.vNext/src/main/res/values-es/colors_apptheme.xml b/cyclestreets.vNext/src/main/res/values-es/colors_apptheme.xml new file mode 100755 index 000000000..febda29ca --- /dev/null +++ b/cyclestreets.vNext/src/main/res/values-es/colors_apptheme.xml @@ -0,0 +1,4 @@ + + + #009800 + diff --git a/cyclestreets.vNext/src/main/res/values-es/dimens_apptheme.xml b/cyclestreets.vNext/src/main/res/values-es/dimens_apptheme.xml new file mode 100755 index 000000000..5a0fa8d05 --- /dev/null +++ b/cyclestreets.vNext/src/main/res/values-es/dimens_apptheme.xml @@ -0,0 +1,4 @@ + + + 48dp + \ No newline at end of file diff --git a/cyclestreets.vNext/src/main/res/values-es/strings.xml b/cyclestreets.vNext/src/main/res/values-es/strings.xml new file mode 100644 index 000000000..1c97e3a7c --- /dev/null +++ b/cyclestreets.vNext/src/main/res/values-es/strings.xml @@ -0,0 +1,21 @@ + + + + CycleStreets + Planificador de viajes + Itinerario + Elevacion + Mapa fotográfico + Añadir fotografía + Blog + Blog - actualizado + + Error inesperado, manda un informe + CycleStreets se ha bloqueado… + Por favor haga clic aquí para solucionar el problema. + CycleStreets se ha bloqueado + Un error inesperado forzando la aplicación a cerrar. Por favor ayúdanos a repararlo mandando los datos del error, todo lo que tienes que hacer es hacer clic en \'OK\'. + Añade tus comentarios sobre el problema a continuación: + ¡Gracias! + + diff --git a/cyclestreets.vNext/src/main/res/values-es/styles_apptheme.xml b/cyclestreets.vNext/src/main/res/values-es/styles_apptheme.xml new file mode 100755 index 000000000..b9970cdd8 --- /dev/null +++ b/cyclestreets.vNext/src/main/res/values-es/styles_apptheme.xml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/cyclestreets.vNext/src/main/res/values-es/themes_apptheme.xml b/cyclestreets.vNext/src/main/res/values-es/themes_apptheme.xml new file mode 100755 index 000000000..0e8f4d961 --- /dev/null +++ b/cyclestreets.vNext/src/main/res/values-es/themes_apptheme.xml @@ -0,0 +1,40 @@ + + + + + + + + \ No newline at end of file diff --git a/libraries/cyclestreets-core/src/main/res/values/arrays.xml b/libraries/cyclestreets-core/src/main/res/values-es/arrays.xml similarity index 84% rename from libraries/cyclestreets-core/src/main/res/values/arrays.xml rename to libraries/cyclestreets-core/src/main/res/values-es/arrays.xml index bd3d4f5fe..9f216ad0e 100644 --- a/libraries/cyclestreets-core/src/main/res/values/arrays.xml +++ b/libraries/cyclestreets-core/src/main/res/values-es/arrays.xml @@ -2,18 +2,18 @@ - Kilometres - Miles + Kilometros + Millas km - miles + millas - Unhurried 10mph (16km/h) - Cruising 12mph (20km/h) - Quick 15mph (24km/h) + Lento 10mph (16km/h) + Paseo 12mph (20km/h) + Rápido 15mph (24km/h) 16 @@ -22,10 +22,10 @@ - Quietest - Balanced - Fastest - Shortest + Lento + Equilibrado + Rápido + Corto quietest @@ -35,9 +35,9 @@ - Always resize to 640 pixels wide - Full size when WiFi, 3.5G or 4G available - Full size + Siempre redimensiona a 640 pixels de ancho + Resolución completa cuando se esté conectado a WiFi, 3.5G or 4G + Resolución completa 640px diff --git a/libraries/cyclestreets-core/src/main/res/values-es/strings.xml b/libraries/cyclestreets-core/src/main/res/values-es/strings.xml new file mode 100644 index 000000000..e8ac0dcc3 --- /dev/null +++ b/libraries/cyclestreets-core/src/main/res/values-es/strings.xml @@ -0,0 +1,18 @@ + + + + Mostrar notificaciones de las actualizaciones del Blog + + Gracias por enviarnos tu opinión. Nos pondremos en contacto cuando lo hayamos comprobado. + Tu opinión no puede enviarse.\n\n + + Tu cuenta se ha registrado.\n\n Un email se ha enviado a tu cuenta. \n\n Cuando el email llegue, siguie las instrucciones que contiene y contiene para completar el registro.\n\n + + Te has registrado con éxito en CycleStreets. + Error : + No se puede acceder a CycleStreets. Por favor comprueba tu nombre de usuario y contraseña. + + Tu foto se ha actualizado con éxito. + Hubo un problema al actualizar tu foto: \n + + diff --git a/libraries/cyclestreets-fragments/src/main/res/values-es/colors.xml b/libraries/cyclestreets-fragments/src/main/res/values-es/colors.xml new file mode 100755 index 000000000..2624fa272 --- /dev/null +++ b/libraries/cyclestreets-fragments/src/main/res/values-es/colors.xml @@ -0,0 +1,4 @@ + + + #0000ff + diff --git a/libraries/cyclestreets-fragments/src/main/res/values-es/dimens.xml b/libraries/cyclestreets-fragments/src/main/res/values-es/dimens.xml new file mode 100644 index 000000000..3d6e299df --- /dev/null +++ b/libraries/cyclestreets-fragments/src/main/res/values-es/dimens.xml @@ -0,0 +1,12 @@ + + + 632.0dip + 598.0dip + 632.0dip + 598.0dip + + + 320dp + + diff --git a/libraries/cyclestreets-fragments/src/main/res/values-es/strings.xml b/libraries/cyclestreets-fragments/src/main/res/values-es/strings.xml new file mode 100644 index 000000000..33e5e9951 --- /dev/null +++ b/libraries/cyclestreets-fragments/src/main/res/values-es/strings.xml @@ -0,0 +1,72 @@ + + + + Navegador abierto + Navegador cerrado + CycleStreets + Configuración + Sobre + Blog + Encontrar ruta + Añadir punto en el camino + Actualización del blog CycleStreets + Actualización del Blog + Comienzo de marcador + Finalización del marcador + Punto en el camino %d + ¿Comenzar una nueva ruta? + + + Planear una ruta + Rutas guardadas + Abrir ruta por su número + Encontrar lugar + Configuración + Abrir + Renombrar + Editar + Eliminar + + Itinerario + Elevación + + + Encontrar + Elige lugar + + + Comenzar Vuelta en Directo + Cerrar Vuelta en Directo + Nueva Localización + Hola fragmento en blanco + + Añade nuevas localizaciones usando el botón de arriba.\nTocar y mantener en una localización en la lista para editar o eliminar. + + CO₂ ahorrado: + Calorias: + Tiempo: + Número de viajes: + + Fruta + Ruta + + net.cyclestreets + + Indique nombre o dirección + + dirección + Calle + 00m00 + 0m + (0km) + La información Turn-by-turn de la ruta se mostrará \naquí una vez se planee una ruta. + + Coloca la marca en el mapa y después nombra la localización. + Nombre de la localización : + Número de ruta + + Ruta + detalles + %1$s ruta, %2$s + + diff --git a/libraries/cyclestreets-fragments/src/main/res/values-es/styles.xml b/libraries/cyclestreets-fragments/src/main/res/values-es/styles.xml new file mode 100644 index 000000000..9b634e6f7 --- /dev/null +++ b/libraries/cyclestreets-fragments/src/main/res/values-es/styles.xml @@ -0,0 +1,21 @@ + + + + + \ No newline at end of file diff --git a/libraries/cyclestreets-track/src/main/res/values-es/strings.xml b/libraries/cyclestreets-track/src/main/res/values-es/strings.xml new file mode 100644 index 000000000..ba1324fb0 --- /dev/null +++ b/libraries/cyclestreets-track/src/main/res/values-es/strings.xml @@ -0,0 +1,55 @@ + + + + Velocidad actual: + Tiempo viajado: + Distancia: + Terminado + + Información de viaje + hora de comienzo + propósito del viaje + + Grabación terminada. Elige un propósito de viaje: + Commutar + Escuela + Relacionado con el trabajo + Ejercicio + Social + Compra + Errando + Otro + " " + Comentarios sobre el viaje. + Edad: + Género: + + + Nivel de + ciclismo + experiencia: + + Enviar + Descartar + Viaje descartado. + Debes seleccionar un propósito para tu viaje antes de enviar. Elige uno de los propósitos anteriores. + Conmutar: este viaje es para ir básicamente de tu casa al trabajo.]]> + Colegio: este viaje es para ir a tu centro de estudios.]]> + Relacionado con el trabajo: este viaje es para ir a una reunión, convenció, conferencia... relacionados con el trabajo]]> + Ejercicio: este viaje es para hacer ejercicio, o por el amor al ciclismo.]]> + Social: este viaje es para moverse a una actividad social, como la casa de una amigo,parque, restaurante...]]> + Shopping: this bike trip was primarily to purchase or bring home goods or groceries.]]> + Errando: este viaje es para asistir a asuntos personales como el banco, el médico, gimnasio...]]> + Otro: si ninguna de las otras razones son aplicables, puedes comentarlo a continuación.]]> + Por favor selecciona + Por favor selecciona género + masculino + femenino + prefiero no decirlo + Por favor selecciona nivel de experiencia + experimentado + casual + principiante + %1$1.1f millas, %2$d minutos. %3$s + + diff --git a/libraries/cyclestreets-view/src/main/res/values-es/strings.xml b/libraries/cyclestreets-view/src/main/res/values-es/strings.xml new file mode 100644 index 000000000..64a94ced4 --- /dev/null +++ b/libraries/cyclestreets-view/src/main/res/values-es/strings.xml @@ -0,0 +1,108 @@ + + + + CycleStreets + + " " + Atrás + Siguiente + Guardar + Cancelar + Cerrar + Atrás + Volver a comenzar + Subir + Tu nombre + Tu dirección de correo + + Muestra localización + Sigue localización + Desactiva localización + + Tipo de ruta + Obteniendo tura de CycleStreets.net, por favor espere + Buscando ruta de CycleStreets.net, por favor espere + Búsqueda sin éxito + Cargando ruta, por favor espere + + Cambia tipo de ruta + Ruta inversa + Compartir ruta + Comentar ruta + Replantear como rápida + Replantear como equilibrada + Replantear como tranquila + Replantear como corta + Retrazar desde la localización actual + + La localizacióin no está disponible actualmente. + + Subir informaes de problemas relacionados con el ciclismo o para buenas prácticas. + Esos serán usados para informar de problemas a los que tomaban las decisiones. + Toma una foto + Seleccionar una foto existente. + Describe la foto. + ¿Es un problema o una buena práctica? + ¿Qué tipo de característica se muestra? + No se pueden cargar categorías de mapas. Comprueba la conexión. + ¿Donde se tomó esta foto? + La fotono se puede geolocalizar. Para autolocalizar fotos, activa la opcióin de geolocalización en la configuración de tu cámara. + Comparte esta foto + Subiendo informe, espere por favor. + No se puede subir la foto. Comprueba tu conexión. + Subir otra + + Continuar sin foto. + Tu informe + ¿Donde está la localización que describe tu informe? + + Este paquete de mapas no puede ser usado con esta versión de la aplicación. ¿Quieres comprobar si existe una actualización? + + Menú + Localización actual + Elige localización + No se encuentran localizaciones + Buscando localizaciones + Contactos + Ninguno de los contactos tiene dirección. + Cargando contactos + Eliminar + Localizaciones guardadas + + Puntos de interés + Categorías + + No tienes paquetes de mapas instalados. Vector maps está disponible como descarga a parte para los mapas sin conexión. + \n\n¿Te gustaría buscar paquetes de mapas ahora? + Registro en CycleStreets + Registro de cuenta esperando verificación + + Tus comentarios + Enviando opinión a CycleStreets.net + + Para subir fotos a CycleStreets necesitas una cuenta verificada. + El registro en CycleStreets es gratis + Registrarse + Entrar con una cuenta + Nombre de usuario deseado + Contraseña deseada + Confirma contraseña + Registro + Registrandose con CycleStreets.net + + Por favor introduce tun nombre de usuario y contraseña para entrar. + Ya estás conectado como\n%1$s, %2$s + Nombre de usuario + Contraseña + Limpiando detalles guardados + Entrar + Entrando CycleStreets.net + + El email introducido no tiene el formato correcto. + Contraseña y confirmación de la contraseña no coinciden. + El nombre de usuario debe tener al menos cinco caracteres de longitud. + ¿Estás seguro de que quieres limpiar los detalles de cuenta almacenados? + Ya tienes una cuenta registrada. Por favor comprueba tu email en busca del email de confirmación. + El registro es gratis y los usuarios registrados pueden añadir fotos. Para comenzar el registro por favor introduce tus detalles en el siguiente formulario. + + diff --git a/libraries/cyclestreets-view/src/main/res/values/styles.xml b/libraries/cyclestreets-view/src/main/res/values-es/styles.xml similarity index 100% rename from libraries/cyclestreets-view/src/main/res/values/styles.xml rename to libraries/cyclestreets-view/src/main/res/values-es/styles.xml From 3913bf9b0183dbbb53d600e19b9426c546d22a9f Mon Sep 17 00:00:00 2001 From: Laura Date: Thu, 27 Oct 2016 18:54:28 +0200 Subject: [PATCH 034/326] Update strings.xml --- cyclestreets.vNext/src/main/res/values-es/strings.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cyclestreets.vNext/src/main/res/values-es/strings.xml b/cyclestreets.vNext/src/main/res/values-es/strings.xml index 1c97e3a7c..7f8e290ac 100644 --- a/cyclestreets.vNext/src/main/res/values-es/strings.xml +++ b/cyclestreets.vNext/src/main/res/values-es/strings.xml @@ -10,12 +10,12 @@ Blog Blog - actualizado - Error inesperado, manda un informe + Error inesperado, enviar un informe CycleStreets se ha bloqueado… Por favor haga clic aquí para solucionar el problema. CycleStreets se ha bloqueado - Un error inesperado forzando la aplicación a cerrar. Por favor ayúdanos a repararlo mandando los datos del error, todo lo que tienes que hacer es hacer clic en \'OK\'. - Añade tus comentarios sobre el problema a continuación: + Un error inesperado ha forzado la aplicación a cerrar. Por favor ayúdanos a repararlo mandando los datos del error, todo lo que tienes que hacer es hacer clic en \'OK\'. + Añade tus comentarios sobre el problema a continuación: ¡Gracias! From f2b622b89cd2bb2453589e6cf47e9ca7fd77b786 Mon Sep 17 00:00:00 2001 From: Laura Date: Thu, 27 Oct 2016 18:57:45 +0200 Subject: [PATCH 035/326] Untrasteable mistake fixed --- libraries/cyclestreets-core/src/main/res/values-es/arrays.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/cyclestreets-core/src/main/res/values-es/arrays.xml b/libraries/cyclestreets-core/src/main/res/values-es/arrays.xml index 9f216ad0e..b24539cd8 100644 --- a/libraries/cyclestreets-core/src/main/res/values-es/arrays.xml +++ b/libraries/cyclestreets-core/src/main/res/values-es/arrays.xml @@ -7,7 +7,7 @@ km - millas + miles From ff0624a149c5b08edbd8c03c161e8432096961b4 Mon Sep 17 00:00:00 2001 From: Laura Date: Thu, 27 Oct 2016 19:04:29 +0200 Subject: [PATCH 036/326] Mistakes fixed --- .../src/main/res/values-es/strings.xml | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/libraries/cyclestreets-view/src/main/res/values-es/strings.xml b/libraries/cyclestreets-view/src/main/res/values-es/strings.xml index 64a94ced4..0992b8a97 100644 --- a/libraries/cyclestreets-view/src/main/res/values-es/strings.xml +++ b/libraries/cyclestreets-view/src/main/res/values-es/strings.xml @@ -20,7 +20,7 @@ Desactiva localización Tipo de ruta - Obteniendo tura de CycleStreets.net, por favor espere + Obteniendo rute de CycleStreets.net, por favor espere Buscando ruta de CycleStreets.net, por favor espere Búsqueda sin éxito Cargando ruta, por favor espere @@ -29,16 +29,16 @@ Ruta inversa Compartir ruta Comentar ruta - Replantear como rápida - Replantear como equilibrada - Replantear como tranquila - Replantear como corta + Replantear como ruta rápida + Replantear como ruta equilibrada + Replantear como ruta tranquila + Replantear como ruta corta Retrazar desde la localización actual - La localizacióin no está disponible actualmente. + La localización no está disponible actualmente. - Subir informaes de problemas relacionados con el ciclismo o para buenas prácticas. - Esos serán usados para informar de problemas a los que tomaban las decisiones. + Subir información de problemas relacionados con el ciclismo o como buena práctica. + Esos serán usados para informar de problemas a los que toman las decisiones. Toma una foto Seleccionar una foto existente. Describe la foto. @@ -46,7 +46,7 @@ ¿Qué tipo de característica se muestra? No se pueden cargar categorías de mapas. Comprueba la conexión. ¿Donde se tomó esta foto? - La fotono se puede geolocalizar. Para autolocalizar fotos, activa la opcióin de geolocalización en la configuración de tu cámara. + La foto no se puede geolocalizar. Para autolocalizar fotos, activa la opción de geolocalización en la configuración de tu cámara. Comparte esta foto Subiendo informe, espere por favor. No se puede subir la foto. Comprueba tu conexión. @@ -74,8 +74,8 @@ No tienes paquetes de mapas instalados. Vector maps está disponible como descarga a parte para los mapas sin conexión. \n\n¿Te gustaría buscar paquetes de mapas ahora? - Registro en CycleStreets - Registro de cuenta esperando verificación + Registro en CycleStreets + Registro esperando verificación de cuenta Tus comentarios Enviando opinión a CycleStreets.net @@ -86,11 +86,11 @@ Entrar con una cuenta Nombre de usuario deseado Contraseña deseada - Confirma contraseña + Confirma la contraseña Registro Registrandose con CycleStreets.net - Por favor introduce tun nombre de usuario y contraseña para entrar. + Por favor introduce un nombre de usuario y contraseña para entrar. Ya estás conectado como\n%1$s, %2$s Nombre de usuario Contraseña From 025ca147872d4f317a47b517d8714a9124a03e19 Mon Sep 17 00:00:00 2001 From: Laura Date: Thu, 27 Oct 2016 19:09:30 +0200 Subject: [PATCH 037/326] Mistake fixed --- libraries/cyclestreets-view/src/main/res/values-es/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/cyclestreets-view/src/main/res/values-es/strings.xml b/libraries/cyclestreets-view/src/main/res/values-es/strings.xml index 0992b8a97..f4231a87a 100644 --- a/libraries/cyclestreets-view/src/main/res/values-es/strings.xml +++ b/libraries/cyclestreets-view/src/main/res/values-es/strings.xml @@ -20,7 +20,7 @@ Desactiva localización Tipo de ruta - Obteniendo rute de CycleStreets.net, por favor espere + Obteniendo ruta de CycleStreets.net, por favor espere Buscando ruta de CycleStreets.net, por favor espere Búsqueda sin éxito Cargando ruta, por favor espere From 4df71721609f920a9fe6e71ce3190cf3086a738d Mon Sep 17 00:00:00 2001 From: "Ugave, Viney (US - Denver)" Date: Thu, 27 Oct 2016 12:38:20 -0600 Subject: [PATCH 038/326] added localizaton for hi-EN to the app and libs --- .../src/main/res/values-hi-IN/strings.xml | 21 +++ .../src/main/res/values-hi-IN/arrays.xml | 129 ++++++++++++++++++ .../src/main/res/values-hi-IN/strings.xml | 19 +++ .../src/main/res/values-hi-IN/strings.xml | 72 ++++++++++ .../src/main/res/values-hi-IN/strings.xml | 55 ++++++++ .../src/main/res/values-hi-IN/strings.xml | 109 +++++++++++++++ 6 files changed, 405 insertions(+) create mode 100644 cyclestreets.vNext/src/main/res/values-hi-IN/strings.xml create mode 100644 libraries/cyclestreets-core/src/main/res/values-hi-IN/arrays.xml create mode 100644 libraries/cyclestreets-core/src/main/res/values-hi-IN/strings.xml create mode 100644 libraries/cyclestreets-fragments/src/main/res/values-hi-IN/strings.xml create mode 100644 libraries/cyclestreets-track/src/main/res/values-hi-IN/strings.xml create mode 100644 libraries/cyclestreets-view/src/main/res/values-hi-IN/strings.xml diff --git a/cyclestreets.vNext/src/main/res/values-hi-IN/strings.xml b/cyclestreets.vNext/src/main/res/values-hi-IN/strings.xml new file mode 100644 index 000000000..aedc94164 --- /dev/null +++ b/cyclestreets.vNext/src/main/res/values-hi-IN/strings.xml @@ -0,0 +1,21 @@ + + + + CycleStreets + यात्रा योजनाकार + यात्रा कार्यक्रम + ऊंचाई + तस्वीर नक्शा + तस्वीर लगाना + ब्लॉग + ब्लॉग - अद्यतन + + अनपेक्षित त्रुटि है, कृपया एक रिपोर्ट भेज … + CycleStreets ध्वस्त हुआ है… + इस मुद्दे को ठीक करने में मदद करने के लिए यहां क्लिक करें + CycleStreets ध्वस्त हुआ है + बंद करने के लिए आवेदन के लिए मजबूर एक अनपेक्षित त्रुटि हुई। कृपया हमारी सहायता करें। हमें त्रुटि डेटा भेजने के द्वारा इसे ठीक करने के लिए, क्लिक करें \'OK\'. + आप नीचे दिए गए समस्या के बारे में अपनी टिप्पणी जोड़ सकता है: + धन्यवाद ! + + diff --git a/libraries/cyclestreets-core/src/main/res/values-hi-IN/arrays.xml b/libraries/cyclestreets-core/src/main/res/values-hi-IN/arrays.xml new file mode 100644 index 000000000..8dca15f4f --- /dev/null +++ b/libraries/cyclestreets-core/src/main/res/values-hi-IN/arrays.xml @@ -0,0 +1,129 @@ + + + + + किलोमीटर + मील + + + किलोमीटर + मील + + + + धीरे 10mph (16km/h) + तेज 12mph (20km/h) + बहुत तेज 15mph (24km/h) + + + 16 + 20 + 24 + + + + शांत + संतुलित + तेज + कम से कम + + + शांत + संतुलित + तेज + कम से कम + + + + हमेशा आकार 640 पिक्सल चौड़ा करना + पूर्ण आकार जब WiFi, 3.5G या 4G उपलब्ध + पूर्ण आकार + + + 640px + बड़ा Wifi + बड़ा + + + + 15 m + 20 m + 25 m + 30 m + 35 m + 40 m + 45 m + 50 m + 55 m + 60 m + 65 m + 70 m + 75 m + 80 m + 85 m + 90 m + 95 m + 100 m + 105 m + 110 m + 115 m + 120 m + 125 m + 130 m + 135 m + 140 m + 145 m + 150 m + 155 m + 160 m + 165 m + 170 m + 175 m + 180 m + 185 m + 190 m + 195 m + 200 m + + + 15 + 20 + 25 + 30 + 35 + 40 + 45 + 50 + 55 + 60 + 65 + 70 + 75 + 80 + 85 + 90 + 95 + 100 + 105 + 110 + 115 + 120 + 125 + 130 + 135 + 140 + 145 + 150 + 155 + 160 + 165 + 170 + 175 + 180 + 185 + 190 + 195 + 200 + + + diff --git a/libraries/cyclestreets-core/src/main/res/values-hi-IN/strings.xml b/libraries/cyclestreets-core/src/main/res/values-hi-IN/strings.xml new file mode 100644 index 000000000..9672cb517 --- /dev/null +++ b/libraries/cyclestreets-core/src/main/res/values-hi-IN/strings.xml @@ -0,0 +1,19 @@ + + + + ब्लॉग अद्यतन सूचनाएं दिखाएँ + + इस प्रतिक्रिया देने के लिए धन्यवाद। हम इस मुद्दे की जांच करेंगे और फिर आपसे संपर्क करेंगेै। + आपकी प्रतिक्रिया नहीं भेजा जा सका\n\n + + आपका खाता खोल दिया गया है.\n\n एक ईमेल पते पर भेज दिया गया है.\n\n ईमेल आता है, पंजीकरण पूरा करने के लिए निर्देशों का पालन करें. + आपका खाता पंजीकृत नहीं किया जा सकता है।\n\n + + आप सफलतापूर्वक प्रवेश किया है CycleStreets. + त्रुटि : + CycleStreets में प्रवेश नहीं कर सका. अपने यूज़रनेम और पासवर्ड की जाँच करें. + + अपनी फ़ोटो सफलतापूर्वक अपलोड किया गया. + फोटो अपलोड करते समय, समस्या हुआ : \n + + diff --git a/libraries/cyclestreets-fragments/src/main/res/values-hi-IN/strings.xml b/libraries/cyclestreets-fragments/src/main/res/values-hi-IN/strings.xml new file mode 100644 index 000000000..51e0c48d3 --- /dev/null +++ b/libraries/cyclestreets-fragments/src/main/res/values-hi-IN/strings.xml @@ -0,0 +1,72 @@ + + + + नेविगेशन दराज खोलें + नेविगेशन दरा कृपया बंद करना + CycleStreets + सेटिंग्स + जानकारी + ब्लॉग + मार्ग का पता + waypoint जोड़े + CycleStreets ब्लॉग अपडेट + ब्लॉग अपडेट + शुरू मार्कर + समाप्त मार्कर + Waypoint %d + नया मार्ग शुर कर ? + + + एक मार्ग की योजना + मार्ग संग्रह + संख्या से मार्ग खोलना + जगह का पता लगाएं + सेटिंग्स + खोलना + नाम बदलें + संपादित करें + मिटाना + + यात्रा कार्यक्रम + ऊंचाई + + + खोज + जगह का चयन + + + LiveRide प्रारंभ + LiveRide समाप्त + नया स्थान + नमस्ते blank fragment + + ऊपर बटन का उपयोग कर नए स्थानों जोड़े.\n संपादित करने के लि़ए, सूची में एक स्थान पकड़ए. + + CO₂ बचत: + कैलोरी: + समय: + यात्रा नंबर: + + फल + मार्ग + + net.cyclestreets + + नाम या पते की जगह + + दिशा + सड़क + 00m00 + 0m + (0km) + बारी-बारी से मार्ग की जानकारी यहाँ दिखाया जाएगा. + + नक्शे पर मार्क प्लेस और फिर स्थान का नाम. + स्थान का नाम : + रूट नंबर + + मार्ग + विवरण + %1$s मार्ग, %2$s + + diff --git a/libraries/cyclestreets-track/src/main/res/values-hi-IN/strings.xml b/libraries/cyclestreets-track/src/main/res/values-hi-IN/strings.xml new file mode 100644 index 000000000..63da5e63d --- /dev/null +++ b/libraries/cyclestreets-track/src/main/res/values-hi-IN/strings.xml @@ -0,0 +1,55 @@ + + + + वर्तमान गति: + यात्रा का समय: + दूरी: + समाप्त + + यात्रा की जानकारी + शुरू समय + यात्रा का उद्देश्य + + रिकॉर्डिंग समाप्त। यात्रा के उद्देश्य चुनें: + यात्रा + स्कूल + काम से संबंधित + व्यायाम + सामाजिक + खरीदारी + दूतकार्म + अन्य + " " + अपनी यात्रा के बारे में टिप्पणियाँ + आयु: + लिंग: + + + स्तर का + साइकिल चलाना + अनुभव: + + जमा करें + छोड़ना + यात्रा खारिज. + आप प्रस्तुत करने से पहले एक यात्रा उद्देश्य का चयन करना होगा! उपरोक्त उद्देश्यों में से चुनें. + यात्रा: इस बाइक यात्रा के घर और अपने मुख्य कार्यस्थल के बीच पाने के लिए मुख्य रूप से था.]]> + स्कूल: इस बाइक यात्रा मुख्य रूप से करने के लिए या स्कूल या कॉलेज से जाना था.]]> + काम से संबंधि: इस बाइक यात्रा मुख्य रूप से करने के लिए या एक व्यापार से संबंधित बैठक, समारोह, या अपने काम के लिए काम से संबंधित काम से जाना था.]]> + व्यायाम: इस बाइक यात्रा मुख्य रूप से व्यायाम के लिए था या बाइक चलाने की खातिर बाइकिंग.]]> + सामाजिक: इस बाइक यात्रा मुख्य रूप से करने के लिए या एक सामाजिक गतिविधि से जाने के लिए था, जैसे एक दोस्त \ 'के घर, पार्क, एक रेस्तरां, सिनेमा पर.]]> + खरीदारी: इस बाइक यात्रा खरीद या घर के सामान या किराने का सामान लाने के लिए मुख्य रूप से था.]]> + दूतकार्म: इस बाइक यात्रा बैंकिंग, एक चिकित्सक की यात्रा, जिम जा रहा है, आदि के रूप में व्यक्तिगत व्यवसाय के लिए भाग लेने के लिए मुख्य रूप से था]]> + अन्य: अन्य कारणों में से कोई भी इस यात्रा के लिए आवेदन किया है, तो आप टिप्पणी नीचे दर्ज कर सकते हैं हमें और अधिक बताने के लिए.]]> + कृपया चुने + कृपया लिंग चुने + नर + महिला + चुप रहना पसंद करूंगा + कृपया अनुभव के स्तर का चयन + अनुभव + विरल + नौसिखिया + %1$1.1f मील, %2$d मिनट. %3$s + + diff --git a/libraries/cyclestreets-view/src/main/res/values-hi-IN/strings.xml b/libraries/cyclestreets-view/src/main/res/values-hi-IN/strings.xml new file mode 100644 index 000000000..07fe0a27d --- /dev/null +++ b/libraries/cyclestreets-view/src/main/res/values-hi-IN/strings.xml @@ -0,0 +1,109 @@ + + + + CycleStreets + + " " + वापस + अगला + संचय + रद्द करें + बंद करे + वापस + फिर से शुरू करें + अपलोड! + आपका नाम + आपका ईमेल पता + + स्थान दिखाएं + स्थान का पालन करें + स्थान बंद कर + + रूट प्रकार + CycleStreets.net से मार्ग प्राप्त करने, कृपया प्रतीक्षा करें + ला रहा है CycleStreets.net से मार्ग, कृपया प्रतीक्षा करें + मार्ग खोजने में विफल रहा है + लोड हो रहा है मार्ग, कृपया प्रतीक्षा करें + + बदलें मार्ग प्रकार + रिवर्स मार्ग + मार्ग भेजें + इस मार्ग पर टिप्पणी करें + तेजी के रूप में फिर से योजना + संतुलित के रूप में फिर से योजना + शांत के रूप में फिर से योजना + कम से कम के रूप में फिर से योजना + वर्तमान स्थान से reroute + + स्थान वर्तमान में उपलब्ध नहीं. + + साइकिल चालन से संबंधित समस्याओं का या अच्छा अभ्यास की रिपोर्ट के शब्द. + ये इसलिए है कि हम निर्णय निर्माताओं के लिए समस्याओं की रिपोर्ट कर सकते हैं इस्तेमाल किया जाएगा. + एक तस्वीर लें + मौजूदा तस्वीर का चयन करें + इस तस्वीर का वर्णन करें + यह एक समस्या है या अच्छा अभ्यास है? + सुविधा के प्रकार क्या दिखाया जा रहा है? + photomap श्रेणियों के लोड नहीं कर सका। नेटवर्क कनेक्शन की जाँच करें।. + इस फोटो को कहाँ लिया गया था? + तस्वीर geolocated नहीं किया जा सकता है। स्वचालित रूप से तस्वीरों का पता लगाने के लिए, कृपया अपने कैमरा सेटिंग में जियोलोकेशन पर बारी। + इस तस्वीर को बाँटो + अपलोड करने की रिपोर्ट, कृपया प्रतीक्षा करें + तस्वीर अपलोड नहीं किया जा सका। अपने नेटवर्क कनेक्शन की जाँच करें। + एक और अपलोड + + तस्वीर के बिना जारी + अपनी रिपोर्ट + जहां स्थान अपनी रिपोर्ट का वर्णन करता है? + + इस नक्शे पैक एप्लिकेशन के इस संस्करण के साथ इस्तेमाल किया जा नहीं कर सकता है। \ N \ n क्या आप एक अद्यतन के लिए खोज करने के लिए पसंद है? + + मेन्यू + वर्तमान स्थान + स्थान का चयन + कोई स्थान नहीं मिला + स्थान के लिए खोज + संपर्क + अपने संपर्कों में से कोई भी पते हैं. + संपर्क लोड + हटाना + सहेजे गए स्थान + + रूचि के बिंदु + वर्ग + + आप स्थापित किसी भी मानचित्र पैक की जरूरत नहीं है। वेक्टर के लिए नक्शे +ऑफ़लाइन उपयोग के अलग डाउनलोड के रूप में उपलब्ध हैं। +\ N \ n क्या आप अब नक्शा पैक के लिए खोज करने के लिए पसंद है? + CycleStreets में प्रवेश किया + खाते के पंजीकरण के सत्यापन का इंतजार + + आपकी टिप्पणी + CycleStreets.net करने के लिए आपका commentsSending मार्ग प्रतिक्रिया + + फोटो अपलोड करने के लिए आप खाते प्रवेश एक CycleStreets होना चाहिए। + एक खाते के लिए पंजीकरण नि: शुल्क है। + एक खाते के लिए रजिस्टर। + एक मौजूदा खाते के साथ साइन इन करें + वांछित उपयोगकर्ता का नाम + वांछित पासवर्ड + पासवर्ड की पुष्टि कीजिये + रजिस्टर + CycleStreets.net के साथ पंजीयन + + में प्रवेश के लिए अपने खाते यूज़रनेम और पासवर्ड दर्ज करें. + आप पहले से ही के रूप में प्रवेश कर रहे हैं\n%1$s, %2$s + उपयोगकर्ता नाम + पासवर्ड + साफ संग्रहीत विवरण + साइन इन करें + CycleStreets.net में साइन इन करना + + ईमेल पता दर्ज एक ठीक से प्रारूपित पता नहीं है. + पासवर्ड और पुष्टि पासवर्ड मेल नहीं खाते। + यूजर का नाम कम से कम पांच पत्र / संख्या जरूर होना चाहिए। + आप संग्रहीत खाते के विवरण स्पष्ट करना चाहते हैं आप सुनिश्चित हैं? + आप पहले से ही एक खाता दर्ज कर लिया है। सत्यापन ईमेल के लिए अपने ईमेल की जाँच करें। + पंजीकरण मुफ्त है और पंजीकृत उपयोगकर्ताओं तस्वीरें जोड़ सकते हैं। प्रारंभ करने के लिए पंजीकरण की प्रक्रिया नीचे दिए फॉर्म में अपना विवरण दर्ज करें। + + From 466c511be2a646d360f1a3faed0dea21aeab82f4 Mon Sep 17 00:00:00 2001 From: Rafael Auyer Date: Thu, 27 Oct 2016 16:53:19 -0200 Subject: [PATCH 039/326] resolve variable issue --- .../cyclestreets-core/src/main/res/values-pt/arrays.xml | 3 ++- .../cyclestreets-track/src/main/res/values-pt/strings.xml | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/libraries/cyclestreets-core/src/main/res/values-pt/arrays.xml b/libraries/cyclestreets-core/src/main/res/values-pt/arrays.xml index 9629e0100..47b26e59c 100644 --- a/libraries/cyclestreets-core/src/main/res/values-pt/arrays.xml +++ b/libraries/cyclestreets-core/src/main/res/values-pt/arrays.xml @@ -1,12 +1,13 @@ + Quilômetros Milhas km - mi + miles Unhurried 16km/h (10mph) diff --git a/libraries/cyclestreets-track/src/main/res/values-pt/strings.xml b/libraries/cyclestreets-track/src/main/res/values-pt/strings.xml index 932354b0b..6e0829802 100644 --- a/libraries/cyclestreets-track/src/main/res/values-pt/strings.xml +++ b/libraries/cyclestreets-track/src/main/res/values-pt/strings.xml @@ -24,9 +24,9 @@ Gênero: - Nível - pedalada - experiência: + Nível de + experiência com + ciclismo: Enviar Discartar From e4633c62e4a2d2c01fd2fe62175e4c9831af6153 Mon Sep 17 00:00:00 2001 From: Rafael Auyer Date: Thu, 27 Oct 2016 17:08:59 -0200 Subject: [PATCH 040/326] Remove duplicate values with translatable="false values" --- .../src/main/res/values/strings.xml | 2 +- .../src/main/res/values-pt/arrays.xml | 106 +----------------- .../src/main/res/values-pt/strings.xml | 1 - .../src/main/res/values-pt/strings.xml | 1 - 4 files changed, 4 insertions(+), 106 deletions(-) diff --git a/cyclestreets.vNext/src/main/res/values/strings.xml b/cyclestreets.vNext/src/main/res/values/strings.xml index 3b64b92cc..258d4812f 100644 --- a/cyclestreets.vNext/src/main/res/values/strings.xml +++ b/cyclestreets.vNext/src/main/res/values/strings.xml @@ -11,7 +11,7 @@ Blog - updated Unexpected error, please send a report … - CycleStreets has crashed … + CycleStets has crashed … Please click here to help fix the issue. CycleStreets has crashed An unexpected error occurred forcing the diff --git a/libraries/cyclestreets-core/src/main/res/values-pt/arrays.xml b/libraries/cyclestreets-core/src/main/res/values-pt/arrays.xml index 47b26e59c..66bbf9376 100644 --- a/libraries/cyclestreets-core/src/main/res/values-pt/arrays.xml +++ b/libraries/cyclestreets-core/src/main/res/values-pt/arrays.xml @@ -5,122 +5,22 @@ Quilômetros Milhas - - km - miles - - Unhurried 16km/h (10mph) - Cruising 20km/h (12mph) + Sem pressa 16km/h (10mph) + Normal 20km/h (12mph) Rápido 24km/h (15mph) - - 16 - 20 - 24 - + Mais tranquila Balanceada Mais rápida Mais curta - - quietest - balanced - fastest - shortest - Sempre redimensionar para 640 pixels de largura Tamanho completo quando conectado a uma raede WiFi, 3.5G ou 4G Tamanho completo - - 640px - bigIfWifi - big - - - - 15 m - 20 m - 25 m - 30 m - 35 m - 40 m - 45 m - 50 m - 55 m - 60 m - 65 m - 70 m - 75 m - 80 m - 85 m - 90 m - 95 m - 100 m - 105 m - 110 m - 115 m - 120 m - 125 m - 130 m - 135 m - 140 m - 145 m - 150 m - 155 m - 160 m - 165 m - 170 m - 175 m - 180 m - 185 m - 190 m - 195 m - 200 m - - - 15 - 20 - 25 - 30 - 35 - 40 - 45 - 50 - 55 - 60 - 65 - 70 - 75 - 80 - 85 - 90 - 95 - 100 - 105 - 110 - 115 - 120 - 125 - 130 - 135 - 140 - 145 - 150 - 155 - 160 - 165 - 170 - 175 - 180 - 185 - 190 - 195 - 200 - diff --git a/libraries/cyclestreets-track/src/main/res/values-pt/strings.xml b/libraries/cyclestreets-track/src/main/res/values-pt/strings.xml index 6e0829802..0b05d9d31 100644 --- a/libraries/cyclestreets-track/src/main/res/values-pt/strings.xml +++ b/libraries/cyclestreets-track/src/main/res/values-pt/strings.xml @@ -18,7 +18,6 @@ Compras Pessoal Outra - " " Comentários sobre sua viagem Idade: Gênero: diff --git a/libraries/cyclestreets-view/src/main/res/values-pt/strings.xml b/libraries/cyclestreets-view/src/main/res/values-pt/strings.xml index 0d1a179ca..fb5f960b9 100644 --- a/libraries/cyclestreets-view/src/main/res/values-pt/strings.xml +++ b/libraries/cyclestreets-view/src/main/res/values-pt/strings.xml @@ -2,7 +2,6 @@ CycleStreets - " " Anterior Próximo Salvar From 272509ece3d49935a908cd7895603d2a14a1d35b Mon Sep 17 00:00:00 2001 From: DARDAR SAAD Date: Thu, 27 Oct 2016 20:16:24 +0000 Subject: [PATCH 041/326] Add French translation Addition of a French translation --- .../src/main/res/values-fr/strings.xml | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 cyclestreets.vNext/src/main/res/values-fr/strings.xml diff --git a/cyclestreets.vNext/src/main/res/values-fr/strings.xml b/cyclestreets.vNext/src/main/res/values-fr/strings.xml new file mode 100644 index 000000000..b72097f9d --- /dev/null +++ b/cyclestreets.vNext/src/main/res/values-fr/strings.xml @@ -0,0 +1,23 @@ + + + + CycleStreets + Planificateur de voyage + Itinéraire + Elévation + Photomap + Ajouter une photo + Blog + Blog - À jour + + Erreur inattendue, s'il vous plaît envoyer un rapport … + CycleStreets a planté … + S'il vous plaît cliquez ici pour aider à résoudre le problème. + CycleStreets a planté + Une erreur inattendue se forçant l'application de s'arrêter. + S'il vous plaît aidez-nous à résoudre ce problème en nous envoyant les données d'erreur, + tout ce que vous avez à faire est de cliquer sur \'OK\'. + Vous pouvez ajouter vos commentaires sur le problème ci-dessous: + Je vous remercie ! + + \ No newline at end of file From 0b323785521aa2136f76350308b48b106f9a25c7 Mon Sep 17 00:00:00 2001 From: "Ugave, Viney (US - Denver)" Date: Thu, 27 Oct 2016 14:54:19 -0600 Subject: [PATCH 042/326] Updated Folder names for Hindi --- .../src/main/res/{values-hi-IN => values-hi}/strings.xml | 0 .../src/main/res/{values-hi-IN => values-hi}/arrays.xml | 0 .../src/main/res/{values-hi-IN => values-hi}/strings.xml | 0 .../src/main/res/{values-hi-IN => values-hi}/strings.xml | 0 .../src/main/res/{values-hi-IN => values-hi}/strings.xml | 0 .../src/main/res/{values-hi-IN => values-hi}/strings.xml | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename cyclestreets.vNext/src/main/res/{values-hi-IN => values-hi}/strings.xml (100%) rename libraries/cyclestreets-core/src/main/res/{values-hi-IN => values-hi}/arrays.xml (100%) rename libraries/cyclestreets-core/src/main/res/{values-hi-IN => values-hi}/strings.xml (100%) rename libraries/cyclestreets-fragments/src/main/res/{values-hi-IN => values-hi}/strings.xml (100%) rename libraries/cyclestreets-track/src/main/res/{values-hi-IN => values-hi}/strings.xml (100%) rename libraries/cyclestreets-view/src/main/res/{values-hi-IN => values-hi}/strings.xml (100%) diff --git a/cyclestreets.vNext/src/main/res/values-hi-IN/strings.xml b/cyclestreets.vNext/src/main/res/values-hi/strings.xml similarity index 100% rename from cyclestreets.vNext/src/main/res/values-hi-IN/strings.xml rename to cyclestreets.vNext/src/main/res/values-hi/strings.xml diff --git a/libraries/cyclestreets-core/src/main/res/values-hi-IN/arrays.xml b/libraries/cyclestreets-core/src/main/res/values-hi/arrays.xml similarity index 100% rename from libraries/cyclestreets-core/src/main/res/values-hi-IN/arrays.xml rename to libraries/cyclestreets-core/src/main/res/values-hi/arrays.xml diff --git a/libraries/cyclestreets-core/src/main/res/values-hi-IN/strings.xml b/libraries/cyclestreets-core/src/main/res/values-hi/strings.xml similarity index 100% rename from libraries/cyclestreets-core/src/main/res/values-hi-IN/strings.xml rename to libraries/cyclestreets-core/src/main/res/values-hi/strings.xml diff --git a/libraries/cyclestreets-fragments/src/main/res/values-hi-IN/strings.xml b/libraries/cyclestreets-fragments/src/main/res/values-hi/strings.xml similarity index 100% rename from libraries/cyclestreets-fragments/src/main/res/values-hi-IN/strings.xml rename to libraries/cyclestreets-fragments/src/main/res/values-hi/strings.xml diff --git a/libraries/cyclestreets-track/src/main/res/values-hi-IN/strings.xml b/libraries/cyclestreets-track/src/main/res/values-hi/strings.xml similarity index 100% rename from libraries/cyclestreets-track/src/main/res/values-hi-IN/strings.xml rename to libraries/cyclestreets-track/src/main/res/values-hi/strings.xml diff --git a/libraries/cyclestreets-view/src/main/res/values-hi-IN/strings.xml b/libraries/cyclestreets-view/src/main/res/values-hi/strings.xml similarity index 100% rename from libraries/cyclestreets-view/src/main/res/values-hi-IN/strings.xml rename to libraries/cyclestreets-view/src/main/res/values-hi/strings.xml From 520405dae6dfb1ec7ee9c0f2634a4858584ad3b0 Mon Sep 17 00:00:00 2001 From: DARDAR SAAD Date: Thu, 27 Oct 2016 23:27:27 +0000 Subject: [PATCH 043/326] French translation Add French translation --- .../src/main/res/values-fr/arrays.xml | 129 ++++++++++++++++++ .../src/main/res/values-fr/strings.xml | 19 +++ .../src/main/res/values-fr/strings.xml | 72 ++++++++++ .../src/main/res/values-fr/strings.xml | 55 ++++++++ .../src/main/res/values-fr/strings.xml | 109 +++++++++++++++ 5 files changed, 384 insertions(+) create mode 100644 libraries/cyclestreets-core/src/main/res/values-fr/arrays.xml create mode 100644 libraries/cyclestreets-core/src/main/res/values-fr/strings.xml create mode 100644 libraries/cyclestreets-fragments/src/main/res/values-fr/strings.xml create mode 100644 libraries/cyclestreets-track/src/main/res/values-fr/strings.xml create mode 100644 libraries/cyclestreets-view/src/main/res/values-fr/strings.xml diff --git a/libraries/cyclestreets-core/src/main/res/values-fr/arrays.xml b/libraries/cyclestreets-core/src/main/res/values-fr/arrays.xml new file mode 100644 index 000000000..a6e68da16 --- /dev/null +++ b/libraries/cyclestreets-core/src/main/res/values-fr/arrays.xml @@ -0,0 +1,129 @@ + + + + + kilomètres + Miles + + + km + miles + + + + Sans hâte 10mph (16km/h) + Croisière 12mph (20km/h) + Rapide 15mph (24km/h) + + + 16 + 20 + 24 + + + + Quietest + Équilibré + Le plus rapide + Shortest + + + quietest + Équilibré + Le plus rapide + shortest + + + + Redimensionner toujours à 640 pixels de large + Taille réelle quand le WiFi, 3.5G ou 4G disponible + Taille réelle + + + 640px + bigIfWifi + big + + + + 15 m + 20 m + 25 m + 30 m + 35 m + 40 m + 45 m + 50 m + 55 m + 60 m + 65 m + 70 m + 75 m + 80 m + 85 m + 90 m + 95 m + 100 m + 105 m + 110 m + 115 m + 120 m + 125 m + 130 m + 135 m + 140 m + 145 m + 150 m + 155 m + 160 m + 165 m + 170 m + 175 m + 180 m + 185 m + 190 m + 195 m + 200 m + + + 15 + 20 + 25 + 30 + 35 + 40 + 45 + 50 + 55 + 60 + 65 + 70 + 75 + 80 + 85 + 90 + 95 + 100 + 105 + 110 + 115 + 120 + 125 + 130 + 135 + 140 + 145 + 150 + 155 + 160 + 165 + 170 + 175 + 180 + 185 + 190 + 195 + 200 + + + diff --git a/libraries/cyclestreets-core/src/main/res/values-fr/strings.xml b/libraries/cyclestreets-core/src/main/res/values-fr/strings.xml new file mode 100644 index 000000000..93d936c49 --- /dev/null +++ b/libraries/cyclestreets-core/src/main/res/values-fr/strings.xml @@ -0,0 +1,19 @@ + + + + Afficher les notifications de mise à jour du Blog + + Merci d'avoir envoyé ce feedback. Nous reviendrons vers vous quand nous l'aurons vérifié. + Votre feedback n'a pas pu être envoyé.\n\n + + Votre compte a été enregistré.\n\nUn e-mail a été envoyé à l'adresse que vous avez donné.\n\nLorsque l'e-mail arrive, suivez les instructions qu'il contient pour terminer l'enregistrement. + Votre compte n'a pas pu être enregistré.\n\n + + vous vous êtes connecté avec succès sur CycleStreets. + Erreur : + Impossible de se connecter à CycleStreets. S'il vous plaît vérifier votre nom d'utilisateur et mot de passe. + + Votre photo a été chargé avec succès. + Il y avait un problème de chargement de votre photo: \n + + diff --git a/libraries/cyclestreets-fragments/src/main/res/values-fr/strings.xml b/libraries/cyclestreets-fragments/src/main/res/values-fr/strings.xml new file mode 100644 index 000000000..129244f75 --- /dev/null +++ b/libraries/cyclestreets-fragments/src/main/res/values-fr/strings.xml @@ -0,0 +1,72 @@ + + + + Ouvrez le dessinateur du navigation + Fermer le dessinateur du navigation + CycleStreets + Paramètres + À propos + Blog + Trouver la route + Ajouter un point sur chemin + CycleStreets blog à jour + Blog à jour + Lancer le marqueur + Terminer le marqueur + point sur chemin %d + Démarrer une nouvelle route? + + + Planifier un itinéraire + Les routes enregistrées + Ouvrir la route par numéro + Chercher un lieu + Paramètres + Ouvrir + Renommer + Editer + Effacer + + Itinéraire + Élévation + + + Trouver + Choisissez Lieu + + + Démarrer en direct Tour + Terminer en direct Tour + Nouvel emplacement + Bonjour fragment vierge + + Ajouter de nouveaux emplacements en utilisant le bouton ci-dessus.\nTouchez et maintenez un emplacement dans la liste pour modifier ou supprimer. + + CO₂ sauvegarde: + Calories: + Temps: + numéro Journey: + + Fruit + route + + net.cyclestreets + + Placez le nom ou l'adresse + + direction + Rue + 00m00 + 0m + (0km) + virage par virage les informations sur l'itinéraire seront affichées\nici une fois qu'un itinéraire est programmé. + + Placez la marque sur la carte et puis nommez l'emplacement. + Nom de la localisation : + Numéro de route + + Route + Détails + %1$s route, %2$s + + diff --git a/libraries/cyclestreets-track/src/main/res/values-fr/strings.xml b/libraries/cyclestreets-track/src/main/res/values-fr/strings.xml new file mode 100644 index 000000000..9c874be94 --- /dev/null +++ b/libraries/cyclestreets-track/src/main/res/values-fr/strings.xml @@ -0,0 +1,55 @@ + + + + Vitesse actuelle: + Temps de parcours: + Distance: + Terminer + + infos sur le parcours + Heure de départ + but du voyage + + Terminé l'enregistrement. Choisissez un but du voyage: + Commuer + École + Liée à l'emploi + Exercice + Social + Achats + Course + Autre + " " + Commentaires à propos de votre voyage + Âge: + Le genre: + + + Niveau de + Faire du vélo + experience: + + Soumettre + Annuler + Trajet Annulé. + Vous devez sélectionner un motif de déplacement avant de soumettre! Choisissez parmi les objectifs ci-dessus. + Commuer: ce voyage à vélo était surtout d'obtenir entre le domicile et votre lieu de travail principal.]]> + School: ce voyage à vélo est surtout d'aller ou de l'école ou collège.]]> + Liée à l'emploi: ce voyage à vélo est principalement pour aller à ou d'une réunion d'affaires, fonction ou mission liée au travail.]]> + Exercice: ce voyage de vélo est principalement pour l'exercice, ou faire du vélo pour le plaisir de faire du vélo.]]> + Social: ce voyage à vélo était principalement pour aller vers ou à partir d'une activité sociale, par exemple à un ami(e)s, maison, le parc, un restaurant, cinéma.]]> + Shopping: ce voyage à vélo est principalement pour acheter ou pour apporter des marchandises à la maison ou l'épicerie.]]> + Course: ce voyage à vélo est principalement pour assister à des affaires personnelles telles que la banque, une visite chez le médecin, aller à la gym, etc.]]> + Autre: si aucune des autres raisons appliquée à ce voyage, vous pouvez entrer des commentaires ci-dessous pour nous en dire plus.]]> + S'il vous plaît sélectionnez + PS'il vous plaît sélectionner le sexe + mâle + femelle + je préfère ne rien dire + S'il vous plaît sélectionner le niveau d'expérience + expérimenté + peu fréquent + débutant + %1$1.1f miles, %2$d minutes. %3$s + + diff --git a/libraries/cyclestreets-view/src/main/res/values-fr/strings.xml b/libraries/cyclestreets-view/src/main/res/values-fr/strings.xml new file mode 100644 index 000000000..0e1adae17 --- /dev/null +++ b/libraries/cyclestreets-view/src/main/res/values-fr/strings.xml @@ -0,0 +1,109 @@ + + + + CycleStreets + + " " + Arrière + Prochain + Sauvegarder + Annuler + Fermer + Arrière + Recommencer + Charger! + Votre nom + Votre adresse e-mail + + Voir l'emplacement + Suivez l'emplacement + Emplacement Off + + Type d'itinéraire + Obtenir itinéraire de CycleStreets.net, s'il vous plaît patienter + Récupération itinéraire de CycleStreets.net, s'il vous plaît patienter + Le recherche de l'itinéraire a échoué + Chargement de la route, s'il vous plaît patienter + + Changer le type d'itinéraire + Acheminées en sens inverse + Partager cet itinéraire + Donnez votre avis sur cet itinéraire + Replanifier le plus rapide + Replanifier comme équilibrée + Replanifier comme le plus silencieux + Replanifier comme la plus courte + Réacheminez de l'emplacement actuel + + Emplacement pas disponible actuellement. + + Soumettre des rapports de problèmes liés au cyclisme ou de bonnes pratiques. + Ceux-ci seront utilisés pour que nous puissions signaler les problèmes aux décideurs. + Prendre une photo + Sélectionnez une photo existante + Décrire cette photo + Est-ce un problème ou une bonne pratique? + Quel type de fonction est affiché? + Impossible de charger photo carte catégories. S'il vous plaît vérifier la connexion réseau. + Où a été prise cette photo? + La photo n'a pas pu être géolocalisé. Pour localiser automatiquement les photos, s'il vous plaît tourner sur la géolocalisation dans les paramètres de l'appareil photo. + Partager cette photo + Transfert rapport, s'il vous plaît patienter + Impossible de télécharger la photo. S'il vous plaît vérifier votre connexion réseau. + Ajouter une autre + + Continuer sans photo + Votre rapport + Où est l'emplacement de votre rapport décrit? + + Ce pack de cartes est ne peut pas être utilisé avec cette version de l'application. \n\nVoulez-vous rechercher une mise à jour? + + Menu + Localisation actuelle + Choisissez l'emplacement + Aucun lieu trouvé + Recherche d'emplacement + Contacts + Aucun de vos contacts ont des adresses. + Chargement des contacts + Retirer + Adresses enregistrées + + Points d'interêts + Catégorie + + Vous n'avez pas de carte packs installés. + Vector maps pour utilisation hors ligne sont disponibles en tant que téléchargements séparés. + \n\nVoulez-vous rechercher packs de cartes maintenant? + Enregistrement pour CycleStreets + L'enregistrement du compte en attente de vérification + + Vos commentaires + Envoi des commentaires de route vers CycleStreets.net + + Pour télécharger des photos, vous devez avoir un compte CycleStreets connecté. + L'inscription à un compte est gratuite. + Inscrivez-vous pour avoir un compte + Se connecter avec un compte existant + Nom d'utilisateur souhaité + Mot de passe souhaité + Confirmez le mot de passe + Registre + Enregistrement avec CycleStreets.net + + S'il vous plaît entrer votre nom d'utilisateur et mot de passe pour vous connecter. + Vous êtes déjà connecté en tant que\n%1$s, %2$s + Nom d'utilisateur + Mot de passe + détails clairs stockés + Se connecter + Connexion à CycleStreets.net + + L'adresse e-mail indiquée n'est pas une adresse correctte. + Mot de passe et mot de passe de confirmation ne correspondent pas. + Nom d'utilisateur doit être au moins cinq lettres/chiffres à long. + Êtes-vous sûr de vouloir effacer les détails stockées du compte? + Vous avez déjà enregistré un compte. S'il vous plaît vérifier votre e-mail pour le message de vérification. + L'inscription est gratuite et les utilisateurs enregistrés peuvent ajouter des photos. Pour démarrer le processus d'inscription s'il vous plaît entrer vos coordonnées dans le formulaire ci-dessous. + + From faf667f2b1b68ab51e2d5e96bee8192679df9266 Mon Sep 17 00:00:00 2001 From: DARDAR SAAD Date: Thu, 27 Oct 2016 23:39:14 +0000 Subject: [PATCH 044/326] Fix Commit 44c6928 Fix Commit 44c6928 --- cyclestreets.vNext/src/main/res/values-fr/strings.xml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/cyclestreets.vNext/src/main/res/values-fr/strings.xml b/cyclestreets.vNext/src/main/res/values-fr/strings.xml index b72097f9d..f5e380c40 100644 --- a/cyclestreets.vNext/src/main/res/values-fr/strings.xml +++ b/cyclestreets.vNext/src/main/res/values-fr/strings.xml @@ -14,10 +14,8 @@ CycleStreets a planté … S'il vous plaît cliquez ici pour aider à résoudre le problème. CycleStreets a planté - Une erreur inattendue se forçant l'application de s'arrêter. - S'il vous plaît aidez-nous à résoudre ce problème en nous envoyant les données d'erreur, - tout ce que vous avez à faire est de cliquer sur \'OK\'. + Une erreur inattendue se forçant l'application de s'arrêter. S'il vous plaît aidez-nous à résoudre ce problème en nous envoyant les données d'erreur, tout ce que vous avez à faire est de cliquer sur \'OK\'. Vous pouvez ajouter vos commentaires sur le problème ci-dessous: Je vous remercie ! - - \ No newline at end of file + + From 982cb0cad206bb4fce41c387feb5e687e233c343 Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Fri, 28 Oct 2016 07:40:51 +0100 Subject: [PATCH 045/326] Mark another field as non-translatable --- libraries/cyclestreets-track/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/cyclestreets-track/src/main/res/values/strings.xml b/libraries/cyclestreets-track/src/main/res/values/strings.xml index 350e701d6..47cde2477 100644 --- a/libraries/cyclestreets-track/src/main/res/values/strings.xml +++ b/libraries/cyclestreets-track/src/main/res/values/strings.xml @@ -19,7 +19,7 @@ Shopping Errand Other - " " + " " Comments about your trip Age: Gender: From 4f27809da9635dd597456cf9ba37f0cb0911aa8c Mon Sep 17 00:00:00 2001 From: GiORg1 Date: Fri, 28 Oct 2016 09:20:42 +0200 Subject: [PATCH 046/326] Update strings.xml --- libraries/cyclestreets-view/src/main/res/values-ru/strings.xml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/libraries/cyclestreets-view/src/main/res/values-ru/strings.xml b/libraries/cyclestreets-view/src/main/res/values-ru/strings.xml index 72bd83209..7b98cb023 100644 --- a/libraries/cyclestreets-view/src/main/res/values-ru/strings.xml +++ b/libraries/cyclestreets-view/src/main/res/values-ru/strings.xml @@ -2,8 +2,7 @@ CycleStreets - - " " + Назад Следующий Сохранить From 75cd76e23e91555efa361d1e3b16d4192905c92c Mon Sep 17 00:00:00 2001 From: GiORg1 Date: Fri, 28 Oct 2016 09:22:24 +0200 Subject: [PATCH 047/326] Update arrays.xml --- .../src/main/res/values-ru/arrays.xml | 102 ------------------ 1 file changed, 102 deletions(-) diff --git a/libraries/cyclestreets-core/src/main/res/values-ru/arrays.xml b/libraries/cyclestreets-core/src/main/res/values-ru/arrays.xml index 1aea0eea4..12bc3e3c7 100644 --- a/libraries/cyclestreets-core/src/main/res/values-ru/arrays.xml +++ b/libraries/cyclestreets-core/src/main/res/values-ru/arrays.xml @@ -5,21 +5,12 @@ Километры Мили - - km - miles - Неторопливый 10миля/ч (16км / ч) Запас хода 12миля/ч (20 км / ч) Быстрый 15миля/ч (24км / ч) - - 16 - 20 - 24 - Бесшумный @@ -27,103 +18,10 @@ Быстрый Короткий - - quietest - balanced - fastest - shortest - Всегда изменять размер в ширину 640 пикселей Полный размер, когда WiFi, 3.5G или 4G доступен Полный размер - - 640px - bigIfWifi - big - - - - 15 m - 20 m - 25 m - 30 m - 35 m - 40 m - 45 m - 50 m - 55 m - 60 m - 65 m - 70 m - 75 m - 80 m - 85 m - 90 m - 95 m - 100 m - 105 m - 110 m - 115 m - 120 m - 125 m - 130 m - 135 m - 140 m - 145 m - 150 m - 155 m - 160 m - 165 m - 170 m - 175 m - 180 m - 185 m - 190 m - 195 m - 200 m - - - 15 - 20 - 25 - 30 - 35 - 40 - 45 - 50 - 55 - 60 - 65 - 70 - 75 - 80 - 85 - 90 - 95 - 100 - 105 - 110 - 115 - 120 - 125 - 130 - 135 - 140 - 145 - 150 - 155 - 160 - 165 - 170 - 175 - 180 - 185 - 190 - 195 - 200 - - From 1ced59be73ccd6dee46adb5040e17bb80c510ec7 Mon Sep 17 00:00:00 2001 From: "Ugave, Viney (US - Denver)" Date: Fri, 28 Oct 2016 09:34:03 -0600 Subject: [PATCH 048/326] Updated Translatables --- .../src/main/res/values-hi/arrays.xml | 95 +------------------ .../src/main/res/values-hi/strings.xml | 1 - 2 files changed, 2 insertions(+), 94 deletions(-) diff --git a/libraries/cyclestreets-core/src/main/res/values-hi/arrays.xml b/libraries/cyclestreets-core/src/main/res/values-hi/arrays.xml index 8dca15f4f..f61e883d4 100644 --- a/libraries/cyclestreets-core/src/main/res/values-hi/arrays.xml +++ b/libraries/cyclestreets-core/src/main/res/values-hi/arrays.xml @@ -5,10 +5,6 @@ किलोमीटर मील - - किलोमीटर - मील - धीरे 10mph (16km/h) @@ -27,12 +23,6 @@ तेज कम से कम - - शांत - संतुलित - तेज - कम से कम - हमेशा आकार 640 पिक्सल चौड़ा करना @@ -41,89 +31,8 @@ 640px - बड़ा Wifi - बड़ा - - - - 15 m - 20 m - 25 m - 30 m - 35 m - 40 m - 45 m - 50 m - 55 m - 60 m - 65 m - 70 m - 75 m - 80 m - 85 m - 90 m - 95 m - 100 m - 105 m - 110 m - 115 m - 120 m - 125 m - 130 m - 135 m - 140 m - 145 m - 150 m - 155 m - 160 m - 165 m - 170 m - 175 m - 180 m - 185 m - 190 m - 195 m - 200 m - - - 15 - 20 - 25 - 30 - 35 - 40 - 45 - 50 - 55 - 60 - 65 - 70 - 75 - 80 - 85 - 90 - 95 - 100 - 105 - 110 - 115 - 120 - 125 - 130 - 135 - 140 - 145 - 150 - 155 - 160 - 165 - 170 - 175 - 180 - 185 - 190 - 195 - 200 + bigIfWifi + big diff --git a/libraries/cyclestreets-track/src/main/res/values-hi/strings.xml b/libraries/cyclestreets-track/src/main/res/values-hi/strings.xml index 63da5e63d..fdda0a2e3 100644 --- a/libraries/cyclestreets-track/src/main/res/values-hi/strings.xml +++ b/libraries/cyclestreets-track/src/main/res/values-hi/strings.xml @@ -19,7 +19,6 @@ खरीदारी दूतकार्म अन्य - " " अपनी यात्रा के बारे में टिप्पणियाँ आयु: लिंग: From aad35efd1ae1cacac07e4dcee32ae1c0d1c58776 Mon Sep 17 00:00:00 2001 From: "Ugave, Viney (US - Denver)" Date: Fri, 28 Oct 2016 11:04:42 -0600 Subject: [PATCH 049/326] Checking in localization for language mr-IN 4 th largest spoken language in India.. Marathi.. https://en.wikipedia.org/wiki/List_of_languages_by_number_of_native_spea kers_in_India --- .../src/main/res/values-mr/strings.xml | 21 ++++ .../src/main/res/values-mr/arrays.xml | 25 ++++ .../src/main/res/values-mr/strings.xml | 19 ++++ .../src/main/res/values-mr/strings.xml | 72 ++++++++++++ .../src/main/res/values-mr/strings.xml | 54 +++++++++ .../src/main/res/values-mr/strings.xml | 107 ++++++++++++++++++ 6 files changed, 298 insertions(+) create mode 100644 cyclestreets.vNext/src/main/res/values-mr/strings.xml create mode 100644 libraries/cyclestreets-core/src/main/res/values-mr/arrays.xml create mode 100644 libraries/cyclestreets-core/src/main/res/values-mr/strings.xml create mode 100644 libraries/cyclestreets-fragments/src/main/res/values-mr/strings.xml create mode 100644 libraries/cyclestreets-track/src/main/res/values-mr/strings.xml create mode 100644 libraries/cyclestreets-view/src/main/res/values-mr/strings.xml diff --git a/cyclestreets.vNext/src/main/res/values-mr/strings.xml b/cyclestreets.vNext/src/main/res/values-mr/strings.xml new file mode 100644 index 000000000..671e06428 --- /dev/null +++ b/cyclestreets.vNext/src/main/res/values-mr/strings.xml @@ -0,0 +1,21 @@ + + + + CycleStreets + रवास नियोजक + प्रवासाचा मार्ग + उत्थान + फोटो नकाशा + फोटो जोडा + ब्लॉग + ब्लॉग - सुधारित + + अनपेक्षित त्रुटी, कृपया एक अहवाल पाठवा … + CycleStreets क्रॅश झाला आहे … + समस्येचे निवारण करण्यात मदत करण्यासाठी येथे क्लिक करा. + CycleStreets क्रॅश झाला आहे + एक अनपेक्षित त्रुटी आढळली. आम्हाला त्रुटी डेटा पाठवून आम्हाला या निराकरण करण्यात मदत करा, क्लिक करा \'OK\'. + खालील समस्या आपल्या टिप्पण्या जोडा: + धन्यवाद ! + + diff --git a/libraries/cyclestreets-core/src/main/res/values-mr/arrays.xml b/libraries/cyclestreets-core/src/main/res/values-mr/arrays.xml new file mode 100644 index 000000000..b1523ff75 --- /dev/null +++ b/libraries/cyclestreets-core/src/main/res/values-mr/arrays.xml @@ -0,0 +1,25 @@ + + + + + किलोमीटर्स + मैल + + + + मंद 10mph (16km/h) + मध्यम गती 12mph (20km/h) + जलद 15mph (24km/h) + + + शांत + संतुलित + वेगवान + कमीत कमी + + + नेहमी 640 रुंद पिक्सेल आकार बदल + पूर्ण आकारात तेव्हा केलेली, 3.5G किंवा 4G उपलब्ध + पूर्ण आकारात + + diff --git a/libraries/cyclestreets-core/src/main/res/values-mr/strings.xml b/libraries/cyclestreets-core/src/main/res/values-mr/strings.xml new file mode 100644 index 000000000..c42cab274 --- /dev/null +++ b/libraries/cyclestreets-core/src/main/res/values-mr/strings.xml @@ -0,0 +1,19 @@ + + + + ब्लॉग सूचना दर्शवा + + आपल्या अभिप्रायाबद्दल धन्यवाद.. आपल्याला लवकरच संपर्क साधू. + आपला अभिप्राय पाठवला जाऊ शकत नाही.\n\n + + आपले खाते दाखल करण्यात आले आहे.\n\n ई-मेल आपल्याला दिली पत्त्यावर पाठविला गेला आहे. \n\n सूचना ई-मेल नोंदणी पूर्ण करण्यासाठी समाविष्टीत आहे पालन करा. + आपले खाते नोंदणीकृत केले जाऊ शकत नाही.\n\n + + आपण यशस्वीरित्या CycleStreets साइन इन केले आहे. + त्रुटी : + CycleStreets साइन इन करू शकत नाही. कृपया आपले वापरकर्तानाव आणि संकेतशब्द तपासा. + + आपला फोटो यशस्वीरित्या अपलोड केला. + आपला फोटो अपलोड करताना एक समस्या आली: \n + + diff --git a/libraries/cyclestreets-fragments/src/main/res/values-mr/strings.xml b/libraries/cyclestreets-fragments/src/main/res/values-mr/strings.xml new file mode 100644 index 000000000..c166e8caf --- /dev/null +++ b/libraries/cyclestreets-fragments/src/main/res/values-mr/strings.xml @@ -0,0 +1,72 @@ + + + + नेव्हिगेशन ड्रॉवर उघडा + नेव्हिगेशन ड्रॉवर बंद करा + CycleStreets + सेटिंग्ज + माहिती + ब्लॉग + मार्ग शोधा + मार्ग बिंदू जोडू + CycleStreets ब्लॉग सुधारणा + ब्लॉग सुधारणा + मार्कर सुरू + मार्कर समाप्त + वेपॉइंट %d + एक नवीन मार्ग सुरू? + + + एक मार्ग योजना + जतन मार्ग + संख्या मार्ग खुला + स्थान शोधू + सेटिंग्ज + ओपन + पुनर्नामित करा + संपादित करा + हटवा + + प्रवासाचा मार्ग + उत्थान + + + शोधणे + स्थान निवडा + + + प्रारंभ LiveRide + शेवटी LiveRide + नवीन स्थान + हॅलो रिक्त तुकडा + + वरील बटण वापरून नवीन स्थाने जोडा. \n Touch आणि संपादित करणे किंवा हटविणे यादीत स्थान धरा. + + CO₂ बचत: + कॅलरीज: + वेळ: + प्रवास क्रमांक: + + फळ + मार्ग + + net.cyclestreets + + नाव किंवा पत्ता ठेवा + + दिशा + रस्ता + 00m00 + 0m + (0km) + चालू-by-turn मार्ग योजना आखण्यात आली आहे एकदा मार्ग माहिती येथे \ दर्शविले जाईल. + + नकाशावर खूण ठेवा आणि मग स्थान नाव. + स्थान नाव : + मार्ग क्रमांक + + मार्ग + माहिती + %1$s मार्ग, %2$s + + diff --git a/libraries/cyclestreets-track/src/main/res/values-mr/strings.xml b/libraries/cyclestreets-track/src/main/res/values-mr/strings.xml new file mode 100644 index 000000000..7ef50d13e --- /dev/null +++ b/libraries/cyclestreets-track/src/main/res/values-mr/strings.xml @@ -0,0 +1,54 @@ + + + + वर्तमान गत ी: + प्रवास वेळ : + अंतर : + समाप्त + + प्रवास माहिती + सुरवातीची वेळ + ट्रिप उद्देश + + रेकॉर्डिंग पूर्ण . एक ट्रिप उद्देश निवडा: + ये - जा + शाळा + काम-संबंधित + व्यायाम + सामाजिक + खरेदी + निरोप + इतर + आपल्या ट्रिप टिप्पण्या + वय: + लिंग: + + + पातळी + सायकलिंग + अनुभव: + + सादर + टाकून + प्रवासाचा टाकून. + आपण सादर करण्यापूर्वी एक ट्रिप उद्देश निवडणे आवश्यक आहे! वरील कारणांसाठी निवडा. + ये - जा: या दुचाकी ट्रिप घरी आणि आपल्या मुख्य कामाच्या दरम्यान प्राप्त करण्यासाठी प्रामुख्याने होते.]]> + शाळा: या दुचाकी उत्तम किंवा शाळा किंवा कॉलेज मधील जाण्यासाठी प्रामुख्याने होते.]]> + काम-संबंधि: या दुचाकी उत्तम किंवा आपली नोकरी व्यवसाय संबंधित बैठक, समारंभ, किंवा कार्याशी संबंधित निरोप जाऊ प्रामुख्याने होते.]]> + व्यायाम: या दुचाकी ट्रिप प्रामुख्याने व्यायाम होते, किंवा दुचाकी चालविणे च्या फायद्यासाठी बाइक.]]> + सामाजिक: या दुचाकी ट्रिप उदा प्रामुख्याने किंवा सामाजिक पासून जात होते एक मित्र \ 'घरी पार्क, एक रेस्टॉरंट, चित्रपट.]]> + खरेदी: या दुचाकी ट्रिप खरेदी किंवा घरातील सामान किंवा किराणामाल आणण्यासाठी प्रामुख्याने होते.]]> + निरोप: या दुचाकी ट्रिप अशा बँकिंग, एक डॉक्टर भेट, व्यायामशाळा जात, इ वैयक्तिक व्यवसाय उपस्थित प्रामुख्याने होते.]]> + इतर: इतर कारणे काहीही या ट्रिप लागू असल्यास, आपण अधिक आम्हाला सांगा खाली टिप्पण्या प्रविष्ट करू शकता.]]> + कृपया निवडा + कृपया लिंग निवडा + नर + महिला + सांगू इच्छित नाहीत + कृपया अनुभव पातळी निवडा + अनुभवी + वरचे वर + नवशिक्या + %1$1.1f मैल, %2$d मिनिटे. %3$s + + diff --git a/libraries/cyclestreets-view/src/main/res/values-mr/strings.xml b/libraries/cyclestreets-view/src/main/res/values-mr/strings.xml new file mode 100644 index 000000000..024ddf8d3 --- /dev/null +++ b/libraries/cyclestreets-view/src/main/res/values-mr/strings.xml @@ -0,0 +1,107 @@ + + + + CycleStreets + + परत + पुढे + जतन करा + रद्द करा + बंद + परत + पुन्हा सुरू + अपलोड करा! + आपले नाव + आपला ई-मेल पत्ता + + स्थान दर्शवा + स्थान अनुसरण करा + स्थान बंद + + मार्ग प्रकार + CycleStreets.net पासून मार्ग प्राप्त आहे, कृपया थांबा + CycleStreets.net पासून मार्ग आणत आहे, कृपया थांबा + मार्ग शोधत अयशस्वी + लोड करीत आहे मार्ग आहे, कृपया थांबा + + मार्ग प्रकार बदला + उलट मार्ग + हा मार्ग सामायिक करा + या मार्गावर टिप्पणी + वेगवान योजना करू + योजना समतोल करू + शांत योजना करू + कमीत कम ीयोजना करू + वर्तमान स्थान पासून बदलायचा + + स्थान सध्या उपलब्ध नाही. + + सायकलिंग संबंधित समस्या किंवा चांगला सराव अहवाल अपलोड करा. + जेणेकरून आम्ही निर्णय घेणारे समस्या तक्रार करू शकता हे वापरले जाईल. + Take a photo + विद्यमान फोटो निवडा + हा फोटो वर्णन + ही समस्या किंवा चांगला सराव आहे? + वैशिष्ट्य काय प्रकार दर्शविली जात आहे? + Photomap श्रेण्या लोड करणे शक्य नाही. नेटवर्क कनेक्शन तपासा. + जेथे हे छायाचित्र घेतले होते? + फोटो भौगोलिक स्थान जाऊ शकत नाही. स्वयंचलितपणे फोटो शोधून आपल्या कॅमेरा सेटिंग्ज भौगोलिक स्थान चालू करा. + हा फोटो शेअर करा + अहवाल अपलोड करत आहे, कृपया थांबा + फोटो अपलोड करू शकत नाही. आपले नेटवर्क कनेक्शन तपासा. + आणखी एक अपलोड करा + + फोटो न करता सुरू ठेवा + आपला अहवाल + स्थान आपला अहवाल वर्णन जेथे आहे? + + हा नकाशा पॅक अॅप च्या या आवृत्तीमध्ये वापरले करू शकत नाहीत जाईल.\n आपण एक सुधारणा शोधू इच्छिता? + + मेनू + वर्तमान स्थान + स्थान निवडा + कोणतेहि स्थान सापडले नाही + स्थान शोधताना + संपर्क + आपल्या संपर्कातील कोणीही पत्ते. + संपर्क लोड करीत आहे + काढा + जतन केलेले स्थान + + व्याज पॉइंट्स + श्रेणी + + आपण स्थापित केलेले कोणतेही नकाशा पॅक नाही. वेक्टर नकाशे ऑफलाइन वापरासाठी स्वतंत्र डाउनलोड म्हणून उपलब्ध आहेत. + \n आपण आता नकाशा पॅक्स शोधू इच्छिता? + CycleStreets मध्ये साइन इन + खाते नोंदणी सत्यापन वाट पहात + + आपल्या टिप्पण्या + CycleStreets.net मार्ग अभिप्राय पाठवत आहे + + फोटो अपलोड करण्यासाठी आपण साइन इन करा खाते CycleStreets असणे आवश्यक आहे. + खाते नोंदणी मोफत आहे. + खात्यासाठी नोंदणी + विद्यमान खात्याशी साइन इन + इच्छित वापरकर्तानाव + इच्छित पासवर्ड + पासवर्ड पुष्टी + नोंदणी + CycleStreets.net नोंदणी + + साइन इन करण्यासाठी आपले खाते वापरकर्तानाव आणि संकेतशब्द प्रविष्ट करा. + आपण आता मध्ये साइन इन केले\n%1$s, %2$s + वापरकर्तानाव + पासवर्ड + संग्रहित तपशील स्पष्ट + साइन इन कराn + साइन इन CycleStreets.net मध्ये + + प्रविष्ट केलेला ईमेल पत्ता योग्यरितीने स्वरूपित पत्ता नाही. + संकेतशब्द आणि पुष्टीकरण संकेतशब्द जुळत नाही. + वापरकर्तानाव किमान पाच अक्षरे / संख्या असणे आवश्यक आहे. + आपण संग्रहित खाते तपशील साफ करायचे आहे का? + आपण आधीच एक खाते आहे नोंदणी केली आहे. कृपया सत्यापन ई-मेल ईमेल तपासा. + नोंदणी मोफत आहे आणि ते नोंदणीकृत वापरकर्ते फोटो जोडू शकतात. नोंदणी प्रक्रिया सुरू करण्यासाठी खालील फॉर्म मध्ये आपली माहिती प्रविष्ट करा. + + From 70f39f059aad26c6aa376224fc006b0dd584d31c Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Sun, 30 Oct 2016 10:28:08 +0000 Subject: [PATCH 050/326] Fix outstanding errors in Portuguese, Hindi & Russian translations --- cyclestreets.vNext/src/main/res/values/strings.xml | 2 +- .../src/main/res/values-hi/arrays.xml | 10 ---------- .../src/main/res/values-hi/strings.xml | 2 +- .../src/main/res/values-ru/strings.xml | 1 - .../src/main/res/values-hi/strings.xml | 1 - .../src/main/res/values-ru/strings.xml | 2 +- 6 files changed, 3 insertions(+), 15 deletions(-) diff --git a/cyclestreets.vNext/src/main/res/values/strings.xml b/cyclestreets.vNext/src/main/res/values/strings.xml index 258d4812f..3b64b92cc 100644 --- a/cyclestreets.vNext/src/main/res/values/strings.xml +++ b/cyclestreets.vNext/src/main/res/values/strings.xml @@ -11,7 +11,7 @@ Blog - updated Unexpected error, please send a report … - CycleStets has crashed … + CycleStreets has crashed … Please click here to help fix the issue. CycleStreets has crashed An unexpected error occurred forcing the diff --git a/libraries/cyclestreets-core/src/main/res/values-hi/arrays.xml b/libraries/cyclestreets-core/src/main/res/values-hi/arrays.xml index f61e883d4..7d6cc7088 100644 --- a/libraries/cyclestreets-core/src/main/res/values-hi/arrays.xml +++ b/libraries/cyclestreets-core/src/main/res/values-hi/arrays.xml @@ -11,11 +11,6 @@ तेज 12mph (20km/h) बहुत तेज 15mph (24km/h) - - 16 - 20 - 24 - शांत @@ -29,10 +24,5 @@ पूर्ण आकार जब WiFi, 3.5G या 4G उपलब्ध पूर्ण आकार - - 640px - bigIfWifi - big - diff --git a/libraries/cyclestreets-track/src/main/res/values-hi/strings.xml b/libraries/cyclestreets-track/src/main/res/values-hi/strings.xml index fdda0a2e3..69abc2f50 100644 --- a/libraries/cyclestreets-track/src/main/res/values-hi/strings.xml +++ b/libraries/cyclestreets-track/src/main/res/values-hi/strings.xml @@ -36,7 +36,7 @@ स्कूल: इस बाइक यात्रा मुख्य रूप से करने के लिए या स्कूल या कॉलेज से जाना था.]]> काम से संबंधि: इस बाइक यात्रा मुख्य रूप से करने के लिए या एक व्यापार से संबंधित बैठक, समारोह, या अपने काम के लिए काम से संबंधित काम से जाना था.]]> व्यायाम: इस बाइक यात्रा मुख्य रूप से व्यायाम के लिए था या बाइक चलाने की खातिर बाइकिंग.]]> - सामाजिक: इस बाइक यात्रा मुख्य रूप से करने के लिए या एक सामाजिक गतिविधि से जाने के लिए था, जैसे एक दोस्त \ 'के घर, पार्क, एक रेस्तरां, सिनेमा पर.]]> + सामाजिक: इस बाइक यात्रा मुख्य रूप से करने के लिए या एक सामाजिक गतिविधि से जाने के लिए था, जैसे एक दोस्त \'के घर, पार्क, एक रेस्तरां, सिनेमा पर.]]> खरीदारी: इस बाइक यात्रा खरीद या घर के सामान या किराने का सामान लाने के लिए मुख्य रूप से था.]]> दूतकार्म: इस बाइक यात्रा बैंकिंग, एक चिकित्सक की यात्रा, जिम जा रहा है, आदि के रूप में व्यक्तिगत व्यवसाय के लिए भाग लेने के लिए मुख्य रूप से था]]> अन्य: अन्य कारणों में से कोई भी इस यात्रा के लिए आवेदन किया है, तो आप टिप्पणी नीचे दर्ज कर सकते हैं हमें और अधिक बताने के लिए.]]> diff --git a/libraries/cyclestreets-track/src/main/res/values-ru/strings.xml b/libraries/cyclestreets-track/src/main/res/values-ru/strings.xml index 5d14558f8..6bb57e2f3 100644 --- a/libraries/cyclestreets-track/src/main/res/values-ru/strings.xml +++ b/libraries/cyclestreets-track/src/main/res/values-ru/strings.xml @@ -19,7 +19,6 @@ Покупка Поручение Другое - " " Комментарии о вашей поездке Возраст: Пол: diff --git a/libraries/cyclestreets-view/src/main/res/values-hi/strings.xml b/libraries/cyclestreets-view/src/main/res/values-hi/strings.xml index 07fe0a27d..3d9200690 100644 --- a/libraries/cyclestreets-view/src/main/res/values-hi/strings.xml +++ b/libraries/cyclestreets-view/src/main/res/values-hi/strings.xml @@ -3,7 +3,6 @@ CycleStreets - " " वापस अगला संचय diff --git a/libraries/cyclestreets-view/src/main/res/values-ru/strings.xml b/libraries/cyclestreets-view/src/main/res/values-ru/strings.xml index 7b98cb023..883eec003 100644 --- a/libraries/cyclestreets-view/src/main/res/values-ru/strings.xml +++ b/libraries/cyclestreets-view/src/main/res/values-ru/strings.xml @@ -83,7 +83,7 @@ Для того, чтобы загрузить фотографии вы должны иметь CycleStreets счет и войти в свой аккаунт. Регистрация учетной записи является бесплатным. Зарегистрировать учетную запись - Войти в свой аккаунт/string> + Войти в свой аккаунт Желаемое имя пользователя Желаемый пароль Подтвердите Пароль From e87c89787f4ad103234d2d55eb1acf7ad837ce59 Mon Sep 17 00:00:00 2001 From: Michele Fortunato Date: Sun, 30 Oct 2016 16:50:53 +0200 Subject: [PATCH 051/326] Italian translation added --- .../src/main/res/values-it/strings.xml | 21 +++ .../src/main/res/values-it/arrays.xml | 129 ++++++++++++++++++ .../src/main/res/values-it/strings.xml | 19 +++ .../src/main/res/values-it/strings.xml | 72 ++++++++++ .../src/main/res/values-it/strings.xml | 54 ++++++++ .../src/main/res/values-it/strings.xml | 106 ++++++++++++++ .../src/main/res/values-pt/strings.xml | 2 +- 7 files changed, 402 insertions(+), 1 deletion(-) create mode 100644 cyclestreets.vNext/src/main/res/values-it/strings.xml create mode 100644 libraries/cyclestreets-core/src/main/res/values-it/arrays.xml create mode 100644 libraries/cyclestreets-core/src/main/res/values-it/strings.xml create mode 100644 libraries/cyclestreets-fragments/src/main/res/values-it/strings.xml create mode 100644 libraries/cyclestreets-track/src/main/res/values-it/strings.xml create mode 100644 libraries/cyclestreets-view/src/main/res/values-it/strings.xml diff --git a/cyclestreets.vNext/src/main/res/values-it/strings.xml b/cyclestreets.vNext/src/main/res/values-it/strings.xml new file mode 100644 index 000000000..fd66bb889 --- /dev/null +++ b/cyclestreets.vNext/src/main/res/values-it/strings.xml @@ -0,0 +1,21 @@ + + + + CycleStreets + Pianificatore di viaggio + Itinerario + Altimetria + Photomap + Aggiungi foto + Blog + Blog - aggiornato + + Errore inaspettato, inviaci una segnalazione … + ha smesso di funzionare … + Clicca qui per aiutarci a risolvere il problema. + CycleStreets ha smesso di funzionare + Un error imprevisto ha costretto\n l\'app a smettere di funzionare.Aiutaci a risolvere questo problema inviandoci i dati dell\'errore,\n basta cliccare su \'OK\'. + Puoi aggiugnere commenti sul problema qui sotto: + Grazie ! + + diff --git a/libraries/cyclestreets-core/src/main/res/values-it/arrays.xml b/libraries/cyclestreets-core/src/main/res/values-it/arrays.xml new file mode 100644 index 000000000..644fdcacb --- /dev/null +++ b/libraries/cyclestreets-core/src/main/res/values-it/arrays.xml @@ -0,0 +1,129 @@ + + + + + Chilometri + Miglia + + + km + miles + + + + Rilassata 10mph (16km/h) + Regolare 12mph (20km/h) + Veloce 15mph (24km/h) + + + 16 + 20 + 24 + + + + Tranquillo + Bilanciato + Veloce + Corto + + + quietest + balanced + fastest + shortest + + + + Ridimensiona sempre a 640 pixel di larghezza + Dimensioni massime se WiFi, 3.5G o 4G disponibili + Dimensioni massime + + + 640px + bigIfWifi + big + + + + 15 m + 20 m + 25 m + 30 m + 35 m + 40 m + 45 m + 50 m + 55 m + 60 m + 65 m + 70 m + 75 m + 80 m + 85 m + 90 m + 95 m + 100 m + 105 m + 110 m + 115 m + 120 m + 125 m + 130 m + 135 m + 140 m + 145 m + 150 m + 155 m + 160 m + 165 m + 170 m + 175 m + 180 m + 185 m + 190 m + 195 m + 200 m + + + 15 + 20 + 25 + 30 + 35 + 40 + 45 + 50 + 55 + 60 + 65 + 70 + 75 + 80 + 85 + 90 + 95 + 100 + 105 + 110 + 115 + 120 + 125 + 130 + 135 + 140 + 145 + 150 + 155 + 160 + 165 + 170 + 175 + 180 + 185 + 190 + 195 + 200 + + + diff --git a/libraries/cyclestreets-core/src/main/res/values-it/strings.xml b/libraries/cyclestreets-core/src/main/res/values-it/strings.xml new file mode 100644 index 000000000..a346bf816 --- /dev/null +++ b/libraries/cyclestreets-core/src/main/res/values-it/strings.xml @@ -0,0 +1,19 @@ + + + + Mostra notifiche blog + + Grazie per averci inviato la tua opinione. Ti risponderemo appena la leggeremo. + La tua opinione non è stata inviata.\n\n + + Il tuo account è stato registrato.\n\nAbbiamo inviato una email all\'indirizzo che ci hai fornito.\n\nQuando riceverai la mail, segui le istruzioni contenute al suo interno per completare la registrazione. + Il tuo account non è stato creato.\n\n + + Connessione con CycleStreets riuscita. + "Errore : " + Login in CycleStreets non riuscito. Controlla l\'username e la password. + + Upload della foto completato con successo. + C\'è stato un problema con l\'upload della tua foto: \n + + diff --git a/libraries/cyclestreets-fragments/src/main/res/values-it/strings.xml b/libraries/cyclestreets-fragments/src/main/res/values-it/strings.xml new file mode 100644 index 000000000..d4363e0bc --- /dev/null +++ b/libraries/cyclestreets-fragments/src/main/res/values-it/strings.xml @@ -0,0 +1,72 @@ + + + + Apri menù di navigazione + Chiudi menù di navigazione + CycleStreets + Impostazioni + Blog + Cerca percorso + Aggiungi destinazione + News dal blog di CycleStreets + Blog news + Punto di partenza + Tappa %d + Creare un nuovo tragitto? + + + Calcola percorso + Apri percorso per numero + Cerca luogo + Impostazioni + Apri + Rinomina + Modifica + Elimina + + Itinerario + + + Cerca + Scegli Luogo + + + Inizia LiveRide + Termina LiveRide + Nuova Destinazione + Hello blank fragment + + Aggiungi una nuova località usando il pulsante qui sopra.\nTocca e tieni premuto su una località nella lista per modificarla o cancellarla. + + CO₂ evitata: + Calorie: + Tempo: + Itinerario numero: + + Frutta + percorso + + net.cyclestreets + + Nome del luogo o indirizzo + + Strada + 00m00 + 0m + (0km) + Le indicazioni svolta per svolta saranno mostrate\nqui dopo che il percorso sarà calcolato. + + Piazza il puntatore sulla mappa e dai un nome al luogo. + Nome del luogo : + Numero percorso + + "Percorso " + Dettagli + %1$s percorso, %2$s + Chi Siamo + Dislivello + direzione + Percorsi salvati + Punto di arrivo + + diff --git a/libraries/cyclestreets-track/src/main/res/values-it/strings.xml b/libraries/cyclestreets-track/src/main/res/values-it/strings.xml new file mode 100644 index 000000000..4bb2a8d16 --- /dev/null +++ b/libraries/cyclestreets-track/src/main/res/values-it/strings.xml @@ -0,0 +1,54 @@ + + + + Velocità Attuale: + Durata Spostamento: + Distanza: + Arrivo + + info tragitto + scopo dello spostamento + + Registrazione terminata. Scegli il motivo dello spostamento: + Lavoro + Scuola + Per Lavoro + Allenamento + Sociale + Shopping + Commenti sul tuo spostamento + Età: + Genere: + + + Livello di + ciclismo + esperienza: + + Invia + Scarta + Spostamento scartato. + Devi selezionare lo scopo dello spostamento prima di inviare! Scegli tra le motivazioni qui sopra. + Scuola: questo spostamento in bici è stato effettuato principalmente per andare o tornare da scuola o dall'università.]]> + Per Lavoro: questo spostamento in bici è stato effettuato principalmente per andare o tornare da una attività legata alla propria occupazione .]]> + Allenamento:questo spostamento in bici è stato effettuato principalmente per allenarsi o per fare semplicemente un giro in bici.]]> + Sociale: questo spostamento in bici è stato effettuato principalmente per andare o tornare da una attività sociale, per esempio la casa di un amico, il parco, un ristorante, il cinema.]]> + Shopping: questo spostamento in bici è stato effettuato principalmente per compare o portare a casa oggetti o la spesa.]]> + Passeggiata: questo spostamento in bici è stato effettuato principalmente per motivi personali come andare in banca, dal dottore, in palestra, ecc.]]> + Altro: se nessuna delle altre motivazioni rispecchia questo spostamento, puoi inserire un commento qui sotto per dirci di più.]]> + Seleziona + Seleziona il tuo sesso + uomo + donna + preferisco non dirlo + Seleziona il livello di esperienza + saltuario + principiante + %1$1.1f miglia, %2$d minuti. %3$s + ora di partenza + Passeggiata + Altro + esperto + Lavoro: questo sportamento in bici è stato effettuato principalmente per spostarsi tra casa e il luogo di lavoro.]]> + + diff --git a/libraries/cyclestreets-view/src/main/res/values-it/strings.xml b/libraries/cyclestreets-view/src/main/res/values-it/strings.xml new file mode 100644 index 000000000..6b754b447 --- /dev/null +++ b/libraries/cyclestreets-view/src/main/res/values-it/strings.xml @@ -0,0 +1,106 @@ + + + + CycleStreets + + Indietro + Prossimo + Salva + Cancella + Chiudi + Indietro + Ricomincia + Carica! + Il tuo nome + Il tuo indirizzo email + + Mostra località + Segui la localizzazione + + Tipo percorso + Ottenendo il percorso da CycleStreets.net, attendere + Richiamando il percorso da CycleStreets.net, attendere + Ricerca del percorso fallita + Percorso in caricamento, attendee + + Cambia tipo percorso + Percorso inverso + Condividi queto percorso + Commenta percorso + Ricalcola come più veloce + Ricalcola come bilanciato + Ricalcola come più tranquillo + Ricalcola come più corto + Ricalcola dalla posizione attuale + + Posizione momentaneamente non disponibile. + + Carica rapporto di problemi di cliclismo o buone prassi. + Questi verranno usati per permetterci di segnalare problemi a chi di competenza. + Scatta una foto + Seleziona una foto esistente + Descrivi questa foto + E\' un problema o una buona prassi? + Che tipo di funzionalità ti stiamo mostrando? + Impossibile caricare le categorie photomap. Controllare la connessione. + Quando è stata scattata questa foto? + Condividi questa foto + Rapporto in caricamento, attendere + Impossibile caricare foto. Controlla la tua connessione. + Carica un\'altra foto + + Continua senza foto + Dove è la località descritta nel rapporto? + + Questo pacchetto mappe non può essere usato con questa versione dell\'app. \n\nVuoi cercare un aggiornamento? + + Menu + Posizione Attuale + Seleziona posizione + Posizione non trovata + Ricerca della posizione + Contatti + Nessuno dei tui contatti ha un indirizzo + Contatti in caricamento + Rimuovi + Posizioni Salvate + + Punti di interesse + categoria + + Non hai nessuna mappa installata. Mappe vettoriale per l\'uso\n\t offline sono disponibili come download separati..\n\t \n\nVuoi cercare i pacchetti mappe ora? + Accesso effettuato su CycleStreets + Registrazione account in attesa di verifica + + I tuoi commenti + Inviando opinione sul percorso a CycleStreets.net + + Per caricare le foto devi avere un account CycleStreets. + Creare un account è gratis. + Crea un nuovo account + Esegui l\'accesso con un account esistente + Password desiderata + Registrati + Registrati con CycleStreets.net + + Inserisci il tuo username e password per effettuare l\'accesso. + Hai già effettuato l\'accesso come\n%1$s, %2$s + Username + Password + Cancella dati salvati + Accedi + Accedi a CycleStreets.net + + La password e la password di conferma non corrispondono. + Hai già creato un account. Controlla il tuo indirizzo email per l\'attivazione. + La registrazione è gratuita e gli utenti registrati possono caricare foto. Per iniziare la procedura di iscrizione inserisci i tuoi dati nel modulo di seguito. + Sei sicuro di voler cancellare i dati del tuo account? + Conferma password + Nome utente desiderato + L\'indirizzo email inserito non è corretto. + Il nome utente deve essere lungo almeno cinque lettere/numeri + Disattiva Posizionamento + Non abbiamo potuto geolocalizzare la foto. Per localizzare le foto in automatico, attiva la geolocalizzazione nelle impostazioni della tua fotocamera. + Il tuo rapporto + + diff --git a/libraries/cyclestreets-view/src/main/res/values-pt/strings.xml b/libraries/cyclestreets-view/src/main/res/values-pt/strings.xml index fb5f960b9..1eb30c711 100644 --- a/libraries/cyclestreets-view/src/main/res/values-pt/strings.xml +++ b/libraries/cyclestreets-view/src/main/res/values-pt/strings.xml @@ -61,7 +61,6 @@ Escolher localização Localização não encontrada Procurando por localização - Cntatos Nenhum de seus contatos tem endereço. Carregando contatos. Remover @@ -102,5 +101,6 @@ Tem certeza que deseja limpar os dados salvos? Você já tem uma conta registrada. Favor verificar sua caixa de emails para um email de confimação. O cadastro é gratúito, e usuários registrados podem adicionar fotos. Para iniciar um cadastro digite seus dados no formulário abaixo. + Contatos From 4722d3e152b36712b1ae29de229da75f4ae633ba Mon Sep 17 00:00:00 2001 From: Laura Date: Mon, 31 Oct 2016 09:28:37 +0100 Subject: [PATCH 052/326] Added array and missed value --- .../src/main/res/values-es/strings.xml | 1 + .../src/main/res/values/arrays.xml | 129 ++++++++++++++++++ 2 files changed, 130 insertions(+) create mode 100644 libraries/cyclestreets-core/src/main/res/values/arrays.xml diff --git a/libraries/cyclestreets-core/src/main/res/values-es/strings.xml b/libraries/cyclestreets-core/src/main/res/values-es/strings.xml index e8ac0dcc3..d9d03d07e 100644 --- a/libraries/cyclestreets-core/src/main/res/values-es/strings.xml +++ b/libraries/cyclestreets-core/src/main/res/values-es/strings.xml @@ -6,6 +6,7 @@ Gracias por enviarnos tu opinión. Nos pondremos en contacto cuando lo hayamos comprobado. Tu opinión no puede enviarse.\n\n + Tu cuenta no puede registrarse.\n\n Tu cuenta se ha registrado.\n\n Un email se ha enviado a tu cuenta. \n\n Cuando el email llegue, siguie las instrucciones que contiene y contiene para completar el registro.\n\n Te has registrado con éxito en CycleStreets. diff --git a/libraries/cyclestreets-core/src/main/res/values/arrays.xml b/libraries/cyclestreets-core/src/main/res/values/arrays.xml new file mode 100644 index 000000000..bd3d4f5fe --- /dev/null +++ b/libraries/cyclestreets-core/src/main/res/values/arrays.xml @@ -0,0 +1,129 @@ + + + + + Kilometres + Miles + + + km + miles + + + + Unhurried 10mph (16km/h) + Cruising 12mph (20km/h) + Quick 15mph (24km/h) + + + 16 + 20 + 24 + + + + Quietest + Balanced + Fastest + Shortest + + + quietest + balanced + fastest + shortest + + + + Always resize to 640 pixels wide + Full size when WiFi, 3.5G or 4G available + Full size + + + 640px + bigIfWifi + big + + + + 15 m + 20 m + 25 m + 30 m + 35 m + 40 m + 45 m + 50 m + 55 m + 60 m + 65 m + 70 m + 75 m + 80 m + 85 m + 90 m + 95 m + 100 m + 105 m + 110 m + 115 m + 120 m + 125 m + 130 m + 135 m + 140 m + 145 m + 150 m + 155 m + 160 m + 165 m + 170 m + 175 m + 180 m + 185 m + 190 m + 195 m + 200 m + + + 15 + 20 + 25 + 30 + 35 + 40 + 45 + 50 + 55 + 60 + 65 + 70 + 75 + 80 + 85 + 90 + 95 + 100 + 105 + 110 + 115 + 120 + 125 + 130 + 135 + 140 + 145 + 150 + 155 + 160 + 165 + 170 + 175 + 180 + 185 + 190 + 195 + 200 + + + From 32f0147a5a968b7a10f3ba84ad6b623135c9a9d6 Mon Sep 17 00:00:00 2001 From: Laura Date: Mon, 31 Oct 2016 09:34:23 +0100 Subject: [PATCH 053/326] Delete non translated files --- .../main/res/values-es/colors_apptheme.xml | 4 - .../main/res/values-es/dimens_apptheme.xml | 4 - .../main/res/values-es/styles_apptheme.xml | 89 ------------------- .../main/res/values-es/themes_apptheme.xml | 40 --------- .../src/main/res/values-es/colors.xml | 4 - .../src/main/res/values-es/dimens.xml | 12 --- .../src/main/res/values-es/styles.xml | 21 ----- 7 files changed, 174 deletions(-) delete mode 100755 cyclestreets.vNext/src/main/res/values-es/colors_apptheme.xml delete mode 100755 cyclestreets.vNext/src/main/res/values-es/dimens_apptheme.xml delete mode 100755 cyclestreets.vNext/src/main/res/values-es/styles_apptheme.xml delete mode 100755 cyclestreets.vNext/src/main/res/values-es/themes_apptheme.xml delete mode 100755 libraries/cyclestreets-fragments/src/main/res/values-es/colors.xml delete mode 100644 libraries/cyclestreets-fragments/src/main/res/values-es/dimens.xml delete mode 100644 libraries/cyclestreets-fragments/src/main/res/values-es/styles.xml diff --git a/cyclestreets.vNext/src/main/res/values-es/colors_apptheme.xml b/cyclestreets.vNext/src/main/res/values-es/colors_apptheme.xml deleted file mode 100755 index febda29ca..000000000 --- a/cyclestreets.vNext/src/main/res/values-es/colors_apptheme.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - #009800 - diff --git a/cyclestreets.vNext/src/main/res/values-es/dimens_apptheme.xml b/cyclestreets.vNext/src/main/res/values-es/dimens_apptheme.xml deleted file mode 100755 index 5a0fa8d05..000000000 --- a/cyclestreets.vNext/src/main/res/values-es/dimens_apptheme.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - 48dp - \ No newline at end of file diff --git a/cyclestreets.vNext/src/main/res/values-es/styles_apptheme.xml b/cyclestreets.vNext/src/main/res/values-es/styles_apptheme.xml deleted file mode 100755 index b9970cdd8..000000000 --- a/cyclestreets.vNext/src/main/res/values-es/styles_apptheme.xml +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/cyclestreets.vNext/src/main/res/values-es/themes_apptheme.xml b/cyclestreets.vNext/src/main/res/values-es/themes_apptheme.xml deleted file mode 100755 index 0e8f4d961..000000000 --- a/cyclestreets.vNext/src/main/res/values-es/themes_apptheme.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/libraries/cyclestreets-fragments/src/main/res/values-es/colors.xml b/libraries/cyclestreets-fragments/src/main/res/values-es/colors.xml deleted file mode 100755 index 2624fa272..000000000 --- a/libraries/cyclestreets-fragments/src/main/res/values-es/colors.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - #0000ff - diff --git a/libraries/cyclestreets-fragments/src/main/res/values-es/dimens.xml b/libraries/cyclestreets-fragments/src/main/res/values-es/dimens.xml deleted file mode 100644 index 3d6e299df..000000000 --- a/libraries/cyclestreets-fragments/src/main/res/values-es/dimens.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - 632.0dip - 598.0dip - 632.0dip - 598.0dip - - - 320dp - - diff --git a/libraries/cyclestreets-fragments/src/main/res/values-es/styles.xml b/libraries/cyclestreets-fragments/src/main/res/values-es/styles.xml deleted file mode 100644 index 9b634e6f7..000000000 --- a/libraries/cyclestreets-fragments/src/main/res/values-es/styles.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - \ No newline at end of file From 17c1b51b26cdb5d7397fd96987ca10dbd820a6bc Mon Sep 17 00:00:00 2001 From: Laura Date: Mon, 31 Oct 2016 10:52:48 +0100 Subject: [PATCH 054/326] Move undone --- .../src/main/res/{values-es => values}/styles.xml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename libraries/cyclestreets-view/src/main/res/{values-es => values}/styles.xml (100%) diff --git a/libraries/cyclestreets-view/src/main/res/values-es/styles.xml b/libraries/cyclestreets-view/src/main/res/values/styles.xml similarity index 100% rename from libraries/cyclestreets-view/src/main/res/values-es/styles.xml rename to libraries/cyclestreets-view/src/main/res/values/styles.xml From 109ddad0eadb0034560ed0d326da79fcbc6e4b9c Mon Sep 17 00:00:00 2001 From: Laura Date: Mon, 31 Oct 2016 10:54:47 +0100 Subject: [PATCH 055/326] Remove transteable false --- .../src/main/res/values-es/arrays.xml | 106 +----------------- 1 file changed, 4 insertions(+), 102 deletions(-) diff --git a/libraries/cyclestreets-core/src/main/res/values-es/arrays.xml b/libraries/cyclestreets-core/src/main/res/values-es/arrays.xml index b24539cd8..ab2539c5c 100644 --- a/libraries/cyclestreets-core/src/main/res/values-es/arrays.xml +++ b/libraries/cyclestreets-core/src/main/res/values-es/arrays.xml @@ -5,21 +5,14 @@ Kilometros Millas - - km - miles - + Lento 10mph (16km/h) Paseo 12mph (20km/h) Rápido 15mph (24km/h) - - 16 - 20 - 24 - + Lento @@ -27,103 +20,12 @@ Rápido Corto - - quietest - balanced - fastest - shortest - - + Siempre redimensiona a 640 pixels de ancho Resolución completa cuando se esté conectado a WiFi, 3.5G or 4G Resolución completa - - 640px - bigIfWifi - big - - - - 15 m - 20 m - 25 m - 30 m - 35 m - 40 m - 45 m - 50 m - 55 m - 60 m - 65 m - 70 m - 75 m - 80 m - 85 m - 90 m - 95 m - 100 m - 105 m - 110 m - 115 m - 120 m - 125 m - 130 m - 135 m - 140 m - 145 m - 150 m - 155 m - 160 m - 165 m - 170 m - 175 m - 180 m - 185 m - 190 m - 195 m - 200 m - - - 15 - 20 - 25 - 30 - 35 - 40 - 45 - 50 - 55 - 60 - 65 - 70 - 75 - 80 - 85 - 90 - 95 - 100 - 105 - 110 - 115 - 120 - 125 - 130 - 135 - 140 - 145 - 150 - 155 - 160 - 165 - 170 - 175 - 180 - 185 - 190 - 195 - 200 - + From c30164f1aa2dd5de717bba2c5bc243aab7b79f91 Mon Sep 17 00:00:00 2001 From: Laura Date: Mon, 31 Oct 2016 10:56:04 +0100 Subject: [PATCH 056/326] Remove transteable false p2 --- libraries/cyclestreets-view/src/main/res/values-es/strings.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/cyclestreets-view/src/main/res/values-es/strings.xml b/libraries/cyclestreets-view/src/main/res/values-es/strings.xml index f4231a87a..21af32e2d 100644 --- a/libraries/cyclestreets-view/src/main/res/values-es/strings.xml +++ b/libraries/cyclestreets-view/src/main/res/values-es/strings.xml @@ -3,7 +3,6 @@ CycleStreets - " " Atrás Siguiente Guardar From ffff1c8996dfe595e7b297396d356105ff39a303 Mon Sep 17 00:00:00 2001 From: Laura Date: Mon, 31 Oct 2016 15:57:46 +0100 Subject: [PATCH 057/326] Remove wide blank --- libraries/cyclestreets-track/src/main/res/values-es/strings.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries/cyclestreets-track/src/main/res/values-es/strings.xml b/libraries/cyclestreets-track/src/main/res/values-es/strings.xml index ba1324fb0..0ce6577c4 100644 --- a/libraries/cyclestreets-track/src/main/res/values-es/strings.xml +++ b/libraries/cyclestreets-track/src/main/res/values-es/strings.xml @@ -19,7 +19,6 @@ Compra Errando Otro - " " Comentarios sobre el viaje. Edad: Género: From 9a665cb3e4ec0a4b79d05d4745423604f0820fcd Mon Sep 17 00:00:00 2001 From: "Ugave, Viney (US - Denver)" Date: Wed, 2 Nov 2016 09:31:25 -0600 Subject: [PATCH 058/326] Fixed some lint errors --- libraries/cyclestreets-track/src/main/res/values-mr/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/cyclestreets-track/src/main/res/values-mr/strings.xml b/libraries/cyclestreets-track/src/main/res/values-mr/strings.xml index 7ef50d13e..1dc403770 100644 --- a/libraries/cyclestreets-track/src/main/res/values-mr/strings.xml +++ b/libraries/cyclestreets-track/src/main/res/values-mr/strings.xml @@ -36,7 +36,7 @@ शाळा: या दुचाकी उत्तम किंवा शाळा किंवा कॉलेज मधील जाण्यासाठी प्रामुख्याने होते.]]> काम-संबंधि: या दुचाकी उत्तम किंवा आपली नोकरी व्यवसाय संबंधित बैठक, समारंभ, किंवा कार्याशी संबंधित निरोप जाऊ प्रामुख्याने होते.]]> व्यायाम: या दुचाकी ट्रिप प्रामुख्याने व्यायाम होते, किंवा दुचाकी चालविणे च्या फायद्यासाठी बाइक.]]> - सामाजिक: या दुचाकी ट्रिप उदा प्रामुख्याने किंवा सामाजिक पासून जात होते एक मित्र \ 'घरी पार्क, एक रेस्टॉरंट, चित्रपट.]]> + सामाजिक: या दुचाकी ट्रिप उदा प्रामुख्याने किंवा सामाजिक पासून जात होते एक मित्र \'घरी पार्क, एक रेस्टॉरंट, चित्रपट.]]> खरेदी: या दुचाकी ट्रिप खरेदी किंवा घरातील सामान किंवा किराणामाल आणण्यासाठी प्रामुख्याने होते.]]> निरोप: या दुचाकी ट्रिप अशा बँकिंग, एक डॉक्टर भेट, व्यायामशाळा जात, इ वैयक्तिक व्यवसाय उपस्थित प्रामुख्याने होते.]]> इतर: इतर कारणे काहीही या ट्रिप लागू असल्यास, आपण अधिक आम्हाला सांगा खाली टिप्पण्या प्रविष्ट करू शकता.]]> From 090a8ea887313742f5b3f880a1e6fc2c1a0b44be Mon Sep 17 00:00:00 2001 From: Michele Fortunato Date: Thu, 3 Nov 2016 08:33:59 +0200 Subject: [PATCH 059/326] Removed non translatable strings from it_IT --- .../src/main/res/values-it/arrays.xml | 101 ------------------ 1 file changed, 101 deletions(-) diff --git a/libraries/cyclestreets-core/src/main/res/values-it/arrays.xml b/libraries/cyclestreets-core/src/main/res/values-it/arrays.xml index 644fdcacb..d46502dbc 100644 --- a/libraries/cyclestreets-core/src/main/res/values-it/arrays.xml +++ b/libraries/cyclestreets-core/src/main/res/values-it/arrays.xml @@ -5,21 +5,12 @@ Chilometri Miglia - - km - miles - Rilassata 10mph (16km/h) Regolare 12mph (20km/h) Veloce 15mph (24km/h) - - 16 - 20 - 24 - Tranquillo @@ -27,103 +18,11 @@ Veloce Corto - - quietest - balanced - fastest - shortest - Ridimensiona sempre a 640 pixel di larghezza Dimensioni massime se WiFi, 3.5G o 4G disponibili Dimensioni massime - - 640px - bigIfWifi - big - - - - 15 m - 20 m - 25 m - 30 m - 35 m - 40 m - 45 m - 50 m - 55 m - 60 m - 65 m - 70 m - 75 m - 80 m - 85 m - 90 m - 95 m - 100 m - 105 m - 110 m - 115 m - 120 m - 125 m - 130 m - 135 m - 140 m - 145 m - 150 m - 155 m - 160 m - 165 m - 170 m - 175 m - 180 m - 185 m - 190 m - 195 m - 200 m - - - 15 - 20 - 25 - 30 - 35 - 40 - 45 - 50 - 55 - 60 - 65 - 70 - 75 - 80 - 85 - 90 - 95 - 100 - 105 - 110 - 115 - 120 - 125 - 130 - 135 - 140 - 145 - 150 - 155 - 160 - 165 - 170 - 175 - 180 - 185 - 190 - 195 - 200 - From 2063f60eb0635d8fecd29b3d148dab3a165db984 Mon Sep 17 00:00:00 2001 From: Michele Fortunato Date: Sat, 5 Nov 2016 09:18:58 +0200 Subject: [PATCH 060/326] Fix escape --- libraries/cyclestreets-track/src/main/res/values-it/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/cyclestreets-track/src/main/res/values-it/strings.xml b/libraries/cyclestreets-track/src/main/res/values-it/strings.xml index 4bb2a8d16..3aa15b99e 100644 --- a/libraries/cyclestreets-track/src/main/res/values-it/strings.xml +++ b/libraries/cyclestreets-track/src/main/res/values-it/strings.xml @@ -29,7 +29,7 @@ Scarta Spostamento scartato. Devi selezionare lo scopo dello spostamento prima di inviare! Scegli tra le motivazioni qui sopra. - Scuola: questo spostamento in bici è stato effettuato principalmente per andare o tornare da scuola o dall'università.]]> + Scuola: questo spostamento in bici è stato effettuato principalmente per andare o tornare da scuola o dall\'università.]]> Per Lavoro: questo spostamento in bici è stato effettuato principalmente per andare o tornare da una attività legata alla propria occupazione .]]> Allenamento:questo spostamento in bici è stato effettuato principalmente per allenarsi o per fare semplicemente un giro in bici.]]> Sociale: questo spostamento in bici è stato effettuato principalmente per andare o tornare da una attività sociale, per esempio la casa di un amico, il parco, un ristorante, il cinema.]]> From c5991e0deb2e61605bb22a4dd442530bf3a0063b Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Wed, 23 Nov 2016 08:17:08 +0000 Subject: [PATCH 061/326] Fix outstanding issues with French translation --- .../src/main/res/values-fr/strings.xml | 6 +- .../src/main/res/values-fr/arrays.xml | 101 ------------------ .../src/main/res/values-fr/strings.xml | 10 +- .../src/main/res/values-fr/strings.xml | 6 +- .../src/main/res/values-fr/strings.xml | 23 ++-- .../src/main/res/values-fr/strings.xml | 57 +++++----- 6 files changed, 50 insertions(+), 153 deletions(-) diff --git a/cyclestreets.vNext/src/main/res/values-fr/strings.xml b/cyclestreets.vNext/src/main/res/values-fr/strings.xml index f5e380c40..b0be40663 100644 --- a/cyclestreets.vNext/src/main/res/values-fr/strings.xml +++ b/cyclestreets.vNext/src/main/res/values-fr/strings.xml @@ -10,11 +10,11 @@ Blog Blog - À jour - Erreur inattendue, s'il vous plaît envoyer un rapport … + Erreur inattendue, s\'il vous plaît envoyer un rapport … CycleStreets a planté … - S'il vous plaît cliquez ici pour aider à résoudre le problème. + S\'il vous plaît cliquez ici pour aider à résoudre le problème. CycleStreets a planté - Une erreur inattendue se forçant l'application de s'arrêter. S'il vous plaît aidez-nous à résoudre ce problème en nous envoyant les données d'erreur, tout ce que vous avez à faire est de cliquer sur \'OK\'. + Une erreur inattendue se forçant l\'application de s\'arrêter. S\'il vous plaît aidez-nous à résoudre ce problème en nous envoyant les données d\'erreur, tout ce que vous avez à faire est de cliquer sur \'OK\'. Vous pouvez ajouter vos commentaires sur le problème ci-dessous: Je vous remercie ! diff --git a/libraries/cyclestreets-core/src/main/res/values-fr/arrays.xml b/libraries/cyclestreets-core/src/main/res/values-fr/arrays.xml index a6e68da16..5762bfae3 100644 --- a/libraries/cyclestreets-core/src/main/res/values-fr/arrays.xml +++ b/libraries/cyclestreets-core/src/main/res/values-fr/arrays.xml @@ -5,21 +5,12 @@ kilomètres Miles - - km - miles - Sans hâte 10mph (16km/h) Croisière 12mph (20km/h) Rapide 15mph (24km/h) - - 16 - 20 - 24 - Quietest @@ -27,103 +18,11 @@ Le plus rapide Shortest - - quietest - Équilibré - Le plus rapide - shortest - Redimensionner toujours à 640 pixels de large Taille réelle quand le WiFi, 3.5G ou 4G disponible Taille réelle - - 640px - bigIfWifi - big - - - - 15 m - 20 m - 25 m - 30 m - 35 m - 40 m - 45 m - 50 m - 55 m - 60 m - 65 m - 70 m - 75 m - 80 m - 85 m - 90 m - 95 m - 100 m - 105 m - 110 m - 115 m - 120 m - 125 m - 130 m - 135 m - 140 m - 145 m - 150 m - 155 m - 160 m - 165 m - 170 m - 175 m - 180 m - 185 m - 190 m - 195 m - 200 m - - - 15 - 20 - 25 - 30 - 35 - 40 - 45 - 50 - 55 - 60 - 65 - 70 - 75 - 80 - 85 - 90 - 95 - 100 - 105 - 110 - 115 - 120 - 125 - 130 - 135 - 140 - 145 - 150 - 155 - 160 - 165 - 170 - 175 - 180 - 185 - 190 - 195 - 200 - diff --git a/libraries/cyclestreets-core/src/main/res/values-fr/strings.xml b/libraries/cyclestreets-core/src/main/res/values-fr/strings.xml index 93d936c49..19cda49d5 100644 --- a/libraries/cyclestreets-core/src/main/res/values-fr/strings.xml +++ b/libraries/cyclestreets-core/src/main/res/values-fr/strings.xml @@ -3,15 +3,15 @@ Afficher les notifications de mise à jour du Blog - Merci d'avoir envoyé ce feedback. Nous reviendrons vers vous quand nous l'aurons vérifié. - Votre feedback n'a pas pu être envoyé.\n\n + Merci d\'avoir envoyé ce feedback. Nous reviendrons vers vous quand nous l\'aurons vérifié. + Votre feedback n\'a pas pu être envoyé.\n\n - Votre compte a été enregistré.\n\nUn e-mail a été envoyé à l'adresse que vous avez donné.\n\nLorsque l'e-mail arrive, suivez les instructions qu'il contient pour terminer l'enregistrement. - Votre compte n'a pas pu être enregistré.\n\n + Votre compte a été enregistré.\n\nUn e-mail a été envoyé à l\'adresse que vous avez donné.\n\nLorsque l\'e-mail arrive, suivez les instructions qu\'il contient pour terminer l\'enregistrement. + Votre compte n\'a pas pu être enregistré.\n\n vous vous êtes connecté avec succès sur CycleStreets. Erreur : - Impossible de se connecter à CycleStreets. S'il vous plaît vérifier votre nom d'utilisateur et mot de passe. + Impossible de se connecter à CycleStreets. S\'il vous plaît vérifier votre nom d\'utilisateur et mot de passe. Votre photo a été chargé avec succès. Il y avait un problème de chargement de votre photo: \n diff --git a/libraries/cyclestreets-fragments/src/main/res/values-fr/strings.xml b/libraries/cyclestreets-fragments/src/main/res/values-fr/strings.xml index 129244f75..b868fe842 100644 --- a/libraries/cyclestreets-fragments/src/main/res/values-fr/strings.xml +++ b/libraries/cyclestreets-fragments/src/main/res/values-fr/strings.xml @@ -52,16 +52,16 @@ net.cyclestreets - Placez le nom ou l'adresse + Placez le nom ou l\'adresse direction Rue 00m00 0m (0km) - virage par virage les informations sur l'itinéraire seront affichées\nici une fois qu'un itinéraire est programmé. + virage par virage les informations sur l\'itinéraire seront affichées\nici une fois qu\'un itinéraire est programmé. - Placez la marque sur la carte et puis nommez l'emplacement. + Placez la marque sur la carte et puis nommez l\'emplacement. Nom de la localisation : Numéro de route diff --git a/libraries/cyclestreets-track/src/main/res/values-fr/strings.xml b/libraries/cyclestreets-track/src/main/res/values-fr/strings.xml index 9c874be94..4e01ace65 100644 --- a/libraries/cyclestreets-track/src/main/res/values-fr/strings.xml +++ b/libraries/cyclestreets-track/src/main/res/values-fr/strings.xml @@ -10,16 +10,15 @@ Heure de départ but du voyage - Terminé l'enregistrement. Choisissez un but du voyage: + Terminé l\'enregistrement. Choisissez un but du voyage: Commuer École - Liée à l'emploi + Liée à l\'emploi Exercice Social Achats Course Autre - " " Commentaires à propos de votre voyage Âge: Le genre: @@ -33,20 +32,20 @@ Annuler Trajet Annulé. Vous devez sélectionner un motif de déplacement avant de soumettre! Choisissez parmi les objectifs ci-dessus. - Commuer: ce voyage à vélo était surtout d'obtenir entre le domicile et votre lieu de travail principal.]]> - School: ce voyage à vélo est surtout d'aller ou de l'école ou collège.]]> - Liée à l'emploi: ce voyage à vélo est principalement pour aller à ou d'une réunion d'affaires, fonction ou mission liée au travail.]]> - Exercice: ce voyage de vélo est principalement pour l'exercice, ou faire du vélo pour le plaisir de faire du vélo.]]> - Social: ce voyage à vélo était principalement pour aller vers ou à partir d'une activité sociale, par exemple à un ami(e)s, maison, le parc, un restaurant, cinéma.]]> - Shopping: ce voyage à vélo est principalement pour acheter ou pour apporter des marchandises à la maison ou l'épicerie.]]> + Commuer: ce voyage à vélo était surtout d\'obtenir entre le domicile et votre lieu de travail principal.]]> + School: ce voyage à vélo est surtout d\'aller ou de l\'école ou collège.]]> + Liée à l\'emploi: ce voyage à vélo est principalement pour aller à ou d\'une réunion d\'affaires, fonction ou mission liée au travail.]]> + Exercice: ce voyage de vélo est principalement pour l\'exercice, ou faire du vélo pour le plaisir de faire du vélo.]]> + Social: ce voyage à vélo était principalement pour aller vers ou à partir d\'une activité sociale, par exemple à un ami(e)s, maison, le parc, un restaurant, cinéma.]]> + Shopping: ce voyage à vélo est principalement pour acheter ou pour apporter des marchandises à la maison ou l\'épicerie.]]> Course: ce voyage à vélo est principalement pour assister à des affaires personnelles telles que la banque, une visite chez le médecin, aller à la gym, etc.]]> Autre: si aucune des autres raisons appliquée à ce voyage, vous pouvez entrer des commentaires ci-dessous pour nous en dire plus.]]> - S'il vous plaît sélectionnez - PS'il vous plaît sélectionner le sexe + S\'il vous plaît sélectionnez + S\'il vous plaît sélectionner le sexe mâle femelle je préfère ne rien dire - S'il vous plaît sélectionner le niveau d'expérience + S\'il vous plaît sélectionner le niveau d\'expérience expérimenté peu fréquent débutant diff --git a/libraries/cyclestreets-view/src/main/res/values-fr/strings.xml b/libraries/cyclestreets-view/src/main/res/values-fr/strings.xml index 0e1adae17..eaf0f2213 100644 --- a/libraries/cyclestreets-view/src/main/res/values-fr/strings.xml +++ b/libraries/cyclestreets-view/src/main/res/values-fr/strings.xml @@ -3,7 +3,6 @@ CycleStreets - " " Arrière Prochain Sauvegarder @@ -15,17 +14,17 @@ Votre nom Votre adresse e-mail - Voir l'emplacement - Suivez l'emplacement + Voir l\'emplacement + Suivez l\'emplacement Emplacement Off - Type d'itinéraire - Obtenir itinéraire de CycleStreets.net, s'il vous plaît patienter - Récupération itinéraire de CycleStreets.net, s'il vous plaît patienter - Le recherche de l'itinéraire a échoué - Chargement de la route, s'il vous plaît patienter + Type d\'itinéraire + Obtenir itinéraire de CycleStreets.net, s\'il vous plaît patienter + Récupération itinéraire de CycleStreets.net, s\'il vous plaît patienter + Le recherche de l\'itinéraire a échoué + Chargement de la route, s\'il vous plaît patienter - Changer le type d'itinéraire + Changer le type d\'itinéraire Acheminées en sens inverse Partager cet itinéraire Donnez votre avis sur cet itinéraire @@ -33,7 +32,7 @@ Replanifier comme équilibrée Replanifier comme le plus silencieux Replanifier comme la plus courte - Réacheminez de l'emplacement actuel + Réacheminez de l\'emplacement actuel Emplacement pas disponible actuellement. @@ -44,66 +43,66 @@ Décrire cette photo Est-ce un problème ou une bonne pratique? Quel type de fonction est affiché? - Impossible de charger photo carte catégories. S'il vous plaît vérifier la connexion réseau. + Impossible de charger photo carte catégories. S\'il vous plaît vérifier la connexion réseau. Où a été prise cette photo? - La photo n'a pas pu être géolocalisé. Pour localiser automatiquement les photos, s'il vous plaît tourner sur la géolocalisation dans les paramètres de l'appareil photo. + La photo n\'a pas pu être géolocalisé. Pour localiser automatiquement les photos, s\'il vous plaît tourner sur la géolocalisation dans les paramètres de l\'appareil photo. Partager cette photo - Transfert rapport, s'il vous plaît patienter - Impossible de télécharger la photo. S'il vous plaît vérifier votre connexion réseau. + Transfert rapport, s\'il vous plaît patienter + Impossible de télécharger la photo. S\'il vous plaît vérifier votre connexion réseau. Ajouter une autre Continuer sans photo Votre rapport - Où est l'emplacement de votre rapport décrit? + Où est l\'emplacement de votre rapport décrit? - Ce pack de cartes est ne peut pas être utilisé avec cette version de l'application. \n\nVoulez-vous rechercher une mise à jour? + Ce pack de cartes est ne peut pas être utilisé avec cette version de l\'application. \n\nVoulez-vous rechercher une mise à jour? Menu Localisation actuelle - Choisissez l'emplacement + Choisissez l\'emplacement Aucun lieu trouvé - Recherche d'emplacement + Recherche d\'emplacement Contacts Aucun de vos contacts ont des adresses. Chargement des contacts Retirer Adresses enregistrées - Points d'interêts + Points d\'interêts Catégorie - Vous n'avez pas de carte packs installés. + Vous n\'avez pas de carte packs installés. Vector maps pour utilisation hors ligne sont disponibles en tant que téléchargements séparés. \n\nVoulez-vous rechercher packs de cartes maintenant? Enregistrement pour CycleStreets - L'enregistrement du compte en attente de vérification + L\'enregistrement du compte en attente de vérification Vos commentaires Envoi des commentaires de route vers CycleStreets.net Pour télécharger des photos, vous devez avoir un compte CycleStreets connecté. - L'inscription à un compte est gratuite. + L\'inscription à un compte est gratuite. Inscrivez-vous pour avoir un compte Se connecter avec un compte existant - Nom d'utilisateur souhaité + Nom d\'utilisateur souhaité Mot de passe souhaité Confirmez le mot de passe Registre Enregistrement avec CycleStreets.net - S'il vous plaît entrer votre nom d'utilisateur et mot de passe pour vous connecter. + S\'il vous plaît entrer votre nom d\'utilisateur et mot de passe pour vous connecter. Vous êtes déjà connecté en tant que\n%1$s, %2$s - Nom d'utilisateur + Nom d\'utilisateur Mot de passe détails clairs stockés Se connecter Connexion à CycleStreets.net - L'adresse e-mail indiquée n'est pas une adresse correctte. + L\'adresse e-mail indiquée n\'est pas une adresse correctte. Mot de passe et mot de passe de confirmation ne correspondent pas. - Nom d'utilisateur doit être au moins cinq lettres/chiffres à long. + Nom d\'utilisateur doit être au moins cinq lettres/chiffres à long. Êtes-vous sûr de vouloir effacer les détails stockées du compte? - Vous avez déjà enregistré un compte. S'il vous plaît vérifier votre e-mail pour le message de vérification. - L'inscription est gratuite et les utilisateurs enregistrés peuvent ajouter des photos. Pour démarrer le processus d'inscription s'il vous plaît entrer vos coordonnées dans le formulaire ci-dessous. + Vous avez déjà enregistré un compte. S\'il vous plaît vérifier votre e-mail pour le message de vérification. + L\'inscription est gratuite et les utilisateurs enregistrés peuvent ajouter des photos. Pour démarrer le processus d\'inscription s\'il vous plaît entrer vos coordonnées dans le formulaire ci-dessous. From e53cb272e5c0f0bec477dd6184cbc7e82b680693 Mon Sep 17 00:00:00 2001 From: aybuke Date: Fri, 28 Oct 2016 10:06:01 +0300 Subject: [PATCH 062/326] Added localization for Turkish #171 --- .../src/main/res/values-tr/strings.xml | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 cyclestreets.vNext/src/main/res/values-tr/strings.xml diff --git a/cyclestreets.vNext/src/main/res/values-tr/strings.xml b/cyclestreets.vNext/src/main/res/values-tr/strings.xml new file mode 100644 index 000000000..06e826116 --- /dev/null +++ b/cyclestreets.vNext/src/main/res/values-tr/strings.xml @@ -0,0 +1,21 @@ + + + + CycleStreets + Yolculuk Planlayıcısı + Yol Klavuzu + Yükselti + Fotoharita + Fotoğraf Ekle + Blog + Blog - güncellenmiş + + Beklenmeyen hata, lütfen rapor gönderin… + CycleStreets çöktü… + Sorunun düzelmesine yardımcı olmak için lütfen tıklayınız. + CycleStreets çöktü + Uygulamayı zorlayarak durdurmak için beklenmedik bir hata oluştu. Hata verisini bize göndererek lütfen düzeltmemize yardım edin, tüm yapmanız gereken \'Tamam\' butonuna tıklamak. + Aşağıdaki sorun hakkında yorumlarınızı ekleyebilirsiniz: + Teşekkürler ! + + From fd84142e0f4330b0271f7e052c774c5ca9dee6e9 Mon Sep 17 00:00:00 2001 From: aybuke Date: Tue, 1 Nov 2016 15:07:16 +0300 Subject: [PATCH 063/326] Added localization for Turkish #171 --- .../src/main/res/values-tr/arrays.xml | 129 ++++++++++++++++++ .../src/main/res/values-tr/strings.xml | 20 +++ .../src/main/res/values-tr/strings.xml | 72 ++++++++++ .../src/main/res/values-tr/strings.xml | 55 ++++++++ .../src/main/res/values-tr/strings.xml | 107 +++++++++++++++ 5 files changed, 383 insertions(+) create mode 100644 libraries/cyclestreets-core/src/main/res/values-tr/arrays.xml create mode 100644 libraries/cyclestreets-core/src/main/res/values-tr/strings.xml create mode 100644 libraries/cyclestreets-fragments/src/main/res/values-tr/strings.xml create mode 100644 libraries/cyclestreets-track/src/main/res/values-tr/strings.xml create mode 100644 libraries/cyclestreets-view/src/main/res/values-tr/strings.xml diff --git a/libraries/cyclestreets-core/src/main/res/values-tr/arrays.xml b/libraries/cyclestreets-core/src/main/res/values-tr/arrays.xml new file mode 100644 index 000000000..d4af5848b --- /dev/null +++ b/libraries/cyclestreets-core/src/main/res/values-tr/arrays.xml @@ -0,0 +1,129 @@ + + + + + Kilometre + Mil + + + km + mil + + + + 10mph (16km/h) Sakin + 12mph (20km/h) Sabit Hız + 15mph (24km/h) Hız + + + 16 + 20 + 24 + + + + En sessiz + Dengeli + En hızlı + En kısa + + + en sessiz + dengeli + en hızlı + en kısa + + + + Her zaman 640 pixel genişliğe boyutlandır + WiFi, 3.5G ya da 4G iken tam boyut + Tam boyut + + + 640px + bigIfWifi + büyük + + + + 15 m + 20 m + 25 m + 30 m + 35 m + 40 m + 45 m + 50 m + 55 m + 60 m + 65 m + 70 m + 75 m + 80 m + 85 m + 90 m + 95 m + 100 m + 105 m + 110 m + 115 m + 120 m + 125 m + 130 m + 135 m + 140 m + 145 m + 150 m + 155 m + 160 m + 165 m + 170 m + 175 m + 180 m + 185 m + 190 m + 195 m + 200 m + + + 15 + 20 + 25 + 30 + 35 + 40 + 45 + 50 + 55 + 60 + 65 + 70 + 75 + 80 + 85 + 90 + 95 + 100 + 105 + 110 + 115 + 120 + 125 + 130 + 135 + 140 + 145 + 150 + 155 + 160 + 165 + 170 + 175 + 180 + 185 + 190 + 195 + 200 + + + diff --git a/libraries/cyclestreets-core/src/main/res/values-tr/strings.xml b/libraries/cyclestreets-core/src/main/res/values-tr/strings.xml new file mode 100644 index 000000000..1ae207d96 --- /dev/null +++ b/libraries/cyclestreets-core/src/main/res/values-tr/strings.xml @@ -0,0 +1,20 @@ + + + + Blog güncelleme bildirimlerini göster + + Geri dönüşünüzü yayınladığınız için teşekkürler. Kontrol ettikten sonra geri dönüş yapacağız. + Geri dönüşünüz gönderilemedi.\n\n + + Hesabınız kaydedildi.\n\nAn email has been sent to the address you gave.\n\n + E-posta geldiğinde, bu kaydı tamamlamak için içerdiği yönergeleri izleyin. + Your account could not be registered.\n\n + + CycleStreets'e başarıyla giriş yapıldı. + Hata : + CycleStreets'e giriş yapılamadı. Lütfen kullanıcı adı ve parolanızı kontrol ediniz.. + + Fotoğrafınız başarıyla yüklendi. + Fotoğrafınız yüklenirken bir problem oluştu: \n + + diff --git a/libraries/cyclestreets-fragments/src/main/res/values-tr/strings.xml b/libraries/cyclestreets-fragments/src/main/res/values-tr/strings.xml new file mode 100644 index 000000000..ee41ef257 --- /dev/null +++ b/libraries/cyclestreets-fragments/src/main/res/values-tr/strings.xml @@ -0,0 +1,72 @@ + + + + Rota çiziciyi aç + Rota çiziciyi kapat + CycleStreets + Ayarlar + Hakkında + Blog + Güzergah bul + Ara nokta ekle + CycleStreets blogu güncelle + Blog update + İşaretçi başlat + İşaretçi bitir + Ara nokta %d + Yeni güzergaha başla? + + + Güzergahı planla + Güzergahları kaydet + Güzergah numarasına göre aç + Yer bul + Ayarlar + + İsim değiştir + Düzenle + Sil + + İzlenecek Yol + Yükselti + + + Bul + Yer Seç + + + LiveRide Başlangıç + LiveRide Sonu + Yeni Konum + Merhaba boş bölüm + + Yukarıdaki düğmeyi kullanarak yeni konumlar ekle. \n Düzenlemek veya silmek için listedeki bir konuma dokunun ve basılı tutun. + + CO₂ birikimi: + Kalori: + Zaman: + Seyahat numarası: + + Meyve + güzergah + + net.cyclestreets + + Yer adı ya da adresi + + yön + Cadde + 00m00 + 0m + (0km) + Turn-by-turn güzergah bilgileri planlanırken bir kez gösterilecek. + + Harita üzerinde ve daha sonra işareti koyun ve konumu adlandırın. + Konum adı : + Güzergah numarası + + Güzergah + Detaylar + %1$s güzergah, %2$s + + diff --git a/libraries/cyclestreets-track/src/main/res/values-tr/strings.xml b/libraries/cyclestreets-track/src/main/res/values-tr/strings.xml new file mode 100644 index 000000000..2f5fe83c7 --- /dev/null +++ b/libraries/cyclestreets-track/src/main/res/values-tr/strings.xml @@ -0,0 +1,55 @@ + + + + Şuanki hız: + Seyahat zamanı: + Kat edilen yol: + Bitiş + + seyahat bilgisi + zamanı başlat + seyahat amacı + + Kaydı bitir. Seyahat amacını seçiniz: + ev iş arası gidip gelmek + Okul + İş ile ilgili + Egzersiz + Sosyal + Alışveriş + Günlük işler + Diğer + " " + Seyahatiniz hakkında yorun giriniz + Yaş: + Cinsiyet: + + + Seviye + bisiklete binme + deneyim: + + Yayınla + İptal et + Seyahat iptla edildi. + Yayınlamadan önce seyahat amacınızı seçmelisiniz! Yukarıdan seyahat amacınızı seçiniz. + Commute: this bike trip was primarily to get between home and your main workplace.]]> + School: this bike trip was primarily to go to or from school or college.]]> + Work-Related: this bike trip was primarily to go to or from a business related meeting, function, or work-related errand for your job.]]> + Exercise: this bike trip was primarily for exercise, or biking for the sake of biking.]]> + Social: this bike trip was primarily for going to or from a social activity, e.g. at a friend\'s house, the park, a restaurant, the movies.]]> + Shopping: this bike trip was primarily to purchase or bring home goods or groceries.]]> + Errand: this bike trip was primarily to attend to personal business such as banking, a doctor visit, going to the gym, etc.]]> + Other: if none of the other reasons applied to this trip, you can enter comments below to tell us more.]]> + Lütfen seçiniz + Lütfen cinsiyetinizi seçiniz + erkek + kadın + birşey söylememeyi tercih ediyorum + Lütfen deneyim seviyenizi seçiniz + deneyimli + nadir + başlangıç + %2$d dakikada, %1$1.1f mil. %3$s + + diff --git a/libraries/cyclestreets-view/src/main/res/values-tr/strings.xml b/libraries/cyclestreets-view/src/main/res/values-tr/strings.xml new file mode 100644 index 000000000..3a5cb2a24 --- /dev/null +++ b/libraries/cyclestreets-view/src/main/res/values-tr/strings.xml @@ -0,0 +1,107 @@ + + + + CycleStreets + + " " + Geri + İleri + Kaydet + İptal Et + Kapat + Geri + Yeniden başla + Yükle! + Adınız + Email adresiniz + + Konumu göster + Konumu Takip Et + Konum Kapalı + + Güzergah Tipi + Güzergah, CycleStreets.net'ten temin ediliyor, lütfen bekleyiniz + Güzergah, CycleStreets.net'ten çekiliyor, lütfen bekleyiniz + Güzergah bulunamadı + Güzergah yükleniyor, lütfen bekleyiniz + + Güzergah tipini değiştir + Güzergahı ters çevir + Güzergahı paylaş + Güzergaha yorum bırak + En hızlı olacak şekilde yeniden planla + Dengeli olacak şekilde yeniden planla + En sakin olacak şekilde yeniden planla + En kısa olacak şekilde yeniden planla + Şimdiki konumdan yeniden yönlendir + + Location not currently available. + + Upload reports of cycling-related problems or of good practice. + These will be used so that we can report problems to decision makers. + Take a photo + Select existing photo + Describe this photo + Is this a problem or good practice? + What type of feature is being shown? + Could not load photomap categories. Please check network connection. + Where was this photo taken? + The photo could not be geolocated. To automatically locate photos, please turn on geolocation in your Camera settings. + Fotoğrafı paylaş + Rapor yükleniyor, lütfen bekleyin + Fotoğraf yüklenemedi. Lütfen internet bağlantınızı kontrol edin. + Diğerini yükleyin + + Fotoğrafsız devam et + Raporunuz + Where is the location your report describes? + + This map pack is cannot be used with this version of the app. \n\nWould you like to search for an update? + + Menu + Şimdiki konum + Konum seçin + Konum bulunamadı + Konum aranıyor + Kişiler + Hiçbir kişinin adresi bulunamadı. + Kişiler yükleniyor + Kaldır + Konumları kaydet + + İlgili noktalar + kategori + + Yüklü herhangi bir harita paketi yok. Çevrimdışı kullanım için vektör haritaları ayrı yüklemeler olarak mevcuttur. \n\nŞimdi harita paketlerini aramak ister misiniz? + CycleStreets için Giriş + Hesap kaydı doğrulama bekliyor + + Yorumlarınız + CycleStreets.net için rota geri bildirimi gönderin + + Fotoğraf eklemek için CycleStreets'e giriş yapmış olmalısınız. + Registering for an account is free. + Hesap için kayıl olun + Varolan hesabınızla giriş yapın + Kullanıcı Adı Gerekli + Parola Gerekli + Parola doğrula + Kayıt + CycleStreets.net ile kayıt ol + + Giriş yapmak için lütfen kullanıcı adı ve parolanızı giriniz. + \n%1$s ile zaten giriş yapmışsınız, %2$s + Kullanıcı adı + Parola + Kayıtlı detayları temizle + Giriş yap + CycleStreets.net'e giriş yap + + Girilen e-posta adresi düzgün şekilde biçimlendirilmiş bir adres değil. + Parola ve doğrulama parolası eşleşmedi. + Adınız en az 5 karakter sayı/harf içermeli. + Kayıtlı hesap detaylarını silmek istediğine emin misin? + Zaten kayıtlı hesabınız mevcut. Lütfen email doğrulamanızı kontrol edin. + Kayıt ücretsizdir ve kayıtlı kullanıcılar fotoğraf ekleyebilirsiniz. Kayıt işlemi aşağıdaki forma bilgilerinizi girin başlatın. + + From 7c4153602d7e65d5d0f453fc98631b4b17437cc2 Mon Sep 17 00:00:00 2001 From: aybuke Date: Tue, 1 Nov 2016 15:31:32 +0300 Subject: [PATCH 064/326] Added localization for Turkish #171 --- .../src/main/res/values-tr/strings.xml | 2 +- .../src/main/res/values-tr/strings.xml | 2 +- .../src/main/res/values-tr/strings.xml | 30 +++++++++---------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/libraries/cyclestreets-core/src/main/res/values-tr/strings.xml b/libraries/cyclestreets-core/src/main/res/values-tr/strings.xml index 1ae207d96..5aae0d498 100644 --- a/libraries/cyclestreets-core/src/main/res/values-tr/strings.xml +++ b/libraries/cyclestreets-core/src/main/res/values-tr/strings.xml @@ -12,7 +12,7 @@ CycleStreets'e başarıyla giriş yapıldı. Hata : - CycleStreets'e giriş yapılamadı. Lütfen kullanıcı adı ve parolanızı kontrol ediniz.. + CycleStreets'e giriş yapılamadı. Lütfen kullanıcı adı ve parolanızı kontrol ediniz. Fotoğrafınız başarıyla yüklendi. Fotoğrafınız yüklenirken bir problem oluştu: \n diff --git a/libraries/cyclestreets-track/src/main/res/values-tr/strings.xml b/libraries/cyclestreets-track/src/main/res/values-tr/strings.xml index 2f5fe83c7..e9043d9b1 100644 --- a/libraries/cyclestreets-track/src/main/res/values-tr/strings.xml +++ b/libraries/cyclestreets-track/src/main/res/values-tr/strings.xml @@ -31,7 +31,7 @@ Yayınla İptal et - Seyahat iptla edildi. + Seyahat iptal edildi. Yayınlamadan önce seyahat amacınızı seçmelisiniz! Yukarıdan seyahat amacınızı seçiniz. Commute: this bike trip was primarily to get between home and your main workplace.]]> School: this bike trip was primarily to go to or from school or college.]]> diff --git a/libraries/cyclestreets-view/src/main/res/values-tr/strings.xml b/libraries/cyclestreets-view/src/main/res/values-tr/strings.xml index 3a5cb2a24..f92dd61ee 100644 --- a/libraries/cyclestreets-view/src/main/res/values-tr/strings.xml +++ b/libraries/cyclestreets-view/src/main/res/values-tr/strings.xml @@ -35,18 +35,18 @@ En kısa olacak şekilde yeniden planla Şimdiki konumdan yeniden yönlendir - Location not currently available. - - Upload reports of cycling-related problems or of good practice. - These will be used so that we can report problems to decision makers. - Take a photo - Select existing photo - Describe this photo - Is this a problem or good practice? - What type of feature is being shown? - Could not load photomap categories. Please check network connection. - Where was this photo taken? - The photo could not be geolocated. To automatically locate photos, please turn on geolocation in your Camera settings. + Konum mevcut durumda uygun değil. + + Bisikletle ilgili sorunları veya iyi yöntem raporlarını yükleyin. + Bunlar kullanılacak, bu yüzden karar vericiler için sorunları bildirebiliriz. + Fotoğraf çek + Varolan fotoğrafı seç + Fotoğrafı tanımla + Bu bir sorun ya da iyi bir yöntem mi? + Özelliğin hangi tipi gösteriliyor? + Fotoğraf haritası kategorileri yüklenemedi. İnternet bağlantısını kontrol edin. + Fotoğraf nerede çekildi? + Fotoğrafın coğrafi konumu elde edilemedi. Fotoğrafları otomatik olarak bulmak için, lütfen kamera ayarlarında coğrafi konum açın. Fotoğrafı paylaş Rapor yükleniyor, lütfen bekleyin Fotoğraf yüklenemedi. Lütfen internet bağlantınızı kontrol edin. @@ -54,9 +54,9 @@ Fotoğrafsız devam et Raporunuz - Where is the location your report describes? + Neredeki konumda raporu taımladın? - This map pack is cannot be used with this version of the app. \n\nWould you like to search for an update? + Bu harita paketi uygulamasının bu sürümü kullanılamaz.\n\nBir güncelleme aramak ister misiniz? Menu Şimdiki konum @@ -80,7 +80,7 @@ CycleStreets.net için rota geri bildirimi gönderin Fotoğraf eklemek için CycleStreets'e giriş yapmış olmalısınız. - Registering for an account is free. + Bu hesap için kayıt ücretsizdir. Hesap için kayıl olun Varolan hesabınızla giriş yapın Kullanıcı Adı Gerekli From 895aa85ebe12d339c619a89efec247877fb9ed40 Mon Sep 17 00:00:00 2001 From: aybuke Date: Mon, 7 Nov 2016 14:04:49 +0300 Subject: [PATCH 065/326] Added localization for Turkish #171 --- .../src/main/res/values-tr/arrays.xml | 12 ++++++------ .../src/main/res/values-tr/strings.xml | 3 +-- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/libraries/cyclestreets-core/src/main/res/values-tr/arrays.xml b/libraries/cyclestreets-core/src/main/res/values-tr/arrays.xml index d4af5848b..e4048de6f 100644 --- a/libraries/cyclestreets-core/src/main/res/values-tr/arrays.xml +++ b/libraries/cyclestreets-core/src/main/res/values-tr/arrays.xml @@ -5,7 +5,7 @@ Kilometre Mil - + km mil @@ -15,7 +15,7 @@ 12mph (20km/h) Sabit Hız 15mph (24km/h) Hız - + 16 20 24 @@ -27,7 +27,7 @@ En hızlı En kısa - + en sessiz dengeli en hızlı @@ -39,13 +39,13 @@ WiFi, 3.5G ya da 4G iken tam boyut Tam boyut - + 640px bigIfWifi büyük - + 15 m 20 m 25 m @@ -85,7 +85,7 @@ 195 m 200 m - + 15 20 25 diff --git a/libraries/cyclestreets-view/src/main/res/values-tr/strings.xml b/libraries/cyclestreets-view/src/main/res/values-tr/strings.xml index f92dd61ee..c5b6fbd0f 100644 --- a/libraries/cyclestreets-view/src/main/res/values-tr/strings.xml +++ b/libraries/cyclestreets-view/src/main/res/values-tr/strings.xml @@ -2,8 +2,7 @@ CycleStreets - - " " + " " Geri İleri Kaydet From 500a4f5a04bb6de075c22f6ba613174663cb9005 Mon Sep 17 00:00:00 2001 From: aybuke Date: Mon, 7 Nov 2016 14:28:28 +0300 Subject: [PATCH 066/326] Added localization for Turkish #171 --- .../cyclestreets-core/src/main/res/values-tr/strings.xml | 8 ++++---- .../cyclestreets-view/src/main/res/values-tr/strings.xml | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/libraries/cyclestreets-core/src/main/res/values-tr/strings.xml b/libraries/cyclestreets-core/src/main/res/values-tr/strings.xml index 5aae0d498..79ac98661 100644 --- a/libraries/cyclestreets-core/src/main/res/values-tr/strings.xml +++ b/libraries/cyclestreets-core/src/main/res/values-tr/strings.xml @@ -6,13 +6,13 @@ Geri dönüşünüzü yayınladığınız için teşekkürler. Kontrol ettikten sonra geri dönüş yapacağız. Geri dönüşünüz gönderilemedi.\n\n - Hesabınız kaydedildi.\n\nAn email has been sent to the address you gave.\n\n + Hesabınız kaydedildi.\n\n Mail verdiğiniz adrese gönderildi.\n\n E-posta geldiğinde, bu kaydı tamamlamak için içerdiği yönergeleri izleyin. - Your account could not be registered.\n\n + Hesabınız kaydedilemedi.\n\n - CycleStreets'e başarıyla giriş yapıldı. + CycleStreets uygulamasına başarıyla giriş yapıldı. Hata : - CycleStreets'e giriş yapılamadı. Lütfen kullanıcı adı ve parolanızı kontrol ediniz. + CycleStreets uygulamasına giriş yapılamadı. Lütfen kullanıcı adı ve parolanızı kontrol ediniz. Fotoğrafınız başarıyla yüklendi. Fotoğrafınız yüklenirken bir problem oluştu: \n diff --git a/libraries/cyclestreets-view/src/main/res/values-tr/strings.xml b/libraries/cyclestreets-view/src/main/res/values-tr/strings.xml index c5b6fbd0f..74359c027 100644 --- a/libraries/cyclestreets-view/src/main/res/values-tr/strings.xml +++ b/libraries/cyclestreets-view/src/main/res/values-tr/strings.xml @@ -19,8 +19,8 @@ Konum Kapalı Güzergah Tipi - Güzergah, CycleStreets.net'ten temin ediliyor, lütfen bekleyiniz - Güzergah, CycleStreets.net'ten çekiliyor, lütfen bekleyiniz + Güzergah, CycleStreets.net adresinden temin ediliyor, lütfen bekleyiniz + Güzergah, CycleStreets.net adresinden çekiliyor, lütfen bekleyiniz Güzergah bulunamadı Güzergah yükleniyor, lütfen bekleyiniz @@ -78,7 +78,7 @@ Yorumlarınız CycleStreets.net için rota geri bildirimi gönderin - Fotoğraf eklemek için CycleStreets'e giriş yapmış olmalısınız. + Fotoğraf eklemek için CycleStreets uygulamasına giriş yapmış olmalısınız. Bu hesap için kayıt ücretsizdir. Hesap için kayıl olun Varolan hesabınızla giriş yapın @@ -94,7 +94,7 @@ Parola Kayıtlı detayları temizle Giriş yap - CycleStreets.net'e giriş yap + CycleStreets.net adresine giriş yap Girilen e-posta adresi düzgün şekilde biçimlendirilmiş bir adres değil. Parola ve doğrulama parolası eşleşmedi. From 767455546c2749a04e01eebd2ee727401336db4f Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Fri, 25 Nov 2016 12:59:42 +0000 Subject: [PATCH 067/326] Fix and tidy up Turkish language translation --- .../src/main/res/values-tr/arrays.xml | 101 ------------------ .../src/main/res/values-tr/strings.xml | 14 +-- .../src/main/res/values-tr/strings.xml | 3 +- .../src/main/res/values-tr/strings.xml | 13 ++- 4 files changed, 14 insertions(+), 117 deletions(-) diff --git a/libraries/cyclestreets-core/src/main/res/values-tr/arrays.xml b/libraries/cyclestreets-core/src/main/res/values-tr/arrays.xml index e4048de6f..48c92cb80 100644 --- a/libraries/cyclestreets-core/src/main/res/values-tr/arrays.xml +++ b/libraries/cyclestreets-core/src/main/res/values-tr/arrays.xml @@ -5,21 +5,12 @@ Kilometre Mil - - km - mil - 10mph (16km/h) Sakin 12mph (20km/h) Sabit Hız 15mph (24km/h) Hız - - 16 - 20 - 24 - En sessiz @@ -27,103 +18,11 @@ En hızlı En kısa - - en sessiz - dengeli - en hızlı - en kısa - Her zaman 640 pixel genişliğe boyutlandır WiFi, 3.5G ya da 4G iken tam boyut Tam boyut - - 640px - bigIfWifi - büyük - - - - 15 m - 20 m - 25 m - 30 m - 35 m - 40 m - 45 m - 50 m - 55 m - 60 m - 65 m - 70 m - 75 m - 80 m - 85 m - 90 m - 95 m - 100 m - 105 m - 110 m - 115 m - 120 m - 125 m - 130 m - 135 m - 140 m - 145 m - 150 m - 155 m - 160 m - 165 m - 170 m - 175 m - 180 m - 185 m - 190 m - 195 m - 200 m - - - 15 - 20 - 25 - 30 - 35 - 40 - 45 - 50 - 55 - 60 - 65 - 70 - 75 - 80 - 85 - 90 - 95 - 100 - 105 - 110 - 115 - 120 - 125 - 130 - 135 - 140 - 145 - 150 - 155 - 160 - 165 - 170 - 175 - 180 - 185 - 190 - 195 - 200 - diff --git a/libraries/cyclestreets-fragments/src/main/res/values-tr/strings.xml b/libraries/cyclestreets-fragments/src/main/res/values-tr/strings.xml index ee41ef257..2abb7b39e 100644 --- a/libraries/cyclestreets-fragments/src/main/res/values-tr/strings.xml +++ b/libraries/cyclestreets-fragments/src/main/res/values-tr/strings.xml @@ -7,7 +7,7 @@ Ayarlar Hakkında Blog - Güzergah bul + Güzergâh bul Ara nokta ekle CycleStreets blogu güncelle Blog update @@ -19,7 +19,7 @@ Güzergahı planla Güzergahları kaydet - Güzergah numarasına göre aç + Güzergâh numarasına göre aç Yer bul Ayarlar @@ -48,7 +48,7 @@ Seyahat numarası: Meyve - güzergah + güzergâh net.cyclestreets @@ -59,14 +59,14 @@ 00m00 0m (0km) - Turn-by-turn güzergah bilgileri planlanırken bir kez gösterilecek. + Turn-by-turn güzergâh bilgileri planlanırken bir kez gösterilecek. Harita üzerinde ve daha sonra işareti koyun ve konumu adlandırın. Konum adı : - Güzergah numarası + Güzergâh numarası - Güzergah + Güzergâh Detaylar - %1$s güzergah, %2$s + %1$s güzergâh, %2$s diff --git a/libraries/cyclestreets-track/src/main/res/values-tr/strings.xml b/libraries/cyclestreets-track/src/main/res/values-tr/strings.xml index e9043d9b1..4228aa9ea 100644 --- a/libraries/cyclestreets-track/src/main/res/values-tr/strings.xml +++ b/libraries/cyclestreets-track/src/main/res/values-tr/strings.xml @@ -19,7 +19,6 @@ Alışveriş Günlük işler Diğer - " " Seyahatiniz hakkında yorun giriniz Yaş: Cinsiyet: @@ -45,7 +44,7 @@ Lütfen cinsiyetinizi seçiniz erkek kadın - birşey söylememeyi tercih ediyorum + bir şey söylememeyi tercih ediyorum Lütfen deneyim seviyenizi seçiniz deneyimli nadir diff --git a/libraries/cyclestreets-view/src/main/res/values-tr/strings.xml b/libraries/cyclestreets-view/src/main/res/values-tr/strings.xml index 74359c027..c6fa4f9ca 100644 --- a/libraries/cyclestreets-view/src/main/res/values-tr/strings.xml +++ b/libraries/cyclestreets-view/src/main/res/values-tr/strings.xml @@ -2,7 +2,6 @@ CycleStreets - " " Geri İleri Kaydet @@ -18,13 +17,13 @@ Konumu Takip Et Konum Kapalı - Güzergah Tipi - Güzergah, CycleStreets.net adresinden temin ediliyor, lütfen bekleyiniz - Güzergah, CycleStreets.net adresinden çekiliyor, lütfen bekleyiniz - Güzergah bulunamadı - Güzergah yükleniyor, lütfen bekleyiniz + Güzergâh Tipi + Güzergâh, CycleStreets.net adresinden temin ediliyor, lütfen bekleyiniz + Güzergâh, CycleStreets.net adresinden çekiliyor, lütfen bekleyiniz + Güzergâh bulunamadı + Güzergâh yükleniyor, lütfen bekleyiniz - Güzergah tipini değiştir + Güzergâh tipini değiştir Güzergahı ters çevir Güzergahı paylaş Güzergaha yorum bırak From 894eef9d2d3605c2a8491c5901c91bc89b2faff3 Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Tue, 18 Apr 2017 08:07:34 +0100 Subject: [PATCH 068/326] Remove workaround for endpoints that now return valid Cache-Control headers --- .../api/client/RewriteCacheControlInterceptor.java | 10 +++------- .../cyclestreets/api/client/RetrofitApiClientTest.java | 2 ++ 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/RewriteCacheControlInterceptor.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/RewriteCacheControlInterceptor.java index 17d89b5f0..b1303f2cd 100644 --- a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/RewriteCacheControlInterceptor.java +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/api/client/RewriteCacheControlInterceptor.java @@ -13,18 +13,14 @@ * * OkHttp automatically caches according to the settings specified by the Cache-Control header in * a server response. Ideally, the server should be updated to return meaningful Cache-Control - * headers. In the absence of this change, we have to set our own in this network interceptor. - * - * A half-way solution for some endpoints may be to use the `validuntil` field in the JSON - * response, if one exists. + * headers for all cacheable endpoints. Where this can't or has yet to be done, we set our own + * in this network interceptor. */ public class RewriteCacheControlInterceptor implements Interceptor { private static final int SECONDS_PER_DAY = 86400; private final Map cacheDurationMap = new HashMap() {{ - put("/blog/feed/", 1 * SECONDS_PER_DAY); - put("/v2/photomap.categories", 7 * SECONDS_PER_DAY); - put("/v2/pois.types", 7 * SECONDS_PER_DAY); + put("/blog/feed/", 1 * SECONDS_PER_DAY); // This comes from Wordpress. }}; @Override diff --git a/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientTest.java b/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientTest.java index 34e8b91dd..9984db0ab 100644 --- a/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientTest.java +++ b/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientTest.java @@ -105,6 +105,7 @@ public void testGetPoiCategories() throws Exception { .willReturn(aResponse() .withStatus(200) .withHeader("Content-Type", "application/json") + .withHeader("Cache-Control", "public, max-age=604800") .withBodyFile("pois-types.json"))); // when @@ -393,6 +394,7 @@ public void testGetPhotomapCategories() throws Exception { .willReturn(aResponse() .withStatus(200) .withHeader("Content-Type", "application/json") + .withHeader("Cache-Control", "public, max-age=1209600") .withBodyFile("photomap-categories.json"))); // when From 50f4e3da36d3776c7a3050ab448a9ad29b9e5955 Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Wed, 24 May 2017 15:27:21 +0100 Subject: [PATCH 069/326] Do CI builds on Travis --- .travis.yml | 7 +++++++ android-keystore.enc | Bin 0 -> 1360 bytes ciPublish.sh | 6 ++++++ license.properties.enc | 2 ++ signature.asc.enc | 1 + 5 files changed, 16 insertions(+) create mode 100644 android-keystore.enc create mode 100755 ciPublish.sh create mode 100644 license.properties.enc create mode 100644 signature.asc.enc diff --git a/.travis.yml b/.travis.yml index d045db269..8d4f8e93a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,9 +19,16 @@ android: # if you need to run emulator(s) during your tests - sys-img-${ANDROID_ABI}-android-${targetSdkVersion} +before_install: + - openssl aes-256-cbc -K $encrypted_29b04bc3212e_key -iv $encrypted_29b04bc3212e_iv -in license.properties.enc -out license.properties -d + - openssl aes-256-cbc -K $encrypted_29b04bc3212e_key -iv $encrypted_29b04bc3212e_iv -in signature.asc.enc -out signature.asc -d + - openssl aes-256-cbc -K $encrypted_29b04bc3212e_key -iv $encrypted_29b04bc3212e_iv -in android-keystore.enc -out android-keystore -d + # Emulator Management: Create, Start and Wait before_script: - echo no | android create avd --force -n test -t android-${targetSdkVersion} --abi ${ANDROID_ABI} - emulator -avd test -no-audio -no-window & - android-wait-for-emulator - adb shell input keyevent 82 & + +deploy: "./ciPublish.sh" diff --git a/android-keystore.enc b/android-keystore.enc new file mode 100644 index 0000000000000000000000000000000000000000..88af11175fd714df89260c1ee146edbd1b58b146 GIT binary patch literal 1360 zcmV-W1+V(rlHu>Pn8-YAQ^u=!NSn?$$x=3EaC}d7+xsU?l@c3qLf{F|VW`MgkI^y& zR=W%=YpNj&K!ry=auZ1$b5jE>vJsDqc{<42{sTn5^c^Nl!oXHGigZ6&3T(Q^E}Z_n z-UvkF$dys&VH?v!%XJt1i9&+e*Yv=ADFGVec)@}=kOBm%CCRQyMa#66F?L_Ol!W0} z14^2NgC<<%w{qAo+f}dZu?#=$%R3fBZ*`w+j4kOn)Tc7td&XX>&*spL?j0D|L|0A( zFGhQHf_AwI;6S-_qos7Sf(XWba9ri`yBb}XF1X$P6F>f_brsC8LkDVM7&{m%2SRS$ljimb&Oij#hDaoVVTzGC17y|E=DP zkVFa4ANUFnc60#_je@s$4#>OlsNS~yEgPa$G&q?aV(H)q0nr;fLD4%oMXNn>(OP=3 zAZhdC$=W9SFc7x*tZ)qW;SpBZy8zRks;-+4QfUp5!u}LI9iQFGI6h0Bf4K3zg9mme zTVR#3uLKW!t0j``jZeUdEf*?Uju}P1dfn)i+Kr|n9cxWT|JB}XL#X$%xNOPFVLTqc^mPr$$nMqham zh%q4{ulFnEG(LD>F;;A$f%Ll7eeJeq>c02`W8kQ^$g6jE-y8^OaDL5lq@ih@30x`% z{_#~ivtbEy(>oed6j+z(#vl7}(95=M=F3=~17?4dVB1Y84KQdQ`O|BEclpUwg<_;0 zY4mdY`IZ+ciKc+ac(ArH*uFHVpqG^l@m{vIJS;~IudR2eL*?np=90Ur1$~3vWn5HA zV#}9fw*=0eV=w64L3Ev922jP-Wl7c<-sE5At?#|tRM(YBuK?-Q+0il(;|en68lAz^ z^j97P%8)76qnw)PdD!A4Mx9Q}5nEh@aA7yD3n1~3k^Fm6bZV}@L<>0$RQ{R-mWX-( zue7N!@?IrB`6!|wklydYPSN@4@nw7WcKmuER|G=5fr5N95YBPGLc3>mG- z6-Xz!b^tP=D{1Bv1J;Qi6C1{dp94%sP&z8t7fUywM224lIE7^+xlj6)O;^&{|Imav zR%1H?F^>k4B}z{}Z&G*lIz6Ti(0nG3^T@n(QZdN(*ITE}sYun-VQU5M{Ejt#`=Gd< z2#D8~Tn|fDr*!&cOF;yheRU_U@%|$g{hDFSCO7)zam0>YlwdbI(d_AJ4w9P${5<>9y_tjTgC*Q7F zGx4P9sId08uDO{Z{hh(ik(p96mk8wIgdGM~X@kZ-utHl>KqP#8mTL&6YXo?49m56v S2H_v6T)lWcb9;)&(HFQ2RH0%3 literal 0 HcmV?d00001 diff --git a/ciPublish.sh b/ciPublish.sh new file mode 100755 index 000000000..46f5d0893 --- /dev/null +++ b/ciPublish.sh @@ -0,0 +1,6 @@ +#!/bin/bash +set -ev + +if [ ${CI} = "true" ] && [ ! "${TRAVIS_PULL_REQUEST}" = "true" ]; then + echo "DUMMY STEP where we should publish the artifact we've built" +fi diff --git a/license.properties.enc b/license.properties.enc new file mode 100644 index 000000000..dc51caaf2 --- /dev/null +++ b/license.properties.enc @@ -0,0 +1,2 @@ +,V2+LjG#S +Hy Y_^xۛTkQOXD0Pcx%" \ No newline at end of file diff --git a/signature.asc.enc b/signature.asc.enc new file mode 100644 index 000000000..af2da11b9 --- /dev/null +++ b/signature.asc.enc @@ -0,0 +1 @@ +1.:dPx4’rF`}p` \_Gr)!z{O1+3,)Mc}$U@XneX]$AdH<\ rO,1[ Date: Wed, 24 May 2017 15:46:38 +0100 Subject: [PATCH 070/326] Only sign the artifact if we're doing a non-PR build --- .travis.yml | 7 ++----- ciLicense.sh | 9 +++++++++ ciPublish.sh | 3 ++- 3 files changed, 13 insertions(+), 6 deletions(-) create mode 100755 ciLicense.sh diff --git a/.travis.yml b/.travis.yml index 8d4f8e93a..8bc9897fc 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,10 +19,7 @@ android: # if you need to run emulator(s) during your tests - sys-img-${ANDROID_ABI}-android-${targetSdkVersion} -before_install: - - openssl aes-256-cbc -K $encrypted_29b04bc3212e_key -iv $encrypted_29b04bc3212e_iv -in license.properties.enc -out license.properties -d - - openssl aes-256-cbc -K $encrypted_29b04bc3212e_key -iv $encrypted_29b04bc3212e_iv -in signature.asc.enc -out signature.asc -d - - openssl aes-256-cbc -K $encrypted_29b04bc3212e_key -iv $encrypted_29b04bc3212e_iv -in android-keystore.enc -out android-keystore -d +before_install: ./ciLicense.sh # Emulator Management: Create, Start and Wait before_script: @@ -31,4 +28,4 @@ before_script: - android-wait-for-emulator - adb shell input keyevent 82 & -deploy: "./ciPublish.sh" +deploy: ./ciPublish.sh diff --git a/ciLicense.sh b/ciLicense.sh new file mode 100755 index 000000000..68a4c827e --- /dev/null +++ b/ciLicense.sh @@ -0,0 +1,9 @@ +#!/bin/bash +set -ev + +# We don't want to sign the artifact unless this is a non-PR build on master. +if [ $CI = "true" ] && [ $TRAVIS_BRANCH == "master" ] && [ ! $TRAVIS_PULL_REQUEST = "true" ]; then + openssl aes-256-cbc -K $encrypted_29b04bc3212e_key -iv $encrypted_29b04bc3212e_iv -in license.properties.enc -out license.properties -d + openssl aes-256-cbc -K $encrypted_29b04bc3212e_key -iv $encrypted_29b04bc3212e_iv -in signature.asc.enc -out signature.asc -d + openssl aes-256-cbc -K $encrypted_29b04bc3212e_key -iv $encrypted_29b04bc3212e_iv -in android-keystore.enc -out android-keystore -d +fi diff --git a/ciPublish.sh b/ciPublish.sh index 46f5d0893..ceef6e6ec 100755 --- a/ciPublish.sh +++ b/ciPublish.sh @@ -1,6 +1,7 @@ #!/bin/bash set -ev -if [ ${CI} = "true" ] && [ ! "${TRAVIS_PULL_REQUEST}" = "true" ]; then +# We don't want to publish the artifact unless this is a non-PR build on master. +if [ $CI = "true" ] && [ $TRAVIS_BRANCH == "master" ] && [ ! $TRAVIS_PULL_REQUEST = "true" ]; then echo "DUMMY STEP where we should publish the artifact we've built" fi From 78fd8dc68173f14f7f5e8ddbe62bce8c11a65c42 Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Wed, 24 May 2017 20:32:11 +0100 Subject: [PATCH 071/326] Fix bash script issues --- ciLicense.sh | 6 ++++-- ciPublish.sh | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/ciLicense.sh b/ciLicense.sh index 68a4c827e..edf425368 100755 --- a/ciLicense.sh +++ b/ciLicense.sh @@ -1,9 +1,11 @@ #!/bin/bash set -ev -# We don't want to sign the artifact unless this is a non-PR build on master. -if [ $CI = "true" ] && [ $TRAVIS_BRANCH == "master" ] && [ ! $TRAVIS_PULL_REQUEST = "true" ]; then +if [ "$CI" == "true" ] && [ "$TRAVIS_BRANCH" == "master" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then + echo "Running a non-PR build on master - set up signing info" openssl aes-256-cbc -K $encrypted_29b04bc3212e_key -iv $encrypted_29b04bc3212e_iv -in license.properties.enc -out license.properties -d openssl aes-256-cbc -K $encrypted_29b04bc3212e_key -iv $encrypted_29b04bc3212e_iv -in signature.asc.enc -out signature.asc -d openssl aes-256-cbc -K $encrypted_29b04bc3212e_key -iv $encrypted_29b04bc3212e_iv -in android-keystore.enc -out android-keystore -d +else + echo "The compiled artifact will not be signed" fi diff --git a/ciPublish.sh b/ciPublish.sh index ceef6e6ec..ca0327876 100755 --- a/ciPublish.sh +++ b/ciPublish.sh @@ -1,7 +1,9 @@ #!/bin/bash set -ev -# We don't want to publish the artifact unless this is a non-PR build on master. -if [ $CI = "true" ] && [ $TRAVIS_BRANCH == "master" ] && [ ! $TRAVIS_PULL_REQUEST = "true" ]; then +if [ "$CI" == "true" ] && [ "$TRAVIS_BRANCH" == "master" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then + echo "Running a non-PR build on master - publish artifact" echo "DUMMY STEP where we should publish the artifact we've built" +else + echo "The artifact will not be published" fi From b08faa17ce812b8f1c1de81f46d37a39494fd9a9 Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Wed, 24 May 2017 20:39:41 +0100 Subject: [PATCH 072/326] Use 'after_success' instead of 'deploy' for publish phase --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 8bc9897fc..54b10e61b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,4 +28,4 @@ before_script: - android-wait-for-emulator - adb shell input keyevent 82 & -deploy: ./ciPublish.sh +after_success: ./ciPublish.sh From 727704f4ab2ac72f0d279f209642d9245d89bd08 Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Wed, 24 May 2017 21:27:50 +0100 Subject: [PATCH 073/326] Update Gradle wrapper version to 3.5 --- gradle/wrapper/gradle-wrapper.jar | Bin 53637 -> 54783 bytes gradle/wrapper/gradle-wrapper.properties | 4 +- gradlew | 68 +++++++++++++---------- gradlew.bat | 14 ++--- 4 files changed, 46 insertions(+), 40 deletions(-) diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 05ef575b0cd0173fc735f2857ce4bd594ce4f6bd..5e156808089387a4b858ce118233bec6960bd457 100644 GIT binary patch delta 25493 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 delta 24393 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 z z-IRszpOKChM+^KeP>otK_;sKMuB%PzF!1*PK#M{-hS6D+WdoHTmO4)3cm)*0bvZ@Qx_DF1k^Q^hNayM>{sNKjNV z7_jb#P{U3+sMqk{Q{LG%3O|cgdcv6B8|Lz|2?pcDu zN>K^Q2(@&&e8C_2DfGpFRG?yX?SgR)oi)B0DC1tB=45#c<6^3R^Ftv?7xVB6t{N#L zDy)uZ&oF>NwJ0D9^zI1l`K$NOGYSA8hao>(cSd9z&T=u4PS0#-X@W9O|8ZWM0G(45 z0gAa5wQEZRL)&iinKsiL>I=TAG!P!hqq1NS^~52I0a9r@10hH8p-TaD7l4015urfr e7{G;Z_ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index dcdf329c0..e5096f0e7 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Oct 17 09:30:51 BST 2016 +#Wed May 24 21:25:48 BST 2017 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-all.zip diff --git a/gradlew b/gradlew index 9d82f7891..4453ccea3 100755 --- a/gradlew +++ b/gradlew @@ -1,4 +1,4 @@ -#!/usr/bin/env bash +#!/usr/bin/env sh ############################################################################## ## @@ -6,12 +6,30 @@ ## ############################################################################## -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" @@ -30,6 +48,7 @@ die ( ) { cygwin=false msys=false darwin=false +nonstop=false case "`uname`" in CYGWIN* ) cygwin=true @@ -40,26 +59,11 @@ case "`uname`" in MINGW* ) msys=true ;; + NONSTOP* ) + nonstop=true + ;; esac -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -85,7 +89,7 @@ location of your Java installation." fi # Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then MAX_FD_LIMIT=`ulimit -H -n` if [ $? -eq 0 ] ; then if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then @@ -150,11 +154,19 @@ if $cygwin ; then esac fi -# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules -function splitJvmOpts() { - JVM_OPTS=("$@") +# Escape application args +save ( ) { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " } -eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS -JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi -exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index aec99730b..e95643d6a 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -8,14 +8,14 @@ @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= - set DIRNAME=%~dp0 if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome @@ -46,10 +46,9 @@ echo location of your Java installation. goto fail :init -@rem Get command-line arguments, handling Windowz variants +@rem Get command-line arguments, handling Windows variants if not "%OS%" == "Windows_NT" goto win9xME_args -if "%@eval[2+2]" == "4" goto 4NT_args :win9xME_args @rem Slurp the command line arguments. @@ -60,11 +59,6 @@ set _SKIP=2 if "x%~1" == "x" goto execute set CMD_LINE_ARGS=%* -goto execute - -:4NT_args -@rem Get arguments from the 4NT Shell from JP Software -set CMD_LINE_ARGS=%$ :execute @rem Setup the command line From 464d81961a3728d3427ddc66098f2100d6becf83 Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Wed, 24 May 2017 22:02:28 +0100 Subject: [PATCH 074/326] Bump tools version to 25.0.3 --- config.properties | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/config.properties b/config.properties index cf7411436..818b87d8e 100644 --- a/config.properties +++ b/config.properties @@ -6,13 +6,8 @@ # Android 5.1 is 22 # Android 6.0 is 23 -# sdkVersion=16 - compileSdkVersion=19 -# minSdkVersion=8 minSdkVersion=14 -# targetSdkVersion=23 targetSdkVersion=19 -# toolsVersion=21.1.2 -toolsVersion=23.0.2 +toolsVersion=25.0.3 From 482772fae5729306080c3a7353ee5a4a5f429739 Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Wed, 24 May 2017 23:37:06 +0100 Subject: [PATCH 075/326] Align appcompat-v7 library to 23 as per other dependencies --- libraries/cyclestreets-fragments/build.gradle | 1 + libraries/cyclestreets-view/build.gradle | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/cyclestreets-fragments/build.gradle b/libraries/cyclestreets-fragments/build.gradle index 1a8f88341..e9fd6373f 100644 --- a/libraries/cyclestreets-fragments/build.gradle +++ b/libraries/cyclestreets-fragments/build.gradle @@ -3,4 +3,5 @@ evaluationDependsOn(':libraries:cyclestreets-view') dependencies { compile project(':libraries:cyclestreets-view') compile 'com.jjoe64:graphview:3.1.4' + compile 'com.android.support:appcompat-v7:23.4.0' } diff --git a/libraries/cyclestreets-view/build.gradle b/libraries/cyclestreets-view/build.gradle index 87dcc8500..4e1c79199 100644 --- a/libraries/cyclestreets-view/build.gradle +++ b/libraries/cyclestreets-view/build.gradle @@ -3,7 +3,6 @@ evaluationDependsOn(':libraries:cyclestreets-core') dependencies { compile project(':libraries:cyclestreets-core') compile files('libs/mapsforge-map-0.3.0-jar-with-dependencies.jar') - compile 'com.android.support:appcompat-v7:20.+' compile 'com.getpebble:pebblekit:3.1.0@aar' // In the main app project, we're already pulling in 23.x via the `acra` dependency. From e81be2d081bee69550e6db68143daf32f51c6863 Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Wed, 24 May 2017 23:38:55 +0100 Subject: [PATCH 076/326] Set compileSdkVersion to 23... We're already using v23 of appcompat etc, so we need to compile against version 23 of the SDK, as described here: https://stackoverflow.com/questions/32075498/error-retrieving-parent-for-item-no-resource-found-that-matches-the-given-name --- config.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.properties b/config.properties index 818b87d8e..598ea871d 100644 --- a/config.properties +++ b/config.properties @@ -6,7 +6,7 @@ # Android 5.1 is 22 # Android 6.0 is 23 -compileSdkVersion=19 +compileSdkVersion=23 minSdkVersion=14 targetSdkVersion=19 From 974056e89cec6900b1f08869cde84d5559361c71 Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Wed, 24 May 2017 23:42:09 +0100 Subject: [PATCH 077/326] Use latest version of Robolectric to deal with SDK 23's isCleartextTrafficPermitted() addition, as described in https://github.com/square/okhttp/issues/2591 --- libraries/cyclestreets-core/build.gradle | 2 +- .../java/net/cyclestreets/api/client/RetrofitApiClientTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/cyclestreets-core/build.gradle b/libraries/cyclestreets-core/build.gradle index 0ad2c27fb..122ac41b3 100644 --- a/libraries/cyclestreets-core/build.gradle +++ b/libraries/cyclestreets-core/build.gradle @@ -29,7 +29,7 @@ dependencies { testCompile 'junit:junit:4.12' testCompile 'org.hamcrest:hamcrest-all:1.3' testCompile 'org.mockito:mockito-core:1.10.19' - testCompile 'org.robolectric:robolectric:3.0' + testCompile 'org.robolectric:robolectric:3.3.2' testCompile 'commons-io:commons-io:2.4' } diff --git a/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientTest.java b/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientTest.java index 9984db0ab..7a771145b 100644 --- a/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientTest.java +++ b/libraries/cyclestreets-core/src/test/java/net/cyclestreets/api/client/RetrofitApiClientTest.java @@ -59,7 +59,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -@Config(manifest=Config.NONE) +@Config(manifest=Config.NONE, sdk = 23) @RunWith(RobolectricTestRunner.class) public class RetrofitApiClientTest { From 016d1d3414dc3a9b07ff25a7e890fe707a5bf81c Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Wed, 24 May 2017 23:44:20 +0100 Subject: [PATCH 078/326] Update references to private appcompat-v7 dimens that have been renamed Best-guesses. As per https://stackoverflow.com/questions/32927273/marked-as-private-warning-after-changing-colour-of-up-arrow, we really shouldn't be referencing private resources, but changing that is beyond my Android context at this point. Also updating showAsAction definitions as demanded by lint. --- .../src/main/res/layout/elevation_text.xml | 20 +++++++++---------- .../main/res/layout/itinerary_header_item.xml | 2 +- .../src/main/res/layout/itinerary_item.xml | 2 +- .../src/main/res/layout/navigation_item.xml | 2 +- .../res/menu/itinerary_and_elevation_menu.xml | 6 +++--- .../src/main/res/menu/locations.xml | 4 ++-- .../src/main/res/menu/route_map.xml | 10 +++++----- 7 files changed, 23 insertions(+), 23 deletions(-) diff --git a/libraries/cyclestreets-fragments/src/main/res/layout/elevation_text.xml b/libraries/cyclestreets-fragments/src/main/res/layout/elevation_text.xml index 3fc2c83d8..7dbf5113a 100644 --- a/libraries/cyclestreets-fragments/src/main/res/layout/elevation_text.xml +++ b/libraries/cyclestreets-fragments/src/main/res/layout/elevation_text.xml @@ -19,14 +19,14 @@ android:layout_height="wrap_content" android:layout_width="0dp" android:layout_weight="1" - android:textSize="@dimen/abc_action_bar_title_text_size" + android:textSize="@dimen/abc_text_size_title_material_toolbar" android:text="@string/elevation_route"/> \ No newline at end of file diff --git a/libraries/cyclestreets-fragments/src/main/res/layout/itinerary_header_item.xml b/libraries/cyclestreets-fragments/src/main/res/layout/itinerary_header_item.xml index f60355300..b68f41851 100644 --- a/libraries/cyclestreets-fragments/src/main/res/layout/itinerary_header_item.xml +++ b/libraries/cyclestreets-fragments/src/main/res/layout/itinerary_header_item.xml @@ -5,7 +5,7 @@ android:orientation="horizontal" android:paddingLeft="@dimen/abc_dropdownitem_text_padding_left" android:paddingRight="@dimen/abc_dropdownitem_text_padding_right" - android:paddingBottom="@dimen/abc_action_bar_subtitle_bottom_margin"> + android:paddingBottom="@dimen/abc_action_bar_subtitle_bottom_margin_material"> diff --git a/libraries/cyclestreets-fragments/src/main/res/menu/itinerary_and_elevation_menu.xml b/libraries/cyclestreets-fragments/src/main/res/menu/itinerary_and_elevation_menu.xml index 9578f7f8f..01b55f86b 100644 --- a/libraries/cyclestreets-fragments/src/main/res/menu/itinerary_and_elevation_menu.xml +++ b/libraries/cyclestreets-fragments/src/main/res/menu/itinerary_and_elevation_menu.xml @@ -1,10 +1,10 @@ + xmlns:app="http://schemas.android.com/apk/res-auto"> + app:showAsAction="ifRoom|withText"/> + app:showAsAction="ifRoom|withText"/> \ No newline at end of file diff --git a/libraries/cyclestreets-fragments/src/main/res/menu/locations.xml b/libraries/cyclestreets-fragments/src/main/res/menu/locations.xml index 6634ed4a5..dccb806a0 100644 --- a/libraries/cyclestreets-fragments/src/main/res/menu/locations.xml +++ b/libraries/cyclestreets-fragments/src/main/res/menu/locations.xml @@ -1,8 +1,8 @@ + xmlns:app="http://schemas.android.com/apk/res-auto"> + app:showAsAction="always|withText"/> \ No newline at end of file diff --git a/libraries/cyclestreets-fragments/src/main/res/menu/route_map.xml b/libraries/cyclestreets-fragments/src/main/res/menu/route_map.xml index 7591f18d5..f8550b5b3 100644 --- a/libraries/cyclestreets-fragments/src/main/res/menu/route_map.xml +++ b/libraries/cyclestreets-fragments/src/main/res/menu/route_map.xml @@ -1,20 +1,20 @@ + xmlns:app="http://schemas.android.com/apk/res-auto"> + app:showAsAction="ifRoom|withText"/> + app:showAsAction="ifRoom|withText"/> + app:showAsAction="never"/> + app:showAsAction="never"/> \ No newline at end of file From 588f25eafc447e925f39fb9de815265c52fd79ea Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Wed, 24 May 2017 23:59:06 +0100 Subject: [PATCH 079/326] Use builders for Notifications as setLatestEventInfo() is deprecated --- .../cyclestreets/track/RecordingService.java | 17 +++++++++++------ .../cyclestreets/track/TripDataUploader.java | 13 ++++++++++--- .../cyclestreets/liveride/LiveRideState.java | 15 ++++++++++++--- 3 files changed, 33 insertions(+), 12 deletions(-) diff --git a/libraries/cyclestreets-track/src/main/java/net/cyclestreets/track/RecordingService.java b/libraries/cyclestreets-track/src/main/java/net/cyclestreets/track/RecordingService.java index 693106677..8474d88ff 100644 --- a/libraries/cyclestreets-track/src/main/java/net/cyclestreets/track/RecordingService.java +++ b/libraries/cyclestreets-track/src/main/java/net/cyclestreets/track/RecordingService.java @@ -247,14 +247,19 @@ private NotificationManager nm() { return (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE); } // nm - private Notification createNotification( - final String tickerText, - final int flags) { - final Notification notification = new Notification(R.drawable.icon25, tickerText, System.currentTimeMillis()); - notification.flags = flags; + private Notification createNotification(final String tickerText, final int flags) { final Intent notificationIntent = new Intent(this, activityClass_); final PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); - notification.setLatestEventInfo(this, "Cycle Hackney - Recording", "Tap to see your ongoing trip", contentIntent); + + Notification notification = new Notification.Builder(this) + .setSmallIcon(R.drawable.icon25) + .setTicker(tickerText) + .setWhen(java.lang.System.currentTimeMillis()) + .setContentTitle("Cycle Hackney - Recording") + .setContentText("Tap to see your ongoing trip") + .setContentIntent(contentIntent) + .getNotification(); + notification.flags = flags; return notification; } // createNotification diff --git a/libraries/cyclestreets-track/src/main/java/net/cyclestreets/track/TripDataUploader.java b/libraries/cyclestreets-track/src/main/java/net/cyclestreets/track/TripDataUploader.java index 609b6fef4..bdc0bf516 100644 --- a/libraries/cyclestreets-track/src/main/java/net/cyclestreets/track/TripDataUploader.java +++ b/libraries/cyclestreets-track/src/main/java/net/cyclestreets/track/TripDataUploader.java @@ -143,11 +143,18 @@ private void showNotification(final String text, final int flags) { } private Notification createNotification(final String text, final int flags) { - final Notification notification = new Notification(R.drawable.icon25, text, java.lang.System.currentTimeMillis()); - notification.flags = flags; final Intent notificationIntent = new Intent(context_, TripDataUploader.class); final PendingIntent contentIntent = PendingIntent.getActivity(context_, 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT); - notification.setLatestEventInfo(context_.getApplicationContext(), "Cycle Hackney", text, contentIntent); + + Notification notification = new Notification.Builder(context_.getApplicationContext()) + .setSmallIcon(R.drawable.icon25) + .setTicker(text) + .setWhen(java.lang.System.currentTimeMillis()) + .setContentTitle("Cycle Hackney") + .setContentText(text) + .setContentIntent(contentIntent) + .getNotification(); + notification.flags = flags; return notification; } diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/liveride/LiveRideState.java b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/liveride/LiveRideState.java index f621aea5c..4ed112cc9 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/liveride/LiveRideState.java +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/liveride/LiveRideState.java @@ -94,11 +94,20 @@ protected void notify(final String text, final String ticker) private void notification(final String text, final String ticker) { final NotificationManager nm = nm(); - final Notification notification = new Notification(R.drawable.ic_launcher, ticker, System.currentTimeMillis()); - notification.flags = Notification.FLAG_AUTO_CANCEL | Notification.FLAG_ONGOING_EVENT; final Intent notificationIntent = new Intent(context(), LiveRideActivity.class); final PendingIntent contentIntent = PendingIntent.getActivity(context(), 0, notificationIntent, PendingIntent.FLAG_CANCEL_CURRENT); - notification.setLatestEventInfo(context(), title_, text, contentIntent); + + Notification notification = new Notification.Builder(context()) + .setSmallIcon(R.drawable.ic_launcher) + .setTicker(ticker) + .setWhen(System.currentTimeMillis()) + .setAutoCancel(true) + .setOngoing(true) + .setContentTitle(title_) + .setContentText(text) + .setContentIntent(contentIntent) + .getNotification(); + nm.notify(NOTIFICATION_ID, notification); } // notify From 46c2b1b3b353ddf87bd2a95cf1658b88fadde6ad Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Thu, 25 May 2017 15:31:06 +0100 Subject: [PATCH 080/326] Synchronise Travis build settings --- .travis.yml | 6 ++++-- config.properties | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 54b10e61b..264f9d247 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,9 +3,11 @@ jdk: - oraclejdk8 env: global: - - compileSdkVersion=19 + # Remember to keep this in sync with config.properties + - compileSdkVersion=23 + - minSdkVersion=14 - targetSdkVersion=19 - - toolsVersion=23.0.2 + - toolsVersion=25.0.3 - ANDROID_ABI=armeabi-v7a android: components: diff --git a/config.properties b/config.properties index 598ea871d..ccc1e3ea9 100644 --- a/config.properties +++ b/config.properties @@ -11,3 +11,5 @@ minSdkVersion=14 targetSdkVersion=19 toolsVersion=25.0.3 + +# Remember to keep this in sync with .travis.yml From 23e96efefcfe754bf694996441c4bd6804a4c98e Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Thu, 25 May 2017 15:52:38 +0100 Subject: [PATCH 081/326] Fix Travis decryption logic --- .gitignore | 1 + .travis.yml | 1 + android-keystore.enc | Bin 1360 -> 0 bytes ciLicense.sh | 6 +++--- cyclestreets.vNext/keystore.enc | Bin 0 -> 1376 bytes cyclestreets.vNext/license.properties.enc | 1 + cyclestreets.vNext/signature.asc.enc | Bin 0 -> 240 bytes license.properties.enc | 2 -- 8 files changed, 6 insertions(+), 5 deletions(-) delete mode 100644 android-keystore.enc create mode 100644 cyclestreets.vNext/keystore.enc create mode 100644 cyclestreets.vNext/license.properties.enc create mode 100644 cyclestreets.vNext/signature.asc.enc delete mode 100644 license.properties.enc diff --git a/.gitignore b/.gitignore index a109316ba..e05c6e305 100644 --- a/.gitignore +++ b/.gitignore @@ -11,5 +11,6 @@ license.properties .idea *~ */keystore +*/signature.asc custom-versions/* api.key diff --git a/.travis.yml b/.travis.yml index 54b10e61b..001d075ca 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,7 @@ env: - targetSdkVersion=19 - toolsVersion=23.0.2 - ANDROID_ABI=armeabi-v7a + - secure: "LipL0wPv0uQrKitaeGxCpoQsx5sl/Pg/DtQv4S7Bi52DxfArgvD2hPB0TWgkgYGJPfENHLEyqg+H+/v2nON3IXY+cnsd+TW+P1T03/52D56ieSKGVtVtSYUOZUgoyxIIvRZWFh/UNg+AmZIjOCTJDLitBTUxD8kWux8NjhIqZow=" android: components: # The SDK version used to compile your project diff --git a/android-keystore.enc b/android-keystore.enc deleted file mode 100644 index 88af11175fd714df89260c1ee146edbd1b58b146..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1360 zcmV-W1+V(rlHu>Pn8-YAQ^u=!NSn?$$x=3EaC}d7+xsU?l@c3qLf{F|VW`MgkI^y& zR=W%=YpNj&K!ry=auZ1$b5jE>vJsDqc{<42{sTn5^c^Nl!oXHGigZ6&3T(Q^E}Z_n z-UvkF$dys&VH?v!%XJt1i9&+e*Yv=ADFGVec)@}=kOBm%CCRQyMa#66F?L_Ol!W0} z14^2NgC<<%w{qAo+f}dZu?#=$%R3fBZ*`w+j4kOn)Tc7td&XX>&*spL?j0D|L|0A( zFGhQHf_AwI;6S-_qos7Sf(XWba9ri`yBb}XF1X$P6F>f_brsC8LkDVM7&{m%2SRS$ljimb&Oij#hDaoVVTzGC17y|E=DP zkVFa4ANUFnc60#_je@s$4#>OlsNS~yEgPa$G&q?aV(H)q0nr;fLD4%oMXNn>(OP=3 zAZhdC$=W9SFc7x*tZ)qW;SpBZy8zRks;-+4QfUp5!u}LI9iQFGI6h0Bf4K3zg9mme zTVR#3uLKW!t0j``jZeUdEf*?Uju}P1dfn)i+Kr|n9cxWT|JB}XL#X$%xNOPFVLTqc^mPr$$nMqham zh%q4{ulFnEG(LD>F;;A$f%Ll7eeJeq>c02`W8kQ^$g6jE-y8^OaDL5lq@ih@30x`% z{_#~ivtbEy(>oed6j+z(#vl7}(95=M=F3=~17?4dVB1Y84KQdQ`O|BEclpUwg<_;0 zY4mdY`IZ+ciKc+ac(ArH*uFHVpqG^l@m{vIJS;~IudR2eL*?np=90Ur1$~3vWn5HA zV#}9fw*=0eV=w64L3Ev922jP-Wl7c<-sE5At?#|tRM(YBuK?-Q+0il(;|en68lAz^ z^j97P%8)76qnw)PdD!A4Mx9Q}5nEh@aA7yD3n1~3k^Fm6bZV}@L<>0$RQ{R-mWX-( zue7N!@?IrB`6!|wklydYPSN@4@nw7WcKmuER|G=5fr5N95YBPGLc3>mG- z6-Xz!b^tP=D{1Bv1J;Qi6C1{dp94%sP&z8t7fUywM224lIE7^+xlj6)O;^&{|Imav zR%1H?F^>k4B}z{}Z&G*lIz6Ti(0nG3^T@n(QZdN(*ITE}sYun-VQU5M{Ejt#`=Gd< z2#D8~Tn|fDr*!&cOF;yheRU_U@%|$g{hDFSCO7)zam0>YlwdbI(d_AJ4w9P${5<>9y_tjTgC*Q7F zGx4P9sId08uDO{Z{hh(ik(p96mk8wIgdGM~X@kZ-utHl>KqP#8mTL&6YXo?49m56v S2H_v6T)lWcb9;)&(HFQ2RH0%3 diff --git a/ciLicense.sh b/ciLicense.sh index edf425368..c427a6426 100755 --- a/ciLicense.sh +++ b/ciLicense.sh @@ -3,9 +3,9 @@ set -ev if [ "$CI" == "true" ] && [ "$TRAVIS_BRANCH" == "master" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then echo "Running a non-PR build on master - set up signing info" - openssl aes-256-cbc -K $encrypted_29b04bc3212e_key -iv $encrypted_29b04bc3212e_iv -in license.properties.enc -out license.properties -d - openssl aes-256-cbc -K $encrypted_29b04bc3212e_key -iv $encrypted_29b04bc3212e_iv -in signature.asc.enc -out signature.asc -d - openssl aes-256-cbc -K $encrypted_29b04bc3212e_key -iv $encrypted_29b04bc3212e_iv -in android-keystore.enc -out android-keystore -d + openssl aes-256-cbc -k $openssl_file_encryption_key -in cyclestreets.vNext/license.properties.enc -out cyclestreets.vNext/license.properties -d + openssl aes-256-cbc -k $openssl_file_encryption_key -in cyclestreets.vNext/signature.asc.enc -out cyclestreets.vNext/signature.asc -d + openssl aes-256-cbc -k $openssl_file_encryption_key -in cyclestreets.vNext/keystore.enc -out cyclestreets.vNext/keystore -d else echo "The compiled artifact will not be signed" fi diff --git a/cyclestreets.vNext/keystore.enc b/cyclestreets.vNext/keystore.enc new file mode 100644 index 0000000000000000000000000000000000000000..c1006200c70617d077aafb6c851de8ea228f90c0 GIT binary patch literal 1376 zcmV-m1)us;VQh3|WM5yoHfhdhgyOms7;AkhAJ~>;bPRZ&r9?IY|6E4@1k(KrNCQ!P zaD#DsuwF7R57UF)ZR64tUb_8J{2b)MvfHbleKR>ZryJnnXJ*)J!sn{&#LGA0kT($c zZr+u~FCBYyn6MyQP7y;T4;W1c99-cDMr|y|SG4<1E3t?1b$*UC!_8k?hZeyfi`TD_ zH6+Ss>gF-0i ztcKVcsD9UA=e!L*&2aazoTePB2ecENdXz&M%q7&vUw zx(Qz5v6~dHO2Rc({D6>zdJJ9r#kcsg&GpEscactVwlJKaza$m;cjyxc%c67zkb=U1 zI$VB_+u14M40fCy{Y#mzL}Y;>~Pm#L8g3U^)Uo;7;7Y&x>d*kA}XrX@*4Q z7HD1dz8h>XdsT3?bNWcbm_xIzyAFx{sTuQVkosNPlV^8cTrOH`-xmh;ys{e-OTe_E z`oOH@^kIgu4wBv-RDJj^c|L`?g&QeB zFPGHbV&_0>=Ngex4i~>FY=uMnVTUoc_K-(oimLE@LR=ww(@_7~I_G4?8j^&_T@Dn-TTo>2BfW)1Nl z5m>;T>jPrNnN3uLfd};5@s?ea0PSx7Al!)JaqA2{FUk`!G_$o7*YrLD#l%ZUI*G<& zLrEQ(b-O?-fC&BWh(8kuZpEXC1I8=mV|%6>cJa1?xW<1x>}bFsMf#x>k;_0&{5okx z;qcH*iS%-&QO0m3J;p^rt881#w`6|Xw*R4Y^N1nd=_g--uxpv{Ey9`CSy=Y zBz;8Lq@CBHGp8W-{IuZo6h235U3YjtgHkH1mXArL=#AoD85Y-@FkJ15FIYoJ)dY<} z(c<2D^#+~av&-H$KPPy$C*gTZC?$@~iGFcl#2Vo>2?lo1(akfFX?zVNFKffoGU(On i+PQVgvUCn%tX9ZTvpf@s3b0fojmo2-qzoR|O>VC1_n<8R literal 0 HcmV?d00001 diff --git a/cyclestreets.vNext/license.properties.enc b/cyclestreets.vNext/license.properties.enc new file mode 100644 index 000000000..93e3fd52b --- /dev/null +++ b/cyclestreets.vNext/license.properties.enc @@ -0,0 +1 @@ +Salted__TZz)Lk@27O1נn-yihNQe=4N6dM/F(-A0K \ No newline at end of file diff --git a/cyclestreets.vNext/signature.asc.enc b/cyclestreets.vNext/signature.asc.enc new file mode 100644 index 0000000000000000000000000000000000000000..aeb944a89218ddf81976caa9433637241727a1ba GIT binary patch literal 240 zcmV1I+GzW2uooZj;Xbhm=4M9c2Gn1Zh%8k8Y!T`m^&|l#iDB&h& z5$J@!Jcguaga4eVbUU~wFYNrlckoj<@wg~_dlm>llV5>{(muqtU^5jjvS3+%$wKAy qEV@pmYrVV{R4#8+rsyz8W+h1u;qpU#Ws=fx3rQMg{(f7pb!npKx_aCI literal 0 HcmV?d00001 diff --git a/license.properties.enc b/license.properties.enc deleted file mode 100644 index dc51caaf2..000000000 --- a/license.properties.enc +++ /dev/null @@ -1,2 +0,0 @@ -,V2+LjG#S -Hy Y_^xۛTkQOXD0Pcx%" \ No newline at end of file From 161e1dc0b706f58d10fc692e2a8613d1f8e0d2bf Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Thu, 25 May 2017 15:57:12 +0100 Subject: [PATCH 082/326] Remove other undecryptable file --- signature.asc.enc | 1 - 1 file changed, 1 deletion(-) delete mode 100644 signature.asc.enc diff --git a/signature.asc.enc b/signature.asc.enc deleted file mode 100644 index af2da11b9..000000000 --- a/signature.asc.enc +++ /dev/null @@ -1 +0,0 @@ -1.:dPx4’rF`}p` \_Gr)!z{O1+3,)Mc}$U@XneX]$AdH<\ rO,1[ Date: Fri, 26 May 2017 12:03:43 +0100 Subject: [PATCH 083/326] Bump minSdkVersion --- .travis.yml | 2 +- build.gradle | 2 +- config.properties | 18 ++++++++++-------- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/.travis.yml b/.travis.yml index cd4e677bd..3617c5422 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ env: global: # Remember to keep this in sync with config.properties - compileSdkVersion=23 - - minSdkVersion=14 + - minSdkVersion=17 - targetSdkVersion=19 - toolsVersion=25.0.3 - ANDROID_ABI=armeabi-v7a diff --git a/build.gradle b/build.gradle index f89256a49..d31e37870 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.1' + classpath 'com.android.tools.build:gradle:2.3.2' } } diff --git a/config.properties b/config.properties index ccc1e3ea9..fdcebf650 100644 --- a/config.properties +++ b/config.properties @@ -1,13 +1,15 @@ -# Android 2.2 is 8 -# Android 4.0.3 is 15 -# Android 4.3.1 is 18 -# Android 4.4 is 19 -# Android 5.0 is 21 -# Android 5.1 is 22 -# Android 6.0 is 23 +# Android 7.1.1, 7.1 25 N_MR1 +# Android 7.0 24 N +# Android 6.0 23 M +# Android 5.1 22 LOLLIPOP_MR1 +# Android 5.0 21 LOLLIPOP +# Android 4.4W 20 KITKAT_WATCH +# Android 4.4 19 KITKAT +# Android 4.3 18 JELLY_BEAN_MR2 +# Android 4.2, 4.2.2 17 JELLY_BEAN_MR1 compileSdkVersion=23 -minSdkVersion=14 +minSdkVersion=17 targetSdkVersion=19 toolsVersion=25.0.3 From fb6ecd27ab7867c27814e2b398fd7bee1533ac9f Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Fri, 26 May 2017 12:18:02 +0100 Subject: [PATCH 084/326] Fix lint issue --- libraries/cyclestreets-fragments/build.gradle | 1 - libraries/cyclestreets-view/build.gradle | 1 + .../net/cyclestreets/views/PlaceAutoCompleteTextView.java | 4 ++-- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/cyclestreets-fragments/build.gradle b/libraries/cyclestreets-fragments/build.gradle index e9fd6373f..1a8f88341 100644 --- a/libraries/cyclestreets-fragments/build.gradle +++ b/libraries/cyclestreets-fragments/build.gradle @@ -3,5 +3,4 @@ evaluationDependsOn(':libraries:cyclestreets-view') dependencies { compile project(':libraries:cyclestreets-view') compile 'com.jjoe64:graphview:3.1.4' - compile 'com.android.support:appcompat-v7:23.4.0' } diff --git a/libraries/cyclestreets-view/build.gradle b/libraries/cyclestreets-view/build.gradle index 4e1c79199..412c64d63 100644 --- a/libraries/cyclestreets-view/build.gradle +++ b/libraries/cyclestreets-view/build.gradle @@ -6,6 +6,7 @@ dependencies { compile 'com.getpebble:pebblekit:3.1.0@aar' // In the main app project, we're already pulling in 23.x via the `acra` dependency. + compile 'com.android.support:appcompat-v7:23.4.0' compile 'com.android.support:support-v4:23.4.0' compile 'com.android.support:support-annotations:23.4.0' } diff --git a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/PlaceAutoCompleteTextView.java b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/PlaceAutoCompleteTextView.java index cd63a6fa2..e604ee121 100644 --- a/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/PlaceAutoCompleteTextView.java +++ b/libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/PlaceAutoCompleteTextView.java @@ -15,10 +15,10 @@ import android.view.View; import android.view.View.OnClickListener; import android.widget.AdapterView; -import android.widget.AutoCompleteTextView; +import android.support.v7.widget.AppCompatAutoCompleteTextView; import android.widget.AdapterView.OnItemClickListener; -public class PlaceAutoCompleteTextView extends AutoCompleteTextView +public class PlaceAutoCompleteTextView extends AppCompatAutoCompleteTextView implements OnClickListener, OnItemClickListener { private GeoLiveAdapter adapter_; From 4b489fbdd051b0da4c02e059477c702e8d9afeb8 Mon Sep 17 00:00:00 2001 From: Oliver Lockwood Date: Fri, 18 Aug 2017 15:28:37 +0100 Subject: [PATCH 085/326] Set up Play publishing plugin (#191) * Set up Play publishing plugin * Add encrypted PK12 API key * Use update p12 file * New Play API key * Update version numbering --- .gitignore | 1 + build.gradle | 17 +++++++++++++++++ ciLicense.sh | 1 + ciPublish.sh | 2 +- cyclestreets.vNext/play-api-key.p12.enc | Bin 0 -> 2496 bytes cyclestreets.vNext/version.properties | 4 ++-- 6 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 cyclestreets.vNext/play-api-key.p12.enc diff --git a/.gitignore b/.gitignore index e05c6e305..076aa0293 100644 --- a/.gitignore +++ b/.gitignore @@ -12,5 +12,6 @@ license.properties *~ */keystore */signature.asc +*/*.p12 custom-versions/* api.key diff --git a/build.gradle b/build.gradle index d31e37870..a5e371163 100644 --- a/build.gradle +++ b/build.gradle @@ -4,6 +4,7 @@ buildscript { } dependencies { classpath 'com.android.tools.build:gradle:2.3.2' + classpath 'com.github.triplet.gradle:play-publisher:1.2.0' } } @@ -13,6 +14,7 @@ configure(subprojects.findAll { it.path.startsWith(':custom-versions:') || return apply plugin: 'com.android.application' + apply plugin: 'com.github.triplet.play' signingKey(it) manifestProperties(it) @@ -112,6 +114,10 @@ def signingKey(project) { Properties props = loadProperties(licenseDetails) + project.play { + track = 'beta' + } + project.android { signingConfigs { release { @@ -122,6 +128,17 @@ def signingKey(project) { } } // signingConfigs + playAccountConfigs { + defaultAccountConfig { + serviceAccountEmail = 'cyclestreets-android@api-7698300952134656507-752021.iam.gserviceaccount.com' + pk12File = project.file('play-api-key.p12') + } + } + + defaultConfig { + playAccountConfig = playAccountConfigs.defaultAccountConfig + } + buildTypes { release { signingConfig signingConfigs.release diff --git a/ciLicense.sh b/ciLicense.sh index c427a6426..02060bbd8 100755 --- a/ciLicense.sh +++ b/ciLicense.sh @@ -6,6 +6,7 @@ if [ "$CI" == "true" ] && [ "$TRAVIS_BRANCH" == "master" ] && [ "$TRAVIS_PULL_RE openssl aes-256-cbc -k $openssl_file_encryption_key -in cyclestreets.vNext/license.properties.enc -out cyclestreets.vNext/license.properties -d openssl aes-256-cbc -k $openssl_file_encryption_key -in cyclestreets.vNext/signature.asc.enc -out cyclestreets.vNext/signature.asc -d openssl aes-256-cbc -k $openssl_file_encryption_key -in cyclestreets.vNext/keystore.enc -out cyclestreets.vNext/keystore -d + openssl aes-256-cbc -k $openssl_file_encryption_key -in cyclestreets.vNext/play-api-key.p12.enc -out cyclestreets.vNext/play-api-key.p12 -d else echo "The compiled artifact will not be signed" fi diff --git a/ciPublish.sh b/ciPublish.sh index ca0327876..a1e26ca53 100755 --- a/ciPublish.sh +++ b/ciPublish.sh @@ -3,7 +3,7 @@ set -ev if [ "$CI" == "true" ] && [ "$TRAVIS_BRANCH" == "master" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then echo "Running a non-PR build on master - publish artifact" - echo "DUMMY STEP where we should publish the artifact we've built" + ./gradlew publishApkRelease else echo "The artifact will not be published" fi diff --git a/cyclestreets.vNext/play-api-key.p12.enc b/cyclestreets.vNext/play-api-key.p12.enc new file mode 100644 index 0000000000000000000000000000000000000000..4f0ddd14e514d9e3aa3123de531bc10c500322c7 GIT binary patch literal 2496 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 KpKT(*Gaz2Vrs3rP literal 0 HcmV?d00001 diff --git a/cyclestreets.vNext/version.properties b/cyclestreets.vNext/version.properties index a1f73d8f6..827508ea1 100644 --- a/cyclestreets.vNext/version.properties +++ b/cyclestreets.vNext/version.properties @@ -1,3 +1,3 @@ # app version -versionCode=25 -versionName=3.5 +versionCode=26 +versionName=3.6 From 0e1bef163995d16443f2f490c1e0d9155b3979c9 Mon Sep 17 00:00:00 2001 From: Rajat Kumar Gupta Date: Sat, 10 Mar 2018 19:24:11 +0530 Subject: [PATCH 086/326] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 452f20e8e..73bf43ed3 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ CycleStreets is a UK-wide cycle journey planner system, which lets you plan routes from A to B to C by bike. It is designed by cyclists, for cyclists, and -caters for the needs of both confident and less confident cyclists. +caters to the needs of both confident and less confident cyclists. - Point-to-point tap-to-route cycle routing - Point-to-point cycle routing by address or postcode From 5ca5ed7cb200b2a681eff8c72e7a4b1454da5b52 Mon Sep 17 00:00:00 2001 From: Jez Higgins Date: Tue, 22 May 2018 15:18:06 +0100 Subject: [PATCH 087/326] Housekeeping, and start of material design work (#202) * Remove custom version references * Bump gradle plugin version * Move to native Activities and Fragments * updated * update build tools plugin * Move to 25.3.1 of the support libraries * Fixed Lint warnings * Lint fixes * s/cyclestreets.vNext/cyclestreets.app/ because vNext happened quite a long time ago now. * Removed unused PhotoUploadActivity - long been replaced with the PhotoUploadFragment * Move to Material Theme, and min Android version of 6.0. I was initially a little reluctant to do this, but looked at both the global and our own install base, and 6.0 and up make up over 60% of our install base, and that proportion is only going to increase. * Move to OsmDroid 5.6.5. The main change here is the BoundingBoxE6 is deprecated, and so no longer returned by a couple of its APIs. Turns out, BoundingBox is actually what we wanted all along to there's really no substantive change * align .travis.yml with config.properties * OsmDroid Overlay(Context) constructor is deprecated, so don't call it any more * Can pass copyright attribution into tile source, so use that * Revert to AppCompat Theme. Get ActionBar working again. * Revert to AppCompat Theme. Get ActionBar working again. * Added attribution * CycleMapView now extends RelativeLayout instead of MapView. This is so that our overlays can add additional widgets onto the map, as well as being able to draw over the top of it. * Update Gradle, build tools, and support libraries. * Converted LocationOverlay to uses a swanky Material style floating action button. Yes, we are on our way. * Request write_external_storage permission - the map rendering won't work without it * Removed redundant parameter from RouteOverlay constructor * Force redraw after a touch or tap event * CycleMapView isn't redrawing on creation, for reasons I don't understand. Pop in a little timer to force a redraw after we've resumed. * Removed on screen backbutton from TapToRoute * Another crack an proper pause/resume behaviour * Lint fixes * Replaced SettingsActivity with SettingsFragment * Rework saved locations fragment so it works properly again * Minor tidy up * Move location button to top-right rather than bottom-right. Remove location menu item * Dropped location button back down to bottom right * bump gradle/plugin/tools version * align .travis.yml with config.properties * don't sign unless we're building the main repo * Run 'android list targets' to logs which targets are available Try targeting sdk version 24 Add min and target SDK versions to Android SDK install list Tweaks because avdmanagerisnot available Get logcat output on failure Try x86 emulator Revert to using ARM emulator Fix erroneous env variables Travis, you're frustrating More faff Another attempt Further tries It's finally working; simplify Reinstate things I thought weren't needed Remove Google Play services, surely these aren't required Log ADB output on success Speed up builds a little Try running Travis in a VM instead of in a container Bring back the gradle daemon Run the build separately from connectedCheck; increase timeout for the latter Go back to container-based Travis * Update dependency scopes as per https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration?utm_source=android-studio#new_configurations * Improve documentation * Fix typo in method name * Remove unnecessary dependency which now comes transitively, and corresponding comment * remove commented out code --- .travis.yml | 82 +- build.gradle | 21 +- ciLicense.sh | 10 +- config.properties | 18 +- cyclestreets.app/build.gradle | 17 + .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 .../gradlew | 0 .../gradlew.bat | 0 .../keystore.enc | Bin .../license.properties.enc | 0 .../play-api-key.p12.enc | Bin .../signature.asc.enc | Bin .../java/net/cyclestreets/AppStartupTest.java | 0 .../src/main/AndroidManifest.xml | 0 .../src/main/assets/credits.html | 1 + .../src/main/assets/cyclestreets.jpg | Bin .../src/main/assets/donate.html | 0 .../src/main/assets/welcome.html | 0 .../src/main/assets/whatsnew.html | 0 .../java/net/cyclestreets/AboutActivity.java | 2 +- .../java/net/cyclestreets/BlogFragment.java | 0 .../java/net/cyclestreets/CycleStreets.java | 6 +- .../net/cyclestreets/CycleStreetsApp.java | 0 .../net/cyclestreets/LocationsActivity.java | 2 +- .../main/java/net/cyclestreets/Welcome.java | 0 ..._check_off_disabled_focused_holo_light.png | Bin ...heme_btn_check_off_disabled_holo_light.png | Bin ...theme_btn_check_off_focused_holo_light.png | Bin .../apptheme_btn_check_off_holo_light.png | Bin ...theme_btn_check_off_pressed_holo_light.png | Bin ...n_check_on_disabled_focused_holo_light.png | Bin ...theme_btn_check_on_disabled_holo_light.png | Bin ...ptheme_btn_check_on_focused_holo_light.png | Bin .../apptheme_btn_check_on_holo_light.png | Bin ...ptheme_btn_check_on_pressed_holo_light.png | Bin ..._default_disabled_focused_holo_light.9.png | Bin ...heme_btn_default_disabled_holo_light.9.png | Bin ...theme_btn_default_focused_holo_light.9.png | Bin ...ptheme_btn_default_normal_holo_light.9.png | Bin ...theme_btn_default_pressed_holo_light.9.png | Bin ..._radio_off_disabled_focused_holo_light.png | Bin ...heme_btn_radio_off_disabled_holo_light.png | Bin ...theme_btn_radio_off_focused_holo_light.png | Bin .../apptheme_btn_radio_off_holo_light.png | Bin ...theme_btn_radio_off_pressed_holo_light.png | Bin ...n_radio_on_disabled_focused_holo_light.png | Bin ...theme_btn_radio_on_disabled_holo_light.png | Bin ...ptheme_btn_radio_on_focused_holo_light.png | Bin .../apptheme_btn_radio_on_holo_light.png | Bin ...ptheme_btn_radio_on_pressed_holo_light.png | Bin ...ggle_off_disabled_focused_holo_light.9.png | Bin ...e_btn_toggle_off_disabled_holo_light.9.png | Bin ...me_btn_toggle_off_focused_holo_light.9.png | Bin ...eme_btn_toggle_off_normal_holo_light.9.png | Bin ...me_btn_toggle_off_pressed_holo_light.9.png | Bin ...oggle_on_disabled_focused_holo_light.9.png | Bin ...me_btn_toggle_on_disabled_holo_light.9.png | Bin ...eme_btn_toggle_on_focused_holo_light.9.png | Bin ...heme_btn_toggle_on_normal_holo_light.9.png | Bin ...eme_btn_toggle_on_pressed_holo_light.9.png | Bin ...apptheme_fastscroll_thumb_default_holo.png | Bin ...apptheme_fastscroll_thumb_pressed_holo.png | Bin .../apptheme_ic_navigation_drawer.png | Bin .../apptheme_list_activated_holo.9.png | Bin .../apptheme_list_focused_holo.9.png | Bin .../apptheme_list_longpressed_holo.9.png | Bin .../apptheme_list_pressed_holo_light.9.png | Bin ...me_list_selector_disabled_holo_light.9.png | Bin .../apptheme_progress_bg_holo_light.9.png | Bin ...apptheme_progress_primary_holo_light.9.png | Bin ...ptheme_progress_secondary_holo_light.9.png | Bin ...ptheme_progressbar_indeterminate_holo1.png | Bin ...ptheme_progressbar_indeterminate_holo2.png | Bin ...ptheme_progressbar_indeterminate_holo3.png | Bin ...ptheme_progressbar_indeterminate_holo4.png | Bin ...ptheme_progressbar_indeterminate_holo5.png | Bin ...ptheme_progressbar_indeterminate_holo6.png | Bin ...ptheme_progressbar_indeterminate_holo7.png | Bin ...ptheme_progressbar_indeterminate_holo8.png | Bin .../apptheme_spinner_default_holo_light.9.png | Bin ...apptheme_spinner_disabled_holo_light.9.png | Bin .../apptheme_spinner_focused_holo_light.9.png | Bin .../apptheme_spinner_pressed_holo_light.9.png | Bin ...ptheme_switch_bg_disabled_holo_light.9.png | Bin ...pptheme_switch_bg_focused_holo_light.9.png | Bin .../apptheme_switch_bg_holo_light.9.png | Bin ...me_switch_thumb_activated_holo_light.9.png | Bin ...eme_switch_thumb_disabled_holo_light.9.png | Bin .../apptheme_switch_thumb_holo_light.9.png | Bin ...heme_switch_thumb_pressed_holo_light.9.png | Bin .../apptheme_tab_selected_focused_holo.9.png | Bin .../apptheme_tab_selected_holo.9.png | Bin .../apptheme_tab_selected_pressed_holo.9.png | Bin ...apptheme_tab_unselected_focused_holo.9.png | Bin .../apptheme_tab_unselected_holo.9.png | Bin ...apptheme_tab_unselected_pressed_holo.9.png | Bin .../apptheme_text_select_handle_left.png | Bin .../apptheme_text_select_handle_middle.png | Bin .../apptheme_text_select_handle_right.png | Bin ...theme_textfield_activated_holo_light.9.png | Bin ...pptheme_textfield_default_holo_light.9.png | Bin ...extfield_disabled_focused_holo_light.9.png | Bin ...ptheme_textfield_disabled_holo_light.9.png | Bin ...pptheme_textfield_focused_holo_light.9.png | Bin .../main/res/drawable-hdpi/ic_launcher.png | Bin ..._check_off_disabled_focused_holo_light.png | Bin ...heme_btn_check_off_disabled_holo_light.png | Bin ...theme_btn_check_off_focused_holo_light.png | Bin .../apptheme_btn_check_off_holo_light.png | Bin ...theme_btn_check_off_pressed_holo_light.png | Bin ...n_check_on_disabled_focused_holo_light.png | Bin ...theme_btn_check_on_disabled_holo_light.png | Bin ...ptheme_btn_check_on_focused_holo_light.png | Bin .../apptheme_btn_check_on_holo_light.png | Bin ...ptheme_btn_check_on_pressed_holo_light.png | Bin ..._default_disabled_focused_holo_light.9.png | Bin ...heme_btn_default_disabled_holo_light.9.png | Bin ...theme_btn_default_focused_holo_light.9.png | Bin ...ptheme_btn_default_normal_holo_light.9.png | Bin ...theme_btn_default_pressed_holo_light.9.png | Bin ..._radio_off_disabled_focused_holo_light.png | Bin ...heme_btn_radio_off_disabled_holo_light.png | Bin ...theme_btn_radio_off_focused_holo_light.png | Bin .../apptheme_btn_radio_off_holo_light.png | Bin ...theme_btn_radio_off_pressed_holo_light.png | Bin ...n_radio_on_disabled_focused_holo_light.png | Bin ...theme_btn_radio_on_disabled_holo_light.png | Bin ...ptheme_btn_radio_on_focused_holo_light.png | Bin .../apptheme_btn_radio_on_holo_light.png | Bin ...ptheme_btn_radio_on_pressed_holo_light.png | Bin ...ggle_off_disabled_focused_holo_light.9.png | Bin ...e_btn_toggle_off_disabled_holo_light.9.png | Bin ...me_btn_toggle_off_focused_holo_light.9.png | Bin ...eme_btn_toggle_off_normal_holo_light.9.png | Bin ...me_btn_toggle_off_pressed_holo_light.9.png | Bin ...oggle_on_disabled_focused_holo_light.9.png | Bin ...me_btn_toggle_on_disabled_holo_light.9.png | Bin ...eme_btn_toggle_on_focused_holo_light.9.png | Bin ...heme_btn_toggle_on_normal_holo_light.9.png | Bin ...eme_btn_toggle_on_pressed_holo_light.9.png | Bin ...apptheme_fastscroll_thumb_default_holo.png | Bin ...apptheme_fastscroll_thumb_pressed_holo.png | Bin .../apptheme_ic_navigation_drawer.png | Bin .../apptheme_list_activated_holo.9.png | Bin .../apptheme_list_focused_holo.9.png | Bin .../apptheme_list_longpressed_holo.9.png | Bin .../apptheme_list_pressed_holo_light.9.png | Bin ...me_list_selector_disabled_holo_light.9.png | Bin .../apptheme_progress_bg_holo_light.9.png | Bin ...apptheme_progress_primary_holo_light.9.png | Bin ...ptheme_progress_secondary_holo_light.9.png | Bin ...ptheme_progressbar_indeterminate_holo1.png | Bin ...ptheme_progressbar_indeterminate_holo2.png | Bin ...ptheme_progressbar_indeterminate_holo3.png | Bin ...ptheme_progressbar_indeterminate_holo4.png | Bin ...ptheme_progressbar_indeterminate_holo5.png | Bin ...ptheme_progressbar_indeterminate_holo6.png | Bin ...ptheme_progressbar_indeterminate_holo7.png | Bin ...ptheme_progressbar_indeterminate_holo8.png | Bin .../apptheme_spinner_default_holo_light.9.png | Bin ...apptheme_spinner_disabled_holo_light.9.png | Bin .../apptheme_spinner_focused_holo_light.9.png | Bin .../apptheme_spinner_pressed_holo_light.9.png | Bin ...ptheme_switch_bg_disabled_holo_light.9.png | Bin ...pptheme_switch_bg_focused_holo_light.9.png | Bin .../apptheme_switch_bg_holo_light.9.png | Bin ...me_switch_thumb_activated_holo_light.9.png | Bin ...eme_switch_thumb_disabled_holo_light.9.png | Bin .../apptheme_switch_thumb_holo_light.9.png | Bin ...heme_switch_thumb_pressed_holo_light.9.png | Bin .../apptheme_tab_selected_focused_holo.9.png | Bin .../apptheme_tab_selected_holo.9.png | Bin .../apptheme_tab_selected_pressed_holo.9.png | Bin ...apptheme_tab_unselected_focused_holo.9.png | Bin .../apptheme_tab_unselected_holo.9.png | Bin ...apptheme_tab_unselected_pressed_holo.9.png | Bin .../apptheme_text_select_handle_left.png | Bin .../apptheme_text_select_handle_middle.png | Bin .../apptheme_text_select_handle_right.png | Bin ...theme_textfield_activated_holo_light.9.png | Bin ...pptheme_textfield_default_holo_light.9.png | Bin ...extfield_disabled_focused_holo_light.9.png | Bin ...ptheme_textfield_disabled_holo_light.9.png | Bin ...pptheme_textfield_focused_holo_light.9.png | Bin .../main/res/drawable-mdpi/ic_launcher.png | Bin ..._check_off_disabled_focused_holo_light.png | Bin ...heme_btn_check_off_disabled_holo_light.png | Bin ...theme_btn_check_off_focused_holo_light.png | Bin .../apptheme_btn_check_off_holo_light.png | Bin ...theme_btn_check_off_pressed_holo_light.png | Bin ...n_check_on_disabled_focused_holo_light.png | Bin ...theme_btn_check_on_disabled_holo_light.png | Bin ...ptheme_btn_check_on_focused_holo_light.png | Bin .../apptheme_btn_check_on_holo_light.png | Bin ...ptheme_btn_check_on_pressed_holo_light.png | Bin ..._default_disabled_focused_holo_light.9.png | Bin ...heme_btn_default_disabled_holo_light.9.png | Bin ...theme_btn_default_focused_holo_light.9.png | Bin ...ptheme_btn_default_normal_holo_light.9.png | Bin ...theme_btn_default_pressed_holo_light.9.png | Bin ..._radio_off_disabled_focused_holo_light.png | Bin ...heme_btn_radio_off_disabled_holo_light.png | Bin ...theme_btn_radio_off_focused_holo_light.png | Bin .../apptheme_btn_radio_off_holo_light.png | Bin ...theme_btn_radio_off_pressed_holo_light.png | Bin ...n_radio_on_disabled_focused_holo_light.png | Bin ...theme_btn_radio_on_disabled_holo_light.png | Bin ...ptheme_btn_radio_on_focused_holo_light.png | Bin .../apptheme_btn_radio_on_holo_light.png | Bin ...ptheme_btn_radio_on_pressed_holo_light.png | Bin ...ggle_off_disabled_focused_holo_light.9.png | Bin ...e_btn_toggle_off_disabled_holo_light.9.png | Bin ...me_btn_toggle_off_focused_holo_light.9.png | Bin ...eme_btn_toggle_off_normal_holo_light.9.png | Bin ...me_btn_toggle_off_pressed_holo_light.9.png | Bin ...oggle_on_disabled_focused_holo_light.9.png | Bin ...me_btn_toggle_on_disabled_holo_light.9.png | Bin ...eme_btn_toggle_on_focused_holo_light.9.png | Bin ...heme_btn_toggle_on_normal_holo_light.9.png | Bin ...eme_btn_toggle_on_pressed_holo_light.9.png | Bin ...apptheme_fastscroll_thumb_default_holo.png | Bin ...apptheme_fastscroll_thumb_pressed_holo.png | Bin .../apptheme_ic_navigation_drawer.png | Bin .../apptheme_list_activated_holo.9.png | Bin .../apptheme_list_focused_holo.9.png | Bin .../apptheme_list_longpressed_holo.9.png | Bin .../apptheme_list_pressed_holo_light.9.png | Bin ...me_list_selector_disabled_holo_light.9.png | Bin .../apptheme_progress_bg_holo_light.9.png | Bin ...apptheme_progress_primary_holo_light.9.png | Bin ...ptheme_progress_secondary_holo_light.9.png | Bin ...ptheme_progressbar_indeterminate_holo1.png | Bin ...ptheme_progressbar_indeterminate_holo2.png | Bin ...ptheme_progressbar_indeterminate_holo3.png | Bin ...ptheme_progressbar_indeterminate_holo4.png | Bin ...ptheme_progressbar_indeterminate_holo5.png | Bin ...ptheme_progressbar_indeterminate_holo6.png | Bin ...ptheme_progressbar_indeterminate_holo7.png | Bin ...ptheme_progressbar_indeterminate_holo8.png | Bin .../apptheme_spinner_default_holo_light.9.png | Bin ...apptheme_spinner_disabled_holo_light.9.png | Bin .../apptheme_spinner_focused_holo_light.9.png | Bin .../apptheme_spinner_pressed_holo_light.9.png | Bin ...ptheme_switch_bg_disabled_holo_light.9.png | Bin ...pptheme_switch_bg_focused_holo_light.9.png | Bin .../apptheme_switch_bg_holo_light.9.png | Bin ...me_switch_thumb_activated_holo_light.9.png | Bin ...eme_switch_thumb_disabled_holo_light.9.png | Bin .../apptheme_switch_thumb_holo_light.9.png | Bin ...heme_switch_thumb_pressed_holo_light.9.png | Bin .../apptheme_tab_selected_focused_holo.9.png | Bin .../apptheme_tab_selected_holo.9.png | Bin .../apptheme_tab_selected_pressed_holo.9.png | Bin ...apptheme_tab_unselected_focused_holo.9.png | Bin .../apptheme_tab_unselected_holo.9.png | Bin ...apptheme_tab_unselected_pressed_holo.9.png | Bin .../apptheme_text_select_handle_left.png | Bin .../apptheme_text_select_handle_middle.png | Bin .../apptheme_text_select_handle_right.png | Bin ...theme_textfield_activated_holo_light.9.png | Bin ...pptheme_textfield_default_holo_light.9.png | Bin ...extfield_disabled_focused_holo_light.9.png | Bin ...ptheme_textfield_disabled_holo_light.9.png | Bin ...pptheme_textfield_focused_holo_light.9.png | Bin .../main/res/drawable-xhdpi/ic_launcher.png | Bin ..._check_off_disabled_focused_holo_light.png | Bin ...heme_btn_check_off_disabled_holo_light.png | Bin ...theme_btn_check_off_focused_holo_light.png | Bin .../apptheme_btn_check_off_holo_light.png | Bin ...theme_btn_check_off_pressed_holo_light.png | Bin ...n_check_on_disabled_focused_holo_light.png | Bin ...theme_btn_check_on_disabled_holo_light.png | Bin ...ptheme_btn_check_on_focused_holo_light.png | Bin .../apptheme_btn_check_on_holo_light.png | Bin ...ptheme_btn_check_on_pressed_holo_light.png | Bin ..._default_disabled_focused_holo_light.9.png | Bin ...heme_btn_default_disabled_holo_light.9.png | Bin ...theme_btn_default_focused_holo_light.9.png | Bin ...ptheme_btn_default_normal_holo_light.9.png | Bin ...theme_btn_default_pressed_holo_light.9.png | Bin ..._radio_off_disabled_focused_holo_light.png | Bin ...heme_btn_radio_off_disabled_holo_light.png | Bin ...theme_btn_radio_off_focused_holo_light.png | Bin .../apptheme_btn_radio_off_holo_light.png | Bin ...theme_btn_radio_off_pressed_holo_light.png | Bin ...n_radio_on_disabled_focused_holo_light.png | Bin ...theme_btn_radio_on_disabled_holo_light.png | Bin ...ptheme_btn_radio_on_focused_holo_light.png | Bin .../apptheme_btn_radio_on_holo_light.png | Bin ...ptheme_btn_radio_on_pressed_holo_light.png | Bin ...ggle_off_disabled_focused_holo_light.9.png | Bin ...e_btn_toggle_off_disabled_holo_light.9.png | Bin ...me_btn_toggle_off_focused_holo_light.9.png | Bin ...eme_btn_toggle_off_normal_holo_light.9.png | Bin ...me_btn_toggle_off_pressed_holo_light.9.png | Bin ...oggle_on_disabled_focused_holo_light.9.png | Bin ...me_btn_toggle_on_disabled_holo_light.9.png | Bin ...eme_btn_toggle_on_focused_holo_light.9.png | Bin ...heme_btn_toggle_on_normal_holo_light.9.png | Bin ...eme_btn_toggle_on_pressed_holo_light.9.png | Bin ...apptheme_fastscroll_thumb_default_holo.png | Bin ...apptheme_fastscroll_thumb_pressed_holo.png | Bin .../apptheme_ic_navigation_drawer.png | Bin .../apptheme_list_activated_holo.9.png | Bin .../apptheme_list_focused_holo.9.png | Bin .../apptheme_list_longpressed_holo.9.png | Bin .../apptheme_list_pressed_holo_light.9.png | Bin ...me_list_selector_disabled_holo_light.9.png | Bin .../apptheme_progress_bg_holo_light.9.png | Bin ...apptheme_progress_primary_holo_light.9.png | Bin ...ptheme_progress_secondary_holo_light.9.png | Bin ...ptheme_progressbar_indeterminate_holo1.png | Bin ...ptheme_progressbar_indeterminate_holo2.png | Bin ...ptheme_progressbar_indeterminate_holo3.png | Bin ...ptheme_progressbar_indeterminate_holo4.png | Bin ...ptheme_progressbar_indeterminate_holo5.png | Bin ...ptheme_progressbar_indeterminate_holo6.png | Bin ...ptheme_progressbar_indeterminate_holo7.png | Bin ...ptheme_progressbar_indeterminate_holo8.png | Bin .../apptheme_spinner_default_holo_light.9.png | Bin ...apptheme_spinner_disabled_holo_light.9.png | Bin .../apptheme_spinner_focused_holo_light.9.png | Bin .../apptheme_spinner_pressed_holo_light.9.png | Bin ...ptheme_switch_bg_disabled_holo_light.9.png | Bin ...pptheme_switch_bg_focused_holo_light.9.png | Bin .../apptheme_switch_bg_holo_light.9.png | Bin ...me_switch_thumb_activated_holo_light.9.png | Bin ...eme_switch_thumb_disabled_holo_light.9.png | Bin .../apptheme_switch_thumb_holo_light.9.png | Bin ...heme_switch_thumb_pressed_holo_light.9.png | Bin .../apptheme_tab_selected_focused_holo.9.png | Bin .../apptheme_tab_selected_holo.9.png | Bin .../apptheme_tab_selected_pressed_holo.9.png | Bin ...apptheme_tab_unselected_focused_holo.9.png | Bin .../apptheme_tab_unselected_holo.9.png | Bin ...apptheme_tab_unselected_pressed_holo.9.png | Bin .../apptheme_text_select_handle_left.png | Bin .../apptheme_text_select_handle_middle.png | Bin .../apptheme_text_select_handle_right.png | Bin ...theme_textfield_activated_holo_light.9.png | Bin ...pptheme_textfield_default_holo_light.9.png | Bin ...extfield_disabled_focused_holo_light.9.png | Bin ...ptheme_textfield_disabled_holo_light.9.png | Bin ...pptheme_textfield_focused_holo_light.9.png | Bin .../main/res/drawable-xxhdpi/ic_launcher.png | Bin ...ptheme_activated_background_holo_light.xml | 0 .../apptheme_btn_check_holo_light.xml | 0 .../apptheme_btn_default_holo_light.xml | 0 .../apptheme_btn_radio_holo_light.xml | 0 .../apptheme_btn_toggle_holo_light.xml | 0 .../apptheme_edit_text_holo_light.xml | 0 .../apptheme_fastscroll_thumb_holo.xml | 0 .../apptheme_item_background_holo_light.xml | 0 ...ector_background_transition_holo_light.xml | 0 .../apptheme_list_selector_holo_light.xml | 0 ...pptheme_progress_horizontal_holo_light.xml | 0 ...ss_indeterminate_horizontal_holo_light.xml | 0 ...apptheme_spinner_background_holo_light.xml | 0 .../apptheme_switch_inner_holo_light.xml | 0 .../apptheme_switch_track_holo_light.xml | 0 .../drawable/apptheme_tab_indicator_holo.xml | 0 .../layout/apptheme_tab_indicator_holo.xml | 0 .../src/main/res/values-es/strings.xml | 0 .../src/main/res/values-fr/strings.xml | 0 .../src/main/res/values-hi/strings.xml | 0 .../src/main/res/values-it/strings.xml | 0 .../src/main/res/values-mr/strings.xml | 0 .../src/main/res/values-pt/strings.xml | 0 .../src/main/res/values-ru/strings.xml | 0 .../src/main/res/values-tr/strings.xml | 0 .../main/res/values-v11/styles_apptheme.xml | 0 .../main/res/values-v11/themes_apptheme.xml | 0 .../main/res/values-v9/themes_apptheme.xml | 0 .../src/main/res/values/colors_apptheme.xml | 0 .../src/main/res/values/dimens_apptheme.xml | 0 .../src/main/res/values/strings.xml | 0 .../src/main/res/values/styles_apptheme.xml | 0 .../src/main/res/values/themes_apptheme.xml | 0 .../src/main/res/xml/prefs.xml | 0 .../version.properties | 0 cyclestreets.vNext/build.gradle | 18 - gradle.properties | 1 + gradle/wrapper/gradle-wrapper.properties | 4 +- libraries/cyclestreets-core/build.gradle | 32 +- .../src/main/AndroidManifest.xml | 2 + .../cyclestreets/CycleStreetsPreferences.java | 2 +- .../java/net/cyclestreets/api/GeoAdapter.java | 4 +- .../net/cyclestreets/api/GeoLiveAdapter.java | 10 +- .../java/net/cyclestreets/api/GeoPlaces.java | 12 +- .../cyclestreets/api/GeoStaticAdapter.java | 8 +- .../java/net/cyclestreets/api/Photos.java | 12 +- .../RewriteCacheControlInterceptor.java | 2 +- .../java/net/cyclestreets/util/Base64.java | 5 - .../src/main/res/layout/geo_item_2line.xml | 2 +- .../RetrofitApiClientIntegrationTest.java | 2 - libraries/cyclestreets-fragments/build.gradle | 4 +- .../src/main/AndroidManifest.xml | 2 - .../net/cyclestreets/CycleMapFragment.java | 8 +- .../cyclestreets/CycleStreetsAppSupport.java | 2 - .../ElevationProfileFragment.java | 2 +- .../main/java/net/cyclestreets/FindPlace.java | 6 +- .../java/net/cyclestreets/FragmentHolder.java | 8 +- .../ItineraryAndElevationFragment.java | 9 +- .../net/cyclestreets/ItineraryFragment.java | 2 +- .../cyclestreets/LocationEditorActivity.java | 4 +- .../net/cyclestreets/LocationsFragment.java | 26 +- .../cyclestreets/MainNavDrawerActivity.java | 30 +- .../net/cyclestreets/MainTabbedActivity.java | 16 +- .../net/cyclestreets/PhotoMapFragment.java | 2 +- .../net/cyclestreets/PhotoUploadFragment.java | 2 +- .../java/net/cyclestreets/RouteByAddress.java | 8 +- .../net/cyclestreets/RouteMapFragment.java | 16 +- ...ngsActivity.java => SettingsFragment.java} | 31 +- .../net/cyclestreets/WebPageFragment.java | 2 +- .../src/main/res/layout/locations_list.xml | 55 +- .../src/main/res/menu/locations.xml | 8 - libraries/cyclestreets-track/build.gradle | 2 +- .../java/net/cyclestreets/track/TripData.java | 24 +- libraries/cyclestreets-view/build.gradle | 14 +- .../src/main/AndroidManifest.xml | 2 - .../net/cyclestreets/LiveRideActivity.java | 2 +- .../net/cyclestreets/PhotoUploadActivity.java | 867 ------------------ .../net/cyclestreets/tiles/TileSource.java | 40 +- .../tiles/UpsizingTileSource.java | 3 + .../net/cyclestreets/util/Permissions.java | 16 + .../net/cyclestreets/views/CycleMapView.java | 99 +- .../views/PlaceAutoCompleteTextView.java | 6 +- .../net/cyclestreets/views/PlaceViewBase.java | 12 +- .../views/overlay/ButtonOnlyOverlay.java | 5 +- .../views/overlay/ControllerOverlay.java | 24 +- .../views/overlay/ItemizedOverlay.java | 22 +- .../views/overlay/LiveItemOverlay.java | 15 +- .../views/overlay/LiveRideOverlay.java | 4 +- .../views/overlay/LocationOverlay.java | 120 +-- .../views/overlay/POIOverlay.java | 13 +- .../overlay/PhotoUploadButtonOverlay.java | 55 -- .../views/overlay/PhotosOverlay.java | 16 +- .../views/overlay/RouteHighlightOverlay.java | 2 +- .../views/overlay/RouteOverlay.java | 8 +- .../views/overlay/SingleButtonOverlay.java | 2 +- .../views/overlay/TapToRouteOverlay.java | 47 +- .../views/overlay/ThereOverlay.java | 2 +- .../views/overlay/ZoomButtonsOverlay.java | 6 +- .../maps/MapsforgeOSMDroidTileProvider.java | 4 +- .../android/maps/MapsforgeOSMTileSource.java | 6 + .../modules/CycleStreetsTileDownloader.java | 19 +- .../src/main/res/layout/locationbutton.xml | 25 + settings.gradle | 4 +- 449 files changed, 575 insertions(+), 1429 deletions(-) create mode 100644 cyclestreets.app/build.gradle rename {cyclestreets.vNext => cyclestreets.app}/gradle/wrapper/gradle-wrapper.jar (100%) rename {cyclestreets.vNext => cyclestreets.app}/gradle/wrapper/gradle-wrapper.properties (100%) rename {cyclestreets.vNext => cyclestreets.app}/gradlew (100%) rename {cyclestreets.vNext => cyclestreets.app}/gradlew.bat (100%) rename {cyclestreets.vNext => cyclestreets.app}/keystore.enc (100%) rename {cyclestreets.vNext => cyclestreets.app}/license.properties.enc (100%) rename {cyclestreets.vNext => cyclestreets.app}/play-api-key.p12.enc (100%) rename {cyclestreets.vNext => cyclestreets.app}/signature.asc.enc (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/androidTest/java/net/cyclestreets/AppStartupTest.java (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/AndroidManifest.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/assets/credits.html (99%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/assets/cyclestreets.jpg (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/assets/donate.html (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/assets/welcome.html (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/assets/whatsnew.html (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/java/net/cyclestreets/AboutActivity.java (80%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/java/net/cyclestreets/BlogFragment.java (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/java/net/cyclestreets/CycleStreets.java (90%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/java/net/cyclestreets/CycleStreetsApp.java (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/java/net/cyclestreets/LocationsActivity.java (81%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/java/net/cyclestreets/Welcome.java (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_check_off_disabled_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_check_off_disabled_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_check_off_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_check_off_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_check_off_pressed_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_check_on_disabled_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_check_on_disabled_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_check_on_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_check_on_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_check_on_pressed_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_default_disabled_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_default_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_default_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_default_normal_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_default_pressed_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_radio_off_disabled_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_radio_off_disabled_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_radio_off_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_radio_off_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_radio_off_pressed_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_radio_on_disabled_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_radio_on_disabled_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_radio_on_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_radio_on_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_radio_on_pressed_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_toggle_off_disabled_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_toggle_off_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_toggle_off_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_toggle_off_normal_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_toggle_off_pressed_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_toggle_on_disabled_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_toggle_on_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_toggle_on_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_toggle_on_normal_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_btn_toggle_on_pressed_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_fastscroll_thumb_default_holo.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_fastscroll_thumb_pressed_holo.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_ic_navigation_drawer.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_list_activated_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_list_focused_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_list_longpressed_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_list_pressed_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_list_selector_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_progress_bg_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_progress_primary_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_progress_secondary_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_progressbar_indeterminate_holo1.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_progressbar_indeterminate_holo2.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_progressbar_indeterminate_holo3.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_progressbar_indeterminate_holo4.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_progressbar_indeterminate_holo5.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_progressbar_indeterminate_holo6.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_progressbar_indeterminate_holo7.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_progressbar_indeterminate_holo8.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_spinner_default_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_spinner_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_spinner_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_spinner_pressed_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_switch_bg_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_switch_bg_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_switch_bg_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_switch_thumb_activated_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_switch_thumb_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_switch_thumb_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_switch_thumb_pressed_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_tab_selected_focused_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_tab_selected_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_tab_selected_pressed_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_tab_unselected_focused_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_tab_unselected_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_tab_unselected_pressed_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_text_select_handle_left.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_text_select_handle_middle.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_text_select_handle_right.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_textfield_activated_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_textfield_default_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_textfield_disabled_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_textfield_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/apptheme_textfield_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-hdpi/ic_launcher.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_check_off_disabled_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_check_off_disabled_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_check_off_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_check_off_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_check_off_pressed_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_check_on_disabled_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_check_on_disabled_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_check_on_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_check_on_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_check_on_pressed_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_default_disabled_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_default_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_default_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_default_normal_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_default_pressed_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_radio_off_disabled_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_radio_off_disabled_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_radio_off_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_radio_off_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_radio_off_pressed_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_radio_on_disabled_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_radio_on_disabled_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_radio_on_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_radio_on_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_radio_on_pressed_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_toggle_off_disabled_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_toggle_off_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_toggle_off_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_toggle_off_normal_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_toggle_off_pressed_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_toggle_on_disabled_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_toggle_on_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_toggle_on_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_toggle_on_normal_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_btn_toggle_on_pressed_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_fastscroll_thumb_default_holo.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_fastscroll_thumb_pressed_holo.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_ic_navigation_drawer.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_list_activated_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_list_focused_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_list_longpressed_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_list_pressed_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_list_selector_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_progress_bg_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_progress_primary_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_progress_secondary_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_progressbar_indeterminate_holo1.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_progressbar_indeterminate_holo2.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_progressbar_indeterminate_holo3.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_progressbar_indeterminate_holo4.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_progressbar_indeterminate_holo5.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_progressbar_indeterminate_holo6.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_progressbar_indeterminate_holo7.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_progressbar_indeterminate_holo8.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_spinner_default_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_spinner_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_spinner_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_spinner_pressed_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_switch_bg_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_switch_bg_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_switch_bg_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_switch_thumb_activated_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_switch_thumb_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_switch_thumb_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_switch_thumb_pressed_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_tab_selected_focused_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_tab_selected_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_tab_selected_pressed_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_tab_unselected_focused_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_tab_unselected_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_tab_unselected_pressed_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_text_select_handle_left.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_text_select_handle_middle.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_text_select_handle_right.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_textfield_activated_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_textfield_default_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_textfield_disabled_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_textfield_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/apptheme_textfield_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-mdpi/ic_launcher.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_check_off_disabled_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_check_off_disabled_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_check_off_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_check_off_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_check_off_pressed_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_check_on_disabled_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_check_on_disabled_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_check_on_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_check_on_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_check_on_pressed_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_default_disabled_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_default_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_default_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_default_normal_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_default_pressed_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_radio_off_disabled_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_radio_off_disabled_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_radio_off_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_radio_off_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_radio_off_pressed_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_radio_on_disabled_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_radio_on_disabled_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_radio_on_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_radio_on_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_radio_on_pressed_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_toggle_off_disabled_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_toggle_off_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_toggle_off_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_toggle_off_normal_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_toggle_off_pressed_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_toggle_on_disabled_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_toggle_on_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_toggle_on_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_toggle_on_normal_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_btn_toggle_on_pressed_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_fastscroll_thumb_default_holo.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_fastscroll_thumb_pressed_holo.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_ic_navigation_drawer.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_list_activated_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_list_focused_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_list_longpressed_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_list_pressed_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_list_selector_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_progress_bg_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_progress_primary_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_progress_secondary_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_progressbar_indeterminate_holo1.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_progressbar_indeterminate_holo2.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_progressbar_indeterminate_holo3.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_progressbar_indeterminate_holo4.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_progressbar_indeterminate_holo5.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_progressbar_indeterminate_holo6.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_progressbar_indeterminate_holo7.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_progressbar_indeterminate_holo8.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_spinner_default_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_spinner_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_spinner_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_spinner_pressed_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_switch_bg_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_switch_bg_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_switch_bg_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_switch_thumb_activated_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_switch_thumb_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_switch_thumb_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_switch_thumb_pressed_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_tab_selected_focused_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_tab_selected_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_tab_selected_pressed_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_tab_unselected_focused_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_tab_unselected_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_tab_unselected_pressed_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_text_select_handle_left.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_text_select_handle_middle.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_text_select_handle_right.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_textfield_activated_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_textfield_default_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_textfield_disabled_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_textfield_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/apptheme_textfield_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xhdpi/ic_launcher.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_check_off_disabled_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_check_off_disabled_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_check_off_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_check_off_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_check_off_pressed_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_check_on_disabled_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_check_on_disabled_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_check_on_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_check_on_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_check_on_pressed_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_default_disabled_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_default_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_default_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_default_normal_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_default_pressed_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_radio_off_disabled_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_radio_off_disabled_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_radio_off_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_radio_off_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_radio_off_pressed_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_radio_on_disabled_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_radio_on_disabled_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_radio_on_focused_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_radio_on_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_radio_on_pressed_holo_light.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_toggle_off_disabled_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_toggle_off_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_toggle_off_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_toggle_off_normal_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_toggle_off_pressed_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_toggle_on_disabled_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_toggle_on_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_toggle_on_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_toggle_on_normal_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_btn_toggle_on_pressed_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_fastscroll_thumb_default_holo.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_fastscroll_thumb_pressed_holo.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_ic_navigation_drawer.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_list_activated_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_list_focused_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_list_longpressed_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_list_pressed_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_list_selector_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_progress_bg_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_progress_primary_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_progress_secondary_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_progressbar_indeterminate_holo1.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_progressbar_indeterminate_holo2.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_progressbar_indeterminate_holo3.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_progressbar_indeterminate_holo4.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_progressbar_indeterminate_holo5.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_progressbar_indeterminate_holo6.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_progressbar_indeterminate_holo7.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_progressbar_indeterminate_holo8.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_spinner_default_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_spinner_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_spinner_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_spinner_pressed_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_switch_bg_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_switch_bg_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_switch_bg_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_switch_thumb_activated_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_switch_thumb_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_switch_thumb_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_switch_thumb_pressed_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_tab_selected_focused_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_tab_selected_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_tab_selected_pressed_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_tab_unselected_focused_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_tab_unselected_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_tab_unselected_pressed_holo.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_text_select_handle_left.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_text_select_handle_middle.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_text_select_handle_right.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_textfield_activated_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_textfield_default_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_textfield_disabled_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_textfield_disabled_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/apptheme_textfield_focused_holo_light.9.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable-xxhdpi/ic_launcher.png (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable/apptheme_activated_background_holo_light.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable/apptheme_btn_check_holo_light.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable/apptheme_btn_default_holo_light.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable/apptheme_btn_radio_holo_light.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable/apptheme_btn_toggle_holo_light.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable/apptheme_edit_text_holo_light.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable/apptheme_fastscroll_thumb_holo.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable/apptheme_item_background_holo_light.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable/apptheme_list_selector_background_transition_holo_light.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable/apptheme_list_selector_holo_light.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable/apptheme_progress_horizontal_holo_light.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable/apptheme_progress_indeterminate_horizontal_holo_light.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable/apptheme_spinner_background_holo_light.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable/apptheme_switch_inner_holo_light.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable/apptheme_switch_track_holo_light.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/drawable/apptheme_tab_indicator_holo.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/layout/apptheme_tab_indicator_holo.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/values-es/strings.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/values-fr/strings.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/values-hi/strings.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/values-it/strings.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/values-mr/strings.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/values-pt/strings.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/values-ru/strings.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/values-tr/strings.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/values-v11/styles_apptheme.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/values-v11/themes_apptheme.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/values-v9/themes_apptheme.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/values/colors_apptheme.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/values/dimens_apptheme.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/values/strings.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/values/styles_apptheme.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/values/themes_apptheme.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/src/main/res/xml/prefs.xml (100%) rename {cyclestreets.vNext => cyclestreets.app}/version.properties (100%) delete mode 100644 cyclestreets.vNext/build.gradle create mode 100644 gradle.properties rename libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/{SettingsActivity.java => SettingsFragment.java} (85%) delete mode 100644 libraries/cyclestreets-fragments/src/main/res/menu/locations.xml delete mode 100644 libraries/cyclestreets-view/src/main/java/net/cyclestreets/PhotoUploadActivity.java create mode 100644 libraries/cyclestreets-view/src/main/java/net/cyclestreets/util/Permissions.java delete mode 100644 libraries/cyclestreets-view/src/main/java/net/cyclestreets/views/overlay/PhotoUploadButtonOverlay.java create mode 100644 libraries/cyclestreets-view/src/main/res/layout/locationbutton.xml diff --git a/.travis.yml b/.travis.yml index 3617c5422..e7a4b0d9b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,34 +1,78 @@ +# Use container-based Travis, with the Trusty image. +# See https://docs.travis-ci.com/user/reference/overview/ and https://docs.travis-ci.com/user/reference/trusty/ +sudo: false +dist: trusty + language: android jdk: - oraclejdk8 env: global: - # Remember to keep this in sync with config.properties - - compileSdkVersion=23 - - minSdkVersion=17 - - targetSdkVersion=19 - - toolsVersion=25.0.3 - - ANDROID_ABI=armeabi-v7a + # Remember to keep these four values in sync with config.properties + - compileSdkVersion=26 + - minSdkVersion=23 + - targetSdkVersion=23 + - toolsVersion=27.0.3 + # Emulator-specific + - emulatorApiVersion=23 + - androidAbiVersion=armeabi-v7a + - androidTag=google_apis + - ADB_INSTALL_TIMEOUT=20 # minutes (2 minutes by default) + # For the decryption of secrets needed to sign and publish our artifacts - secure: "LipL0wPv0uQrKitaeGxCpoQsx5sl/Pg/DtQv4S7Bi52DxfArgvD2hPB0TWgkgYGJPfENHLEyqg+H+/v2nON3IXY+cnsd+TW+P1T03/52D56ieSKGVtVtSYUOZUgoyxIIvRZWFh/UNg+AmZIjOCTJDLitBTUxD8kWux8NjhIqZow=" android: components: - # The SDK version used to compile your project + # Android tools - it's deliberate that `tools` is in there twice, see https://docs.travis-ci.com/user/languages/android/#Installing-a-newer-SDK-Platform-Tools-revision + - tools # to download the latest listing of what's available to download + - platform-tools + - tools # to install up-to-date Android SDK tools + - build-tools-${toolsVersion} + + # SDK versions - android-${compileSdkVersion} + - android-${emulatorApiVersion} - # The BuildTools version used by your project - - tools - - build-tools-${toolsVersion} - - # if you need to run emulator(s) during your tests - - sys-img-${ANDROID_ABI}-android-${targetSdkVersion} - -before_install: ./ciLicense.sh + # I'm not sure why these are needed, but the emulator fails without them. It's probably + # because we're using the Google APIs tag. + - addon-google_apis-google-${compileSdkVersion} + - addon-google_apis-google-${emulatorApiVersion} + - extra-android-support + + # Ensure the latest artifacts are available in local Maven repository + - extra-google-m2repository + - extra-android-m2repository + + # Emulator system image + - sys-img-${androidAbiVersion}-${androidTag}-${emulatorApiVersion} + +before_install: + - ./ciLicense.sh + +install: + - ./gradlew build -# Emulator Management: Create, Start and Wait before_script: - - echo no | android create avd --force -n test -t android-${targetSdkVersion} --abi ${ANDROID_ABI} - - emulator -avd test -no-audio -no-window & + # Log what we've got installed (useful in case issues occur) + - sdkmanager --list + - android list targets + + # Create and start emulator + - echo no | android create avd --force -n test -t android-${emulatorApiVersion} --abi ${androidAbiVersion} --tag ${androidTag} + - export QEMU_AUDIO_DRV=none && emulator -avd test -no-window & + + # Wait for emulator to be ready, then start log capture - android-wait-for-emulator - adb shell input keyevent 82 & + - adb wait-for-device get-serialno + - adb logcat > logcat.log & + +script: + # By default, Travis errors if no console output is received for >10 mins. Since running a + # test with an emulator can be very slow, we give ourselves a broader window. + - travis_wait 30 ./gradlew connectedCheck + +after_success: + - ./ciPublish.sh -after_success: ./ciPublish.sh +after_failure: + - cat logcat.log diff --git a/build.gradle b/build.gradle index a5e371163..f08ab41fd 100644 --- a/build.gradle +++ b/build.gradle @@ -1,9 +1,10 @@ buildscript { repositories { + google() jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.3.2' + classpath 'com.android.tools.build:gradle:3.1.2' classpath 'com.github.triplet.gradle:play-publisher:1.2.0' } } @@ -33,6 +34,7 @@ subprojects { return repositories { + google() jcenter() } @@ -43,8 +45,8 @@ subprojects { buildToolsVersion appConfig['toolsVersion'] compileOptions { - sourceCompatibility JavaVersion.VERSION_1_7 - targetCompatibility JavaVersion.VERSION_1_7 + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 } defaultConfig { @@ -63,6 +65,7 @@ subprojects { // Required due to strictness of the Android developer tools. See lint.xml for full details. lintOptions { lintConfig rootProject.file('gradle/lint.xml') + abortOnError false } } // android } // subprojects @@ -70,14 +73,14 @@ subprojects { def loadProperties(fileName) { Properties props = new Properties() props.load(new FileInputStream(file(fileName))) - return props; + return props } // loadProperties def manifestProperties(project) { def cyclestreetsDetails = project.file("cyclestreets.properties") if (!cyclestreetsDetails.exists()) { println ":${project.name}:No cyclestreets.properties" - return; + return } // no cyclestreets props project.android { @@ -106,10 +109,10 @@ def versionProperties(project) { } // versionProperties def signingKey(project) { - def licenseDetails = project.file("license.properties"); + def licenseDetails = project.file("license.properties") if (!licenseDetails.exists()) { println ":${project.name}:No license.properties" - return; + return } // licenseDetails.exists Properties props = loadProperties(licenseDetails) @@ -146,3 +149,7 @@ def signingKey(project) { } // buildTypes } // android } // signingKey + +repositories { + google() +} diff --git a/ciLicense.sh b/ciLicense.sh index 02060bbd8..89ae3981b 100755 --- a/ciLicense.sh +++ b/ciLicense.sh @@ -1,12 +1,12 @@ #!/bin/bash set -ev -if [ "$CI" == "true" ] && [ "$TRAVIS_BRANCH" == "master" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then +if [ "$TRAVIS_REPO_SLUG" == "cyclestreets/android" ] &&[ "$CI" == "true" ] && [ "$TRAVIS_BRANCH" == "master" ] && [ "$TRAVIS_PULL_REQUEST" == "false" ]; then echo "Running a non-PR build on master - set up signing info" - openssl aes-256-cbc -k $openssl_file_encryption_key -in cyclestreets.vNext/license.properties.enc -out cyclestreets.vNext/license.properties -d - openssl aes-256-cbc -k $openssl_file_encryption_key -in cyclestreets.vNext/signature.asc.enc -out cyclestreets.vNext/signature.asc -d - openssl aes-256-cbc -k $openssl_file_encryption_key -in cyclestreets.vNext/keystore.enc -out cyclestreets.vNext/keystore -d - openssl aes-256-cbc -k $openssl_file_encryption_key -in cyclestreets.vNext/play-api-key.p12.enc -out cyclestreets.vNext/play-api-key.p12 -d + openssl aes-256-cbc -k $openssl_file_encryption_key -in cyclestreets.app/license.properties.enc -out cyclestreets.app/license.properties -d + openssl aes-256-cbc -k $openssl_file_encryption_key -in cyclestreets.app/signature.asc.enc -out cyclestreets.app/signature.asc -d + openssl aes-256-cbc -k $openssl_file_encryption_key -in cyclestreets.app/keystore.enc -out cyclestreets.app/keystore -d + openssl aes-256-cbc -k $openssl_file_encryption_key -in cyclestreets.app/play-api-key.p12.enc -out cyclestreets.app/play-api-key.p12 -d else echo "The compiled artifact will not be signed" fi diff --git a/config.properties b/config.properties index fdcebf650..4f7d87466 100644 --- a/config.properties +++ b/config.properties @@ -1,6 +1,8 @@ -# Android 7.1.1, 7.1 25 N_MR1 -# Android 7.0 24 N -# Android 6.0 23 M +# Android 8.1 27 OREO_MR1 +# Android 8.0 26 OREO +# Android 7.1.1, 7.1 25 NOUGAT_MR1 +# Android 7.0 24 NOUGAT +# Android 6.0 23 MARSHMALLOW # Android 5.1 22 LOLLIPOP_MR1 # Android 5.0 21 LOLLIPOP # Android 4.4W 20 KITKAT_WATCH @@ -8,10 +10,10 @@ # Android 4.3 18 JELLY_BEAN_MR2 # Android 4.2, 4.2.2 17 JELLY_BEAN_MR1 -compileSdkVersion=23 -minSdkVersion=17 -targetSdkVersion=19 +compileSdkVersion=26 +minSdkVersion=23 +targetSdkVersion=23 -toolsVersion=25.0.3 +toolsVersion=27.0.3 -# Remember to keep this in sync with .travis.yml +# Remember to keep these values in sync with .travis.yml diff --git a/cyclestreets.app/build.gradle b/cyclestreets.app/build.gradle new file mode 100644 index 000000000..46b2b7deb --- /dev/null +++ b/cyclestreets.app/build.gradle @@ -0,0 +1,17 @@ +evaluationDependsOn(':libraries:cyclestreets-fragments') + +dependencies { + api project(':libraries:cyclestreets-fragments') + implementation 'ch.acra:acra:4.9.2' + + androidTestImplementation 'com.android.support.test.espresso:espresso-core:2.2.2' + androidTestImplementation 'com.android.support.test:runner:0.5' +} + +android { + defaultConfig { + applicationId 'net.cyclestreets' + + testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner' + } +} diff --git a/cyclestreets.vNext/gradle/wrapper/gradle-wrapper.jar b/cyclestreets.app/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from cyclestreets.vNext/gradle/wrapper/gradle-wrapper.jar rename to cyclestreets.app/gradle/wrapper/gradle-wrapper.jar diff --git a/cyclestreets.vNext/gradle/wrapper/gradle-wrapper.properties b/cyclestreets.app/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from cyclestreets.vNext/gradle/wrapper/gradle-wrapper.properties rename to cyclestreets.app/gradle/wrapper/gradle-wrapper.properties diff --git a/cyclestreets.vNext/gradlew b/cyclestreets.app/gradlew similarity index 100% rename from cyclestreets.vNext/gradlew rename to cyclestreets.app/gradlew diff --git a/cyclestreets.vNext/gradlew.bat b/cyclestreets.app/gradlew.bat similarity index 100% rename from cyclestreets.vNext/gradlew.bat rename to cyclestreets.app/gradlew.bat diff --git a/cyclestreets.vNext/keystore.enc b/cyclestreets.app/keystore.enc similarity index 100% rename from cyclestreets.vNext/keystore.enc rename to cyclestreets.app/keystore.enc diff --git a/cyclestreets.vNext/license.properties.enc b/cyclestreets.app/license.properties.enc similarity index 100% rename from cyclestreets.vNext/license.properties.enc rename to cyclestreets.app/license.properties.enc diff --git a/cyclestreets.vNext/play-api-key.p12.enc b/cyclestreets.app/play-api-key.p12.enc similarity index 100% rename from cyclestreets.vNext/play-api-key.p12.enc rename to cyclestreets.app/play-api-key.p12.enc diff --git a/cyclestreets.vNext/signature.asc.enc b/cyclestreets.app/signature.asc.enc similarity index 100% rename from cyclestreets.vNext/signature.asc.enc rename to cyclestreets.app/signature.asc.enc diff --git a/cyclestreets.vNext/src/androidTest/java/net/cyclestreets/AppStartupTest.java b/cyclestreets.app/src/androidTest/java/net/cyclestreets/AppStartupTest.java similarity index 100% rename from cyclestreets.vNext/src/androidTest/java/net/cyclestreets/AppStartupTest.java rename to cyclestreets.app/src/androidTest/java/net/cyclestreets/AppStartupTest.java diff --git a/cyclestreets.vNext/src/main/AndroidManifest.xml b/cyclestreets.app/src/main/AndroidManifest.xml similarity index 100% rename from cyclestreets.vNext/src/main/AndroidManifest.xml rename to cyclestreets.app/src/main/AndroidManifest.xml diff --git a/cyclestreets.vNext/src/main/assets/credits.html b/cyclestreets.app/src/main/assets/credits.html similarity index 99% rename from cyclestreets.vNext/src/main/assets/credits.html rename to cyclestreets.app/src/main/assets/credits.html index 6f98fb8ec..3301c798e 100644 --- a/cyclestreets.vNext/src/main/assets/credits.html +++ b/cyclestreets.app/src/main/assets/credits.html @@ -1,3 +1,4 @@ + - - - - - - - - - - - - \ No newline at end of file diff --git a/cyclestreets.app/src/main/res/values-v11/themes_apptheme.xml b/cyclestreets.app/src/main/res/values-v11/themes_apptheme.xml deleted file mode 100755 index bcb9f3bd8..000000000 --- a/cyclestreets.app/src/main/res/values-v11/themes_apptheme.xml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/cyclestreets.app/src/main/res/values-v9/themes_apptheme.xml b/cyclestreets.app/src/main/res/values-v9/themes_apptheme.xml deleted file mode 100755 index 1370cd1fb..000000000 --- a/cyclestreets.app/src/main/res/values-v9/themes_apptheme.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/cyclestreets.app/src/main/res/values/styles_apptheme.xml b/cyclestreets.app/src/main/res/values/styles_apptheme.xml index b9970cdd8..159fe08f6 100755 --- a/cyclestreets.app/src/main/res/values/styles_apptheme.xml +++ b/cyclestreets.app/src/main/res/values/styles_apptheme.xml @@ -8,10 +8,9 @@ #000000 - - - - @@ -43,12 +39,12 @@ - - diff --git a/libraries/cyclestreets-core/src/main/java/net/cyclestreets/CycleStreetsNotifications.java b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/CycleStreetsNotifications.java new file mode 100644 index 000000000..25e7b0f8c --- /dev/null +++ b/libraries/cyclestreets-core/src/main/java/net/cyclestreets/CycleStreetsNotifications.java @@ -0,0 +1,61 @@ +package net.cyclestreets; + +import android.app.Notification; +import android.app.NotificationChannel; +import android.app.NotificationManager; +import android.content.Context; +import android.os.Build; + +import net.cyclestreets.core.R; + +public class CycleStreetsNotifications +{ + public final static String CHANNEL_LIVERIDE_ID = "liveride"; + public final static String CHANNEL_TRACK_ID = "track"; + + public static void initialise(final Context context) { + createNotificationChannel(context, + R.string.channel_liveride_name, + R.string.channel_liveride_description, + CHANNEL_LIVERIDE_ID); + // When cyclestreets-track is integrated, we'll need to create this channel. + // createNotificationChannel(context, + // R.string.channel_track_name, + // R.string.channel_track_description, + // CHANNEL_TRACK_ID); + } + + // see https://developer.android.com/training/notify-user/channels + private static void createNotificationChannel(final Context context, + int nameResourceId, + int descriptionResourceId, + String channelId) { + // Create the NotificationChannel, but only on API 26+ because + // the NotificationChannel class is new and not in the support library + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + CharSequence name = context.getString(nameResourceId); + String description = context.getString(descriptionResourceId); + int importance = NotificationManager.IMPORTANCE_DEFAULT; + NotificationChannel channel = new NotificationChannel(channelId, name, importance); + channel.setDescription(description); + + // Register the channel with the system; you can't change the importance + // or other notification behaviors after this + NotificationManager notificationManager = context.getSystemService(NotificationManager.class); + notificationManager.createNotificationChannel(channel); + } + } + + public static Notification.Builder getBuilder(Context context, String channelId) { + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { + return new Notification.Builder(context, channelId); + } else { + return getBuilderPreOreo(context); + } + } + + @SuppressWarnings("deprecation") + private static Notification.Builder getBuilderPreOreo(Context context) { + return new Notification.Builder(context); + } +} diff --git a/libraries/cyclestreets-core/src/main/res/layout/geo_item_2line.xml b/libraries/cyclestreets-core/src/main/res/layout/geo_item_2line.xml index 8a856afd6..3aaa55392 100644 --- a/libraries/cyclestreets-core/src/main/res/layout/geo_item_2line.xml +++ b/libraries/cyclestreets-core/src/main/res/layout/geo_item_2line.xml @@ -6,9 +6,9 @@ android:layout_height="?android:listPreferredItemHeight" android:baselineAligned="false"> diff --git a/libraries/cyclestreets-core/src/main/res/values-de/strings.xml b/libraries/cyclestreets-core/src/main/res/values-de/strings.xml index 4a327da1b..4fa3c5e9b 100644 --- a/libraries/cyclestreets-core/src/main/res/values-de/strings.xml +++ b/libraries/cyclestreets-core/src/main/res/values-de/strings.xml @@ -16,4 +16,7 @@ Dein Bild wurde erfolgreich hochgeladen. Es gab ein Problem beim Hochladen deines Bildes: \n + LiveRide + Turn-by-turn instructions for navigation + diff --git a/libraries/cyclestreets-core/src/main/res/values-es/strings.xml b/libraries/cyclestreets-core/src/main/res/values-es/strings.xml index d9d03d07e..3bbd9b4d1 100644 --- a/libraries/cyclestreets-core/src/main/res/values-es/strings.xml +++ b/libraries/cyclestreets-core/src/main/res/values-es/strings.xml @@ -16,4 +16,7 @@ Tu foto se ha actualizado con éxito. Hubo un problema al actualizar tu foto: \n + LiveRide + Turn-by-turn instructions for navigation + diff --git a/libraries/cyclestreets-core/src/main/res/values-fr/strings.xml b/libraries/cyclestreets-core/src/main/res/values-fr/strings.xml index 19cda49d5..3037dae2f 100644 --- a/libraries/cyclestreets-core/src/main/res/values-fr/strings.xml +++ b/libraries/cyclestreets-core/src/main/res/values-fr/strings.xml @@ -16,4 +16,7 @@ Votre photo a été chargé avec succès. Il y avait un problème de chargement de votre photo: \n + LiveRide + Turn-by-turn instructions for navigation + diff --git a/libraries/cyclestreets-core/src/main/res/values-hi/strings.xml b/libraries/cyclestreets-core/src/main/res/values-hi/strings.xml index 9672cb517..81e119e78 100644 --- a/libraries/cyclestreets-core/src/main/res/values-hi/strings.xml +++ b/libraries/cyclestreets-core/src/main/res/values-hi/strings.xml @@ -16,4 +16,7 @@ अपनी फ़ोटो सफलतापूर्वक अपलोड किया गया. फोटो अपलोड करते समय, समस्या हुआ : \n + LiveRide + Turn-by-turn instructions for navigation + diff --git a/libraries/cyclestreets-core/src/main/res/values-it/strings.xml b/libraries/cyclestreets-core/src/main/res/values-it/strings.xml index a346bf816..d6375e178 100644 --- a/libraries/cyclestreets-core/src/main/res/values-it/strings.xml +++ b/libraries/cyclestreets-core/src/main/res/values-it/strings.xml @@ -16,4 +16,7 @@ Upload della foto completato con successo. C\'è stato un problema con l\'upload della tua foto: \n + LiveRide + Turn-by-turn instructions for navigation + diff --git a/libraries/cyclestreets-core/src/main/res/values-mr/strings.xml b/libraries/cyclestreets-core/src/main/res/values-mr/strings.xml index c42cab274..a37f55970 100644 --- a/libraries/cyclestreets-core/src/main/res/values-mr/strings.xml +++ b/libraries/cyclestreets-core/src/main/res/values-mr/strings.xml @@ -16,4 +16,7 @@ आपला फोटो यशस्वीरित्या अपलोड केला. आपला फोटो अपलोड करताना एक समस्या आली: \n + LiveRide + Turn-by-turn instructions for navigation + diff --git a/libraries/cyclestreets-core/src/main/res/values-pt/strings.xml b/libraries/cyclestreets-core/src/main/res/values-pt/strings.xml index 83c30977f..e7e988bfb 100644 --- a/libraries/cyclestreets-core/src/main/res/values-pt/strings.xml +++ b/libraries/cyclestreets-core/src/main/res/values-pt/strings.xml @@ -14,4 +14,8 @@ Sua foto foi enviada com sucesso. Houve um erro enviando sua foto: \n + + LiveRide + Turn-by-turn instructions for navigation + diff --git a/libraries/cyclestreets-core/src/main/res/values-ru/strings.xml b/libraries/cyclestreets-core/src/main/res/values-ru/strings.xml index f76497c6b..9ecb43d88 100644 --- a/libraries/cyclestreets-core/src/main/res/values-ru/strings.xml +++ b/libraries/cyclestreets-core/src/main/res/values-ru/strings.xml @@ -16,4 +16,7 @@ Ваше фото загружено успешно. Произошла ошибка при загрузке вашей фотографии: \n + LiveRide + Turn-by-turn instructions for navigation + diff --git a/libraries/cyclestreets-core/src/main/res/values-tr/strings.xml b/libraries/cyclestreets-core/src/main/res/values-tr/strings.xml index 79ac98661..bd80c8627 100644 --- a/libraries/cyclestreets-core/src/main/res/values-tr/strings.xml +++ b/libraries/cyclestreets-core/src/main/res/values-tr/strings.xml @@ -17,4 +17,7 @@ Fotoğrafınız başarıyla yüklendi. Fotoğrafınız yüklenirken bir problem oluştu: \n + LiveRide + Turn-by-turn instructions for navigation + diff --git a/libraries/cyclestreets-core/src/main/res/values/strings.xml b/libraries/cyclestreets-core/src/main/res/values/strings.xml index c6a69b9ab..e9a2d9767 100644 --- a/libraries/cyclestreets-core/src/main/res/values/strings.xml +++ b/libraries/cyclestreets-core/src/main/res/values/strings.xml @@ -16,4 +16,7 @@ Your photo was uploaded successfully. There was a problem uploading your photo: \n + LiveRide + Turn-by-turn instructions for navigation + diff --git a/libraries/cyclestreets-fragments/src/main/AndroidManifest.xml b/libraries/cyclestreets-fragments/src/main/AndroidManifest.xml index 8d03dbb6a..cbcd63edb 100644 --- a/libraries/cyclestreets-fragments/src/main/AndroidManifest.xml +++ b/libraries/cyclestreets-fragments/src/main/AndroidManifest.xml @@ -2,7 +2,7 @@ - + diff --git a/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/CycleStreetsAppSupport.java b/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/CycleStreetsAppSupport.java index 9ee50b78d..9aeb23773 100644 --- a/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/CycleStreetsAppSupport.java +++ b/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/CycleStreetsAppSupport.java @@ -16,6 +16,7 @@ public static void initialise(final Context context) { public static void initialise(final Context context, final int prefsDefault) { CycleStreetsPreferences.initialise(context, prefsDefault); + CycleStreetsNotifications.initialise(context); Route.initialise(context); ApiClient.initialise(context); @@ -32,7 +33,7 @@ public static void initialise(final Context context, final int prefsDefault) { public static boolean isNewVersion() { return isNew_; } public static boolean isFirstRun() { return isFirstRun_; } - private static String version(final Context context) { + private static String version(final Context context) { return "Version : " + AppInfo.version(context); } diff --git a/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/WebPageFragment.java b/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/WebPageFragment.java index 0cbc2f5d9..4c532496c 100644 --- a/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/WebPageFragment.java +++ b/libraries/cyclestreets-fragments/src/main/java/net/cyclestreets/WebPageFragment.java @@ -9,6 +9,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.webkit.WebResourceRequest; import android.webkit.WebView; import android.webkit.WebViewClient; @@ -91,7 +92,17 @@ public FragmentViewClient(final Context context, } @Override + public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { + return shouldOverrideUrlLoading(request.getUrl().toString()); + } + + @Override + @Deprecated public boolean shouldOverrideUrlLoading(WebView view, String url) { + return shouldOverrideUrlLoading(url); + } + + private boolean shouldOverrideUrlLoading(String url) { if (url.equals(homePage_)) return false; diff --git a/libraries/cyclestreets-fragments/src/main/res/layout/about.xml b/libraries/cyclestreets-fragments/src/main/res/layout/about.xml index 2bea23664..599c20ebc 100644 --- a/libraries/cyclestreets-fragments/src/main/res/layout/about.xml +++ b/libraries/cyclestreets-fragments/src/main/res/layout/about.xml @@ -6,7 +6,7 @@ android:layout_height="fill_parent"> diff --git a/libraries/cyclestreets-fragments/src/main/res/layout/blog.xml b/libraries/cyclestreets-fragments/src/main/res/layout/blog.xml index 67ccc27f3..11e1822e6 100644 --- a/libraries/cyclestreets-fragments/src/main/res/layout/blog.xml +++ b/libraries/cyclestreets-fragments/src/main/res/layout/blog.xml @@ -6,7 +6,7 @@ android:layout_height="fill_parent"> diff --git a/libraries/cyclestreets-fragments/src/main/res/layout/elevation.xml b/libraries/cyclestreets-fragments/src/main/res/layout/elevation.xml index dc721032e..6f1dc74b9 100644 --- a/libraries/cyclestreets-fragments/src/main/res/layout/elevation.xml +++ b/libraries/cyclestreets-fragments/src/main/res/layout/elevation.xml @@ -7,7 +7,7 @@ layout="@layout/itinerary_header_item" android:layout_height="wrap_content" android:layout_width="match_parent" - android:layout_marginBottom="20px"/> + android:layout_marginBottom="20dp"/> diff --git a/libraries/cyclestreets-fragments/src/main/res/layout/findplace.xml b/libraries/cyclestreets-fragments/src/main/res/layout/findplace.xml index d758472b7..7110c9c7b 100644 --- a/libraries/cyclestreets-fragments/src/main/res/layout/findplace.xml +++ b/libraries/cyclestreets-fragments/src/main/res/layout/findplace.xml @@ -4,10 +4,10 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:clipChildren="false" - android:paddingLeft="9dip" - android:paddingRight="9dip" - android:paddingTop="12dip" - android:paddingBottom="6dip" + android:paddingLeft="9dp" + android:paddingRight="9dp" + android:paddingTop="12dp" + android:paddingBottom="6dp" android:background="?android:attr/colorBackground"> + android:padding="6dp"> + android:layout_width="30dp"/>