From c58f97452e3b5e4c9bbde5ee39bb135fd34cf593 Mon Sep 17 00:00:00 2001 From: Amine Date: Wed, 6 Sep 2017 21:16:20 +0200 Subject: [PATCH] Fixed issues with secrets xml file. Removed it and remplaced with build config. --- .github/CONTRIBUTING.md | 32 ++++++++++++++---- .gitignore | 2 -- CHANGELOG.md | 4 +++ app/build.gradle | 19 +++++++++++ .../apps/amine/bou/readerforselfoss/MyApp.kt | 2 +- .../bou/readerforselfoss/ReaderActivity.kt | 2 +- .../settings/SettingsActivity.java | 5 +-- secrets.tar.enc | Bin 10256 -> 0 bytes 8 files changed, 53 insertions(+), 13 deletions(-) delete mode 100644 secrets.tar.enc diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index e43235d..5259427 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -46,12 +46,30 @@ You can directly import this project into IntellIJ/Android Studio. You'll have to: -- Configure Fabric, or [remove it](https://docs.fabric.io/android/fabric/settings/removing.html#). +- Configure fabric and add your `apiKey` and `apiSecret` in the `fabric.properties` file. - Create a firebase project and add the `google-services.json` to the `app/` folder. -- Define the following in `res/values/strings.xml` or create `res/values/secrets.xml` +- Define the following some parameters either in `~/.gradle/gradle.properties` or as gradle parameters (see the examples) - - mercury: A [Mercury](https://mercury.postlight.com/web-parser/) web parser api key for the internal browser - - feedback_email: An email to receive users feedback. - - source_url: an url to the source code, used in the settings - - tracker_url: an url to the tracker, used in the settings -- To run your app, you'll have to add `-P appLoginUrl="your.selfoss-instance.url" -P appLoginUsername="Username" -P appLoginPassword="password"`. (These are only used to run the espresso tests. You should be able to use empty strings or fake values to build the app) + - mercuryApiKey: A [Mercury](https://mercury.postlight.com/web-parser/) web parser api key for the internal browser + - feedbackEmail: An email to receive users feedback. + - sourceUrl: an url to the source code, used in the settings + - trackerUrl: an url to the tracker, used in the settings + +### Examples: +#### Inside ~/.gradle/gradle.properties + +``` +appLoginUrl="URL" +appLoginUsername="LOGIN" +appLoginPassword="PASS" +mercuryApiKey="LONGAPIKEY" +feedbackEmail="EMAIL" +sourceUrl="URLSOURCE" +trackerUrl="URLTRACKER" +``` + +#### As gradle parameters + +``` +./gradlew .... -P appLoginUrl="URL" -P appLoginUsername="LOGIN" -P appLoginPassword="PASS" -P mercuryApiKey="LONGAPIKEY" -P feedbackEmail="EMAIL" -P sourceUrl="URLSOURCE" -P trackerUrl="URLTRACKER" +``` diff --git a/.gitignore b/.gitignore index ad7be5c..66ca69c 100644 --- a/.gitignore +++ b/.gitignore @@ -214,6 +214,4 @@ gradle-app.setting # End of https://www.gitignore.io/api/java,gradle,android,androidstudio -secrets.xml - release/ \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index cc11917..1629f4f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,7 @@ +**1.5.2.17** + +- Source code and tracker links weren't being set, and updated the contributing doc. + **1.5.2.15/16** - Adding an account header on the lateral drawer. diff --git a/app/build.gradle b/app/build.gradle index 3c6490e..5dfb613 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -53,6 +53,11 @@ android { // tests testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + + buildConfigField "String", "MERCURY_KEY", mercuryApiKey + buildConfigField "String", "FEEDBACK_EMAIL", feedbackEmail + buildConfigField "String", "SOURCE_URL", sourceUrl + buildConfigField "String", "TRACKER_URL", trackerUrl } buildTypes { release { @@ -165,6 +170,7 @@ apply plugin: 'com.google.gms.google-services' afterEvaluate { initFabricPropertiesIfNeeded() initAppLoginPropertiesIfNeeded() + initAppForSecretPropertiesIfNeeded() } def initFabricPropertiesIfNeeded() { @@ -189,3 +195,16 @@ def initAppLoginPropertiesIfNeeded() { } } } + +def initAppForSecretPropertiesIfNeeded() { + def propertiesFile = file(System.getProperty("user.home") + '/.gradle/gradle.properties') + if (!propertiesFile.exists()) { + def commentMessage = "This is autogenerated local property from system environment to prevent key to be committed to source control." + ant.propertyfile(file: System.getProperty("user.home") + "/.gradle/gradle.properties", comment: commentMessage) { + entry(key: "mercuryApiKey", value: System.getProperty("mercuryApiKey")) + entry(key: "feedbackEmail", value: System.getProperty("feedbackEmail")) + entry(key: "sourceUrl", value: System.getProperty("sourceUrl")) + entry(key: "trackerUrl", value: System.getProperty("trackerUrl")) + } + } +} diff --git a/app/src/main/java/apps/amine/bou/readerforselfoss/MyApp.kt b/app/src/main/java/apps/amine/bou/readerforselfoss/MyApp.kt index 8b882c3..f159ba2 100644 --- a/app/src/main/java/apps/amine/bou/readerforselfoss/MyApp.kt +++ b/app/src/main/java/apps/amine/bou/readerforselfoss/MyApp.kt @@ -49,7 +49,7 @@ class MyApp : MultiDexApplication() { private fun initAmplify() { Amplify.initSharedInstance(this) - .setFeedbackEmailAddress(getString(R.string.feedback_email)) + .setFeedbackEmailAddress(BuildConfig.FEEDBACK_EMAIL) .applyAllDefaultRules() } diff --git a/app/src/main/java/apps/amine/bou/readerforselfoss/ReaderActivity.kt b/app/src/main/java/apps/amine/bou/readerforselfoss/ReaderActivity.kt index 59b62d4..c91c0b3 100644 --- a/app/src/main/java/apps/amine/bou/readerforselfoss/ReaderActivity.kt +++ b/app/src/main/java/apps/amine/bou/readerforselfoss/ReaderActivity.kt @@ -51,7 +51,7 @@ class ReaderActivity : DragDismissActivity() { val title: TextView = v.findViewById(R.id.title) val content: HtmlTextView = v.findViewById(R.id.content) val url = intent.getStringExtra("url") - val parser = MercuryApi(getString(R.string.mercury)) + val parser = MercuryApi(BuildConfig.MERCURY_KEY) val browserBtn: ImageButton = v.findViewById(R.id.browserBtn) val shareBtn: ImageButton = v.findViewById(R.id.shareBtn) diff --git a/app/src/main/java/apps/amine/bou/readerforselfoss/settings/SettingsActivity.java b/app/src/main/java/apps/amine/bou/readerforselfoss/settings/SettingsActivity.java index 07df4d4..1712917 100644 --- a/app/src/main/java/apps/amine/bou/readerforselfoss/settings/SettingsActivity.java +++ b/app/src/main/java/apps/amine/bou/readerforselfoss/settings/SettingsActivity.java @@ -27,6 +27,7 @@ import android.widget.Toast; import java.util.List; +import apps.amine.bou.readerforselfoss.BuildConfig; import apps.amine.bou.readerforselfoss.R; import apps.amine.bou.readerforselfoss.utils.Config; import com.ftinc.scoop.ui.ScoopSettingsActivity; @@ -242,7 +243,7 @@ public class SettingsActivity extends AppCompatPreferenceActivity { findPreference( "trackerLink" ).setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { - openUrl(Uri.parse(getString(R.string.tracker_url))); + openUrl(Uri.parse(BuildConfig.TRACKER_URL)); return true; } }); @@ -250,7 +251,7 @@ public class SettingsActivity extends AppCompatPreferenceActivity { findPreference("sourceLink").setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference preference) { - openUrl(Uri.parse(getString(R.string.source_url))); + openUrl(Uri.parse(BuildConfig.SOURCE_URL)); return false; } }); diff --git a/secrets.tar.enc b/secrets.tar.enc deleted file mode 100644 index b3ca8b459a4f731a71c320cad435ef09828a12e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10256 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