Compare commits
20 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d768d2232b | ||
|
|
b44a200731 | ||
|
|
016815e0d1 | ||
|
|
590534e4a6 | ||
|
|
7ea9d4e519 | ||
|
|
e0ab09f533 | ||
|
|
fbe98f1b16 | ||
|
|
d0675b8443 | ||
|
|
3ea1ed02ae | ||
|
|
ba120b1e0b | ||
|
|
acf6995c2d | ||
|
|
8306860f90 | ||
|
|
65974166be | ||
|
|
ee8924f986 | ||
|
|
170e575465 | ||
|
|
b7d5317b10 | ||
|
|
f12e7748c5 | ||
|
|
69a2418afc | ||
|
|
4924ddd172 | ||
|
|
1889b43786 |
5
.github/CONTRIBUTING.md
vendored
@@ -38,18 +38,19 @@ Always check if the web version of your instance is working.
|
|||||||
* Be willing to accept criticism on your PRs (as I am on mine).
|
* Be willing to accept criticism on your PRs (as I am on mine).
|
||||||
* Remember that PR review can take time.
|
* Remember that PR review can take time.
|
||||||
|
|
||||||
|
|
||||||
# Build the project
|
# Build the project
|
||||||
|
|
||||||
You can directly import this project into IntellIJ/Android Studio.
|
You can directly import this project into IntellIJ/Android Studio.
|
||||||
|
|
||||||
You'll have to:
|
You'll have to:
|
||||||
|
|
||||||
- [Create your own launcher icon](https://developer.android.com/studio/write/image-asset-studio.html#creating-launcher)
|
|
||||||
|
|
||||||
- Configure Fabric, or [remove it](https://docs.fabric.io/android/fabric/settings/removing.html#).
|
- Configure Fabric, or [remove it](https://docs.fabric.io/android/fabric/settings/removing.html#).
|
||||||
|
- 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 in `res/values/strings.xml` or create `res/values/secrets.xml`
|
||||||
|
|
||||||
- mercury: A [Mercury](https://mercury.postlight.com/web-parser/) web parser api key for the internal browser
|
- 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.
|
- feedback_email: An email to receive users feedback.
|
||||||
- source_url: an url to the source code, used in the settings
|
- source_url: an url to the source code, used in the settings
|
||||||
- tracker_url: an url to the tracker, 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)
|
||||||
|
|||||||
1
.gitignore
vendored
@@ -216,5 +216,4 @@ gradle-app.setting
|
|||||||
|
|
||||||
secrets.xml
|
secrets.xml
|
||||||
|
|
||||||
mipmap-*
|
|
||||||
release/
|
release/
|
||||||
26
CHANGELOG.md
@@ -1,3 +1,29 @@
|
|||||||
|
**1.5.2.02**
|
||||||
|
|
||||||
|
- Added optional login option.
|
||||||
|
|
||||||
|
**1.5.2.01**
|
||||||
|
|
||||||
|
- New (Better) Icon !
|
||||||
|
|
||||||
|
**1.5.2.0**
|
||||||
|
|
||||||
|
- New Icon !
|
||||||
|
|
||||||
|
**1.5.1.9/10/11**
|
||||||
|
|
||||||
|
- Hiding the unread badge when marking all items as read.
|
||||||
|
|
||||||
|
**1.5.1.8**
|
||||||
|
|
||||||
|
- Fixes and libs updates.
|
||||||
|
|
||||||
|
**1.5.1.7**
|
||||||
|
|
||||||
|
- Bug fixes.
|
||||||
|
|
||||||
|
- Code cleaning
|
||||||
|
|
||||||
**1.5.1.6**
|
**1.5.1.6**
|
||||||
|
|
||||||
- Added back the badges after it was fixed on the library side.
|
- Added back the badges after it was fixed on the library side.
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
# ReaderForSelfoss
|
# ReaderForSelfoss
|
||||||
|
|
||||||
[](https://gitter.im/amine-bou/ReaderForSelfoss)
|
[](http://jenkins.amine-bou.fr/job/ReaderForSelfoss/)
|
||||||
|
|
||||||
[](https://circleci.com/gh/aminecmi/ReaderforSelfoss/tree/master)
|
[](https://gitter.im/amine-bou/ReaderForSelfoss)
|
||||||
|
|
||||||
[](https://codebeat.co/projects/github-com-aminecmi-readerforselfoss-master)
|
[](https://codebeat.co/projects/github-com-aminecmi-readerforselfoss-master)
|
||||||
|
|
||||||
@@ -22,3 +22,8 @@ Check the [Contribution guide](https://github.com/aminecmi/ReaderforSelfoss/blob
|
|||||||
- [Check what changed](https://github.com/aminecmi/ReaderforSelfoss/blob/master/CHANGELOG.md)
|
- [Check what changed](https://github.com/aminecmi/ReaderforSelfoss/blob/master/CHANGELOG.md)
|
||||||
- [See what I'm doing](https://github.com/aminecmi/ReaderforSelfoss/projects/1)
|
- [See what I'm doing](https://github.com/aminecmi/ReaderforSelfoss/projects/1)
|
||||||
- [Create an issue, or request a new feature](https://github.com/aminecmi/ReaderforSelfoss/issues)
|
- [Create an issue, or request a new feature](https://github.com/aminecmi/ReaderforSelfoss/issues)
|
||||||
|
|
||||||
|
|
||||||
|
#Icon
|
||||||
|
|
||||||
|
I used RSS Document by AlfredoCreates.com from the Noun Project. You can see it [here](https://thenounproject.com/search/?q=rss&i=596333).
|
||||||
@@ -8,6 +8,21 @@ buildscript {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def gitVersion() {
|
||||||
|
def process = "git describe --abbrev=0 --tags".execute()
|
||||||
|
return process.text.substring(1).replaceAll("\\.", "")
|
||||||
|
}
|
||||||
|
|
||||||
|
def versionCodeFromGit() {
|
||||||
|
println "version code " + gitVersion().toInteger()
|
||||||
|
return gitVersion().toInteger()
|
||||||
|
}
|
||||||
|
|
||||||
|
def versionNameFromGit() {
|
||||||
|
println "version code " + gitVersion().trim()
|
||||||
|
return gitVersion().trim()
|
||||||
|
}
|
||||||
|
|
||||||
apply plugin: 'com.android.application'
|
apply plugin: 'com.android.application'
|
||||||
|
|
||||||
apply plugin: 'io.fabric'
|
apply plugin: 'io.fabric'
|
||||||
@@ -24,9 +39,9 @@ android {
|
|||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "apps.amine.bou.readerforselfoss"
|
applicationId "apps.amine.bou.readerforselfoss"
|
||||||
minSdkVersion 16
|
minSdkVersion 16
|
||||||
targetSdkVersion 25
|
targetSdkVersion 26
|
||||||
versionCode 1516
|
versionCode versionCodeFromGit()
|
||||||
versionName "1.5.1.6"
|
versionName versionNameFromGit()
|
||||||
|
|
||||||
// Enabling multidex support.
|
// Enabling multidex support.
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
@@ -80,13 +95,13 @@ dependencies {
|
|||||||
compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
|
compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
|
||||||
|
|
||||||
// Android Support
|
// Android Support
|
||||||
compile 'com.android.support:appcompat-v7:26.0.0-beta2'
|
compile 'com.android.support:appcompat-v7:26.0.0'
|
||||||
compile 'com.android.support:design:26.0.0-beta2'
|
compile 'com.android.support:design:26.0.0'
|
||||||
compile 'com.android.support:recyclerview-v7:26.0.0-beta2'
|
compile 'com.android.support:recyclerview-v7:26.0.0'
|
||||||
compile 'com.android.support:support-v4:26.0.0-beta2'
|
compile 'com.android.support:support-v4:26.0.0'
|
||||||
compile 'com.android.support:support-vector-drawable:26.0.0-beta2'
|
compile 'com.android.support:support-vector-drawable:26.0.0'
|
||||||
compile 'com.android.support:customtabs:26.0.0-beta2'
|
compile 'com.android.support:customtabs:26.0.0'
|
||||||
compile 'com.android.support:cardview-v7:26.0.0-beta2'
|
compile 'com.android.support:cardview-v7:26.0.0'
|
||||||
compile 'com.android.support.constraint:constraint-layout:1.0.2'
|
compile 'com.android.support.constraint:constraint-layout:1.0.2'
|
||||||
|
|
||||||
// Firebase + crashlytics
|
// Firebase + crashlytics
|
||||||
@@ -131,7 +146,7 @@ dependencies {
|
|||||||
compile 'com.klinkerapps:drag-dismiss-activity:1.4.2'
|
compile 'com.klinkerapps:drag-dismiss-activity:1.4.2'
|
||||||
|
|
||||||
// Drawer
|
// Drawer
|
||||||
compile('com.mikepenz:materialdrawer:5.9.3@aar') {
|
compile('com.mikepenz:materialdrawer:5.9.4@aar') {
|
||||||
transitive = true
|
transitive = true
|
||||||
}
|
}
|
||||||
compile 'com.anupcowkur:reservoir:3.1.0'
|
compile 'com.anupcowkur:reservoir:3.1.0'
|
||||||
@@ -170,4 +185,4 @@ def initAppLoginPropertiesIfNeeded() {
|
|||||||
entry(key: "appLoginPassword", value: System.getProperty("appLoginPassword"))
|
entry(key: "appLoginPassword", value: System.getProperty("appLoginPassword"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,7 +86,7 @@ class HomeActivityEspressoTest {
|
|||||||
|
|
||||||
intended(hasComponent(LoginActivity::class.java.name), times(1))
|
intended(hasComponent(LoginActivity::class.java.name), times(1))
|
||||||
|
|
||||||
onView(isRoot()).perform(pressBack())
|
//onView(isRoot()).perform(pressBack())
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ class IntroActivityEspressoTest {
|
|||||||
Intents.init()
|
Intents.init()
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
/*@Test
|
||||||
fun nextEachTimes() {
|
fun nextEachTimes() {
|
||||||
|
|
||||||
rule.launchActivity(Intent())
|
rule.launchActivity(Intent())
|
||||||
@@ -61,7 +61,7 @@ class IntroActivityEspressoTest {
|
|||||||
intended(hasComponent(IntroActivity::class.java.name), times(1))
|
intended(hasComponent(IntroActivity::class.java.name), times(1))
|
||||||
intended(hasComponent(LoginActivity::class.java.name), times(1))
|
intended(hasComponent(LoginActivity::class.java.name), times(1))
|
||||||
|
|
||||||
}
|
}*/
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun nextBackRandomTimes() {
|
fun nextBackRandomTimes() {
|
||||||
|
|||||||
BIN
app/src/main/ic_launcher-web.png
Normal file
|
After Width: | Height: | Size: 61 KiB |
@@ -16,7 +16,7 @@ import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
|
|||||||
import apps.amine.bou.readerforselfoss.api.selfoss.Spout
|
import apps.amine.bou.readerforselfoss.api.selfoss.Spout
|
||||||
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
|
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
|
||||||
import apps.amine.bou.readerforselfoss.utils.Config
|
import apps.amine.bou.readerforselfoss.utils.Config
|
||||||
import apps.amine.bou.readerforselfoss.utils.isUrlValid
|
import apps.amine.bou.readerforselfoss.utils.isBaseUrlValid
|
||||||
import com.ftinc.scoop.Scoop
|
import com.ftinc.scoop.Scoop
|
||||||
|
|
||||||
|
|
||||||
@@ -73,7 +73,7 @@ class AddSourceActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
val config = Config(this)
|
val config = Config(this)
|
||||||
|
|
||||||
if (config.baseUrl.isEmpty() || !config.baseUrl.isUrlValid()) {
|
if (config.baseUrl.isEmpty() || !config.baseUrl.isBaseUrlValid()) {
|
||||||
mustLoginToAddSource()
|
mustLoginToAddSource()
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
|||||||
@@ -185,9 +185,10 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
} else {
|
} else {
|
||||||
(recyclerView.adapter as ItemListAdapter).removeItemAtIndex(position)
|
(recyclerView.adapter as ItemListAdapter).removeItemAtIndex(position)
|
||||||
}
|
}
|
||||||
tabNewBadge.setText("${items.size}").maybeShow()
|
if (items.size > 0)
|
||||||
|
tabNewBadge.setText("${items.size}").maybeShow()
|
||||||
mayBeEmpty()
|
else
|
||||||
|
tabNewBadge.hide()
|
||||||
|
|
||||||
} catch (e: IndexOutOfBoundsException) {}
|
} catch (e: IndexOutOfBoundsException) {}
|
||||||
|
|
||||||
@@ -760,8 +761,10 @@ class HomeActivity : AppCompatActivity(), SearchView.OnQueryTextListener {
|
|||||||
|
|
||||||
api.readAll(ids).enqueue(object : Callback<SuccessResponse> {
|
api.readAll(ids).enqueue(object : Callback<SuccessResponse> {
|
||||||
override fun onResponse(call: Call<SuccessResponse>, response: Response<SuccessResponse>) {
|
override fun onResponse(call: Call<SuccessResponse>, response: Response<SuccessResponse>) {
|
||||||
if (response.body() != null && response.body()!!.isSuccess)
|
if (response.body() != null && response.body()!!.isSuccess) {
|
||||||
Toast.makeText(this@HomeActivity, R.string.all_posts_read, Toast.LENGTH_SHORT).show()
|
Toast.makeText(this@HomeActivity, R.string.all_posts_read, Toast.LENGTH_SHORT).show()
|
||||||
|
tabNewBadge.removeBadge()
|
||||||
|
}
|
||||||
else
|
else
|
||||||
Toast.makeText(this@HomeActivity, R.string.all_posts_not_read, Toast.LENGTH_SHORT).show()
|
Toast.makeText(this@HomeActivity, R.string.all_posts_not_read, Toast.LENGTH_SHORT).show()
|
||||||
|
|
||||||
|
|||||||
@@ -15,10 +15,7 @@ import android.view.Menu
|
|||||||
import android.view.MenuItem
|
import android.view.MenuItem
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import android.view.inputmethod.EditorInfo
|
import android.view.inputmethod.EditorInfo
|
||||||
import android.widget.Button
|
import android.widget.*
|
||||||
import android.widget.EditText
|
|
||||||
import android.widget.Switch
|
|
||||||
import android.widget.TextView
|
|
||||||
|
|
||||||
import com.google.firebase.analytics.FirebaseAnalytics
|
import com.google.firebase.analytics.FirebaseAnalytics
|
||||||
import com.mikepenz.aboutlibraries.Libs
|
import com.mikepenz.aboutlibraries.Libs
|
||||||
@@ -31,8 +28,10 @@ import apps.amine.bou.readerforselfoss.api.selfoss.SelfossApi
|
|||||||
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
|
import apps.amine.bou.readerforselfoss.api.selfoss.SuccessResponse
|
||||||
import apps.amine.bou.readerforselfoss.utils.Config
|
import apps.amine.bou.readerforselfoss.utils.Config
|
||||||
import apps.amine.bou.readerforselfoss.utils.checkAndDisplayStoreApk
|
import apps.amine.bou.readerforselfoss.utils.checkAndDisplayStoreApk
|
||||||
import apps.amine.bou.readerforselfoss.utils.isUrlValid
|
import apps.amine.bou.readerforselfoss.utils.isBaseUrlValid
|
||||||
|
import com.crashlytics.android.Crashlytics
|
||||||
import com.ftinc.scoop.Scoop
|
import com.ftinc.scoop.Scoop
|
||||||
|
import io.fabric.sdk.android.Fabric
|
||||||
|
|
||||||
|
|
||||||
class LoginActivity : AppCompatActivity() {
|
class LoginActivity : AppCompatActivity() {
|
||||||
@@ -42,6 +41,7 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
private var isWithHTTPLogin = false
|
private var isWithHTTPLogin = false
|
||||||
|
|
||||||
private lateinit var settings: SharedPreferences
|
private lateinit var settings: SharedPreferences
|
||||||
|
private lateinit var editor: SharedPreferences.Editor
|
||||||
private lateinit var mFirebaseAnalytics: FirebaseAnalytics
|
private lateinit var mFirebaseAnalytics: FirebaseAnalytics
|
||||||
private lateinit var mUrlView: EditText
|
private lateinit var mUrlView: EditText
|
||||||
private lateinit var mLoginView: TextView
|
private lateinit var mLoginView: TextView
|
||||||
@@ -50,6 +50,7 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
private lateinit var mPasswordView: EditText
|
private lateinit var mPasswordView: EditText
|
||||||
private lateinit var mHTTPPasswordView: EditText
|
private lateinit var mHTTPPasswordView: EditText
|
||||||
private lateinit var mLoginFormView: View
|
private lateinit var mLoginFormView: View
|
||||||
|
private var logErrors: Boolean = false
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -74,6 +75,10 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
|
|
||||||
settings = getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE)
|
settings = getSharedPreferences(Config.settingsName, Context.MODE_PRIVATE)
|
||||||
|
logErrors = settings.getBoolean("loging_debug", false)
|
||||||
|
|
||||||
|
editor = settings.edit()
|
||||||
|
|
||||||
if (settings.getString("url", "").isNotEmpty()) {
|
if (settings.getString("url", "").isNotEmpty()) {
|
||||||
goToMain()
|
goToMain()
|
||||||
} else {
|
} else {
|
||||||
@@ -149,7 +154,7 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
var cancel = false
|
var cancel = false
|
||||||
var focusView: View? = null
|
var focusView: View? = null
|
||||||
|
|
||||||
if (!url.isUrlValid()) {
|
if (!url.isBaseUrlValid()) {
|
||||||
mUrlView.error = getString(R.string.login_url_problem)
|
mUrlView.error = getString(R.string.login_url_problem)
|
||||||
focusView = mUrlView
|
focusView = mUrlView
|
||||||
cancel = true
|
cancel = true
|
||||||
@@ -186,7 +191,6 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
} else {
|
} else {
|
||||||
showProgress(true)
|
showProgress(true)
|
||||||
|
|
||||||
val editor = settings.edit()
|
|
||||||
editor.putString("url", url)
|
editor.putString("url", url)
|
||||||
editor.putString("login", login)
|
editor.putString("login", login)
|
||||||
editor.putString("httpUserName", httpLogin)
|
editor.putString("httpUserName", httpLogin)
|
||||||
@@ -196,7 +200,7 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
val api = SelfossApi(this, this@LoginActivity)
|
val api = SelfossApi(this, this@LoginActivity)
|
||||||
api.login().enqueue(object : Callback<SuccessResponse> {
|
api.login().enqueue(object : Callback<SuccessResponse> {
|
||||||
private fun preferenceError() {
|
private fun preferenceError(t: Throwable) {
|
||||||
editor.remove("url")
|
editor.remove("url")
|
||||||
editor.remove("login")
|
editor.remove("login")
|
||||||
editor.remove("httpUserName")
|
editor.remove("httpUserName")
|
||||||
@@ -208,6 +212,11 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
mPasswordView.error = getString(R.string.wrong_infos)
|
mPasswordView.error = getString(R.string.wrong_infos)
|
||||||
mHTTPLoginView.error = getString(R.string.wrong_infos)
|
mHTTPLoginView.error = getString(R.string.wrong_infos)
|
||||||
mHTTPPasswordView.error = getString(R.string.wrong_infos)
|
mHTTPPasswordView.error = getString(R.string.wrong_infos)
|
||||||
|
if (logErrors) {
|
||||||
|
Crashlytics.log(100, "LOGIN_DEBUG_ERRROR", t.message)
|
||||||
|
Crashlytics.logException(t)
|
||||||
|
Toast.makeText(this@LoginActivity, t.message, Toast.LENGTH_LONG).show()
|
||||||
|
}
|
||||||
showProgress(false)
|
showProgress(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -216,12 +225,12 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.LOGIN, Bundle())
|
mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.LOGIN, Bundle())
|
||||||
goToMain()
|
goToMain()
|
||||||
} else {
|
} else {
|
||||||
preferenceError()
|
preferenceError(Exception("No response body..."))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
|
override fun onFailure(call: Call<SuccessResponse>, t: Throwable) {
|
||||||
preferenceError()
|
preferenceError(t)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -260,6 +269,7 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
|
|
||||||
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
override fun onCreateOptionsMenu(menu: Menu): Boolean {
|
||||||
menuInflater.inflate(R.menu.login_menu, menu)
|
menuInflater.inflate(R.menu.login_menu, menu)
|
||||||
|
menu.findItem(R.id.loging_debug).isChecked = logErrors
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -273,6 +283,14 @@ class LoginActivity : AppCompatActivity() {
|
|||||||
.start(this)
|
.start(this)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
R.id.loging_debug -> {
|
||||||
|
val newState = !item.isChecked
|
||||||
|
item.isChecked = newState
|
||||||
|
logErrors = newState
|
||||||
|
editor.putBoolean("loging_debug", newState)
|
||||||
|
editor.apply()
|
||||||
|
return true
|
||||||
|
}
|
||||||
else -> return super.onOptionsItemSelected(item)
|
else -> return super.onOptionsItemSelected(item)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,20 +20,35 @@ import java.io.IOException
|
|||||||
class MyApp : MultiDexApplication() {
|
class MyApp : MultiDexApplication() {
|
||||||
override fun onCreate() {
|
override fun onCreate() {
|
||||||
super.onCreate()
|
super.onCreate()
|
||||||
if (!BuildConfig.DEBUG)
|
Fabric.with(this, Crashlytics())
|
||||||
Fabric.with(this, Crashlytics())
|
|
||||||
|
|
||||||
|
initAmplify()
|
||||||
|
|
||||||
|
initCache()
|
||||||
|
|
||||||
|
initDrawerImageLoader()
|
||||||
|
|
||||||
|
initTheme()
|
||||||
|
|
||||||
|
tryToHandleBug()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun initAmplify() {
|
||||||
Amplify.initSharedInstance(this)
|
Amplify.initSharedInstance(this)
|
||||||
.setFeedbackEmailAddress(getString(R.string.feedback_email))
|
.setFeedbackEmailAddress(getString(R.string.feedback_email))
|
||||||
.setAlwaysShow(BuildConfig.DEBUG)
|
.applyAllDefaultRules()
|
||||||
.applyAllDefaultRules()
|
}
|
||||||
|
|
||||||
|
private fun initCache() {
|
||||||
try {
|
try {
|
||||||
Reservoir.init(this, 8192) //in bytes
|
Reservoir.init(this, 8192) //in bytes
|
||||||
} catch (e: IOException) {
|
} catch (e: IOException) {
|
||||||
//failure
|
//failure
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun initDrawerImageLoader() {
|
||||||
DrawerImageLoader.init(object : AbstractDrawerImageLoader() {
|
DrawerImageLoader.init(object : AbstractDrawerImageLoader() {
|
||||||
override fun set(imageView: ImageView?, uri: Uri?, placeholder: Drawable?, tag: String?) {
|
override fun set(imageView: ImageView?, uri: Uri?, placeholder: Drawable?, tag: String?) {
|
||||||
Glide.with(imageView?.context).load(uri).placeholder(placeholder).into(imageView)
|
Glide.with(imageView?.context).load(uri).placeholder(placeholder).into(imageView)
|
||||||
@@ -47,6 +62,9 @@ class MyApp : MultiDexApplication() {
|
|||||||
return baseContext.resources.getDrawable(R.mipmap.ic_launcher)
|
return baseContext.resources.getDrawable(R.mipmap.ic_launcher)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun initTheme() {
|
||||||
Scoop.waffleCone()
|
Scoop.waffleCone()
|
||||||
.addFlavor(getString(R.string.default_theme), R.style.NoBar, true)
|
.addFlavor(getString(R.string.default_theme), R.style.NoBar, true)
|
||||||
.addFlavor(getString(R.string.default_dark_theme), R.style.NoBarDark)
|
.addFlavor(getString(R.string.default_dark_theme), R.style.NoBarDark)
|
||||||
@@ -64,6 +82,17 @@ class MyApp : MultiDexApplication() {
|
|||||||
.addFlavor(getString(R.string.red_teal_dark_theme), R.style.NoBarRedTealDark)
|
.addFlavor(getString(R.string.red_teal_dark_theme), R.style.NoBarRedTealDark)
|
||||||
.setSharedPreferences(PreferenceManager.getDefaultSharedPreferences(this))
|
.setSharedPreferences(PreferenceManager.getDefaultSharedPreferences(this))
|
||||||
.initialize()
|
.initialize()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun tryToHandleBug() {
|
||||||
|
val oldHandler = Thread.getDefaultUncaughtExceptionHandler()
|
||||||
|
|
||||||
|
Thread.setDefaultUncaughtExceptionHandler { thread, e ->
|
||||||
|
if (e is java.lang.NoClassDefFoundError && e.stackTrace.asList().any { it.toString().contains("android.view.ViewDebug") })
|
||||||
|
Unit
|
||||||
|
else
|
||||||
|
oldHandler.uncaughtException(thread, e)
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -100,12 +100,13 @@ class ReaderActivity : DragDismissActivity() {
|
|||||||
override fun onFailure(call: Call<ParsedContent>, t: Throwable) = openInBrowserAfterFailing()
|
override fun onFailure(call: Call<ParsedContent>, t: Throwable) = openInBrowserAfterFailing()
|
||||||
|
|
||||||
private fun openInBrowserAfterFailing() {
|
private fun openInBrowserAfterFailing() {
|
||||||
CustomTabActivityHelper.openCustomTab(this@ReaderActivity, customTabsIntent, Uri.parse(url)
|
this@ReaderActivity.openItemUrl(
|
||||||
) { _, uri ->
|
url,
|
||||||
val intent = Intent(Intent.ACTION_VIEW, uri)
|
customTabsIntent,
|
||||||
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
|
true,
|
||||||
startActivity(intent)
|
false,
|
||||||
}
|
this@ReaderActivity
|
||||||
|
)
|
||||||
finish()
|
finish()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -119,6 +119,7 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
|
|||||||
protected boolean isValidFragment(String fragmentName) {
|
protected boolean isValidFragment(String fragmentName) {
|
||||||
return PreferenceFragment.class.getName().equals(fragmentName)
|
return PreferenceFragment.class.getName().equals(fragmentName)
|
||||||
|| GeneralPreferenceFragment.class.getName().equals(fragmentName)
|
|| GeneralPreferenceFragment.class.getName().equals(fragmentName)
|
||||||
|
|| DebugPreferenceFragment.class.getName().equals(fragmentName)
|
||||||
|| LinksPreferenceFragment.class.getName().equals(fragmentName);
|
|| LinksPreferenceFragment.class.getName().equals(fragmentName);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -157,6 +158,26 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
|
||||||
|
public static class DebugPreferenceFragment extends PreferenceFragment {
|
||||||
|
@Override
|
||||||
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
|
addPreferencesFromResource(R.xml.pref_debug);
|
||||||
|
setHasOptionsMenu(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onOptionsItemSelected(MenuItem item) {
|
||||||
|
int id = item.getItemId();
|
||||||
|
if (id == android.R.id.home) {
|
||||||
|
getActivity().finish();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return super.onOptionsItemSelected(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This fragment shows general preferences only. It is used when the
|
* This fragment shows general preferences only. It is used when the
|
||||||
* activity is showing a two-pane settings UI.
|
* activity is showing a two-pane settings UI.
|
||||||
@@ -206,7 +227,9 @@ public class SettingsActivity extends AppCompatPreferenceActivity {
|
|||||||
public void onHeaderClick(Header header, int position) {
|
public void onHeaderClick(Header header, int position) {
|
||||||
super.onHeaderClick(header, position);
|
super.onHeaderClick(header, position);
|
||||||
if (header.id == R.id.theme_change) {
|
if (header.id == R.id.theme_change) {
|
||||||
getApplicationContext().startActivity(ScoopSettingsActivity.createIntent(getApplicationContext()));
|
Intent intent = ScoopSettingsActivity.createIntent(getApplicationContext());
|
||||||
|
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
|
||||||
|
getApplicationContext().startActivity(intent);
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,10 @@ fun Context.checkAndDisplayStoreApk() = {
|
|||||||
} else Unit
|
} else Unit
|
||||||
}
|
}
|
||||||
|
|
||||||
fun String.isUrlValid(): Boolean {
|
fun String.isUrlValid(): Boolean =
|
||||||
|
HttpUrl.parse(this) != null && Patterns.WEB_URL.matcher(this).matches()
|
||||||
|
|
||||||
|
fun String.isBaseUrlValid(): Boolean {
|
||||||
val baseUrl = HttpUrl.parse(this)
|
val baseUrl = HttpUrl.parse(this)
|
||||||
var existsAndEndsWithSlash = false
|
var existsAndEndsWithSlash = false
|
||||||
if (baseUrl != null) {
|
if (baseUrl != null) {
|
||||||
|
|||||||
@@ -55,7 +55,7 @@ fun Context.openItemUrl(linkDecoded: String,
|
|||||||
internalBrowser: Boolean,
|
internalBrowser: Boolean,
|
||||||
articleViewer: Boolean,
|
articleViewer: Boolean,
|
||||||
app: Activity) {
|
app: Activity) {
|
||||||
if (!internalBrowser) {
|
if (!internalBrowser || !linkDecoded.isUrlValid()) {
|
||||||
openInBrowser(linkDecoded, app)
|
openInBrowser(linkDecoded, app)
|
||||||
} else {
|
} else {
|
||||||
if (articleViewer) {
|
if (articleViewer) {
|
||||||
|
|||||||
BIN
app/src/main/res/drawable-hdpi/ic_bug_report.png
Normal file
|
After Width: | Height: | Size: 271 B |
BIN
app/src/main/res/drawable-mdpi/ic_bug_report.png
Normal file
|
After Width: | Height: | Size: 212 B |
BIN
app/src/main/res/drawable-xhdpi/ic_bug_report.png
Normal file
|
After Width: | Height: | Size: 312 B |
BIN
app/src/main/res/drawable-xxhdpi/ic_bug_report.png
Normal file
|
After Width: | Height: | Size: 466 B |
BIN
app/src/main/res/drawable-xxxhdpi/ic_bug_report.png
Normal file
|
After Width: | Height: | Size: 573 B |
@@ -2,12 +2,12 @@
|
|||||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
<item
|
<item
|
||||||
android:drawable="@color/white"/>
|
android:drawable="@color/ic_launcher_background"/>
|
||||||
|
|
||||||
<item>
|
<item>
|
||||||
<bitmap
|
<bitmap
|
||||||
android:gravity="center"
|
android:gravity="center"
|
||||||
android:src="@mipmap/ic_launcher"/>
|
android:src="@mipmap/ic_launcher_foreground"/>
|
||||||
</item>
|
</item>
|
||||||
|
|
||||||
</layer-list>
|
</layer-list>
|
||||||
11
app/src/main/res/layout/switch_item.xml
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<RelativeLayout
|
||||||
|
xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
|
android:layout_width="match_parent"
|
||||||
|
android:layout_height="match_parent">
|
||||||
|
|
||||||
|
<Switch
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_centerHorizontal="true"
|
||||||
|
android:layout_centerVertical="true" />
|
||||||
|
</RelativeLayout>
|
||||||
@@ -2,6 +2,14 @@
|
|||||||
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
<menu xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto">
|
xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
|
||||||
|
<item
|
||||||
|
android:id="@+id/loging_debug"
|
||||||
|
android:checkable="true"
|
||||||
|
android:checked="false"
|
||||||
|
android:icon="@drawable/ic_bug_report"
|
||||||
|
android:title="@string/login_menu_debug"
|
||||||
|
app:showAsAction="never" />
|
||||||
|
|
||||||
<item android:id="@+id/about"
|
<item android:id="@+id/about"
|
||||||
android:title="@string/action_about"
|
android:title="@string/action_about"
|
||||||
android:orderInCategory="102"
|
android:orderInCategory="102"
|
||||||
|
|||||||
5
app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@color/ic_launcher_background"/>
|
||||||
|
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
||||||
|
</adaptive-icon>
|
||||||
5
app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
<background android:drawable="@color/ic_launcher_background"/>
|
||||||
|
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
|
||||||
|
</adaptive-icon>
|
||||||
BIN
app/src/main/res/mipmap-hdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 4.2 KiB |
BIN
app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
Normal file
|
After Width: | Height: | Size: 3.6 KiB |
BIN
app/src/main/res/mipmap-hdpi/ic_launcher_round.png
Normal file
|
After Width: | Height: | Size: 4.2 KiB |
BIN
app/src/main/res/mipmap-mdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
app/src/main/res/mipmap-mdpi/ic_launcher_round.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
app/src/main/res/mipmap-xhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
Normal file
|
After Width: | Height: | Size: 5.2 KiB |
BIN
app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
@@ -131,4 +131,9 @@
|
|||||||
<string name="blue_amber_dark_theme">Bleu/Ambre/Foncé</string>
|
<string name="blue_amber_dark_theme">Bleu/Ambre/Foncé</string>
|
||||||
<string name="indigo_pink_dark_theme">Indigo/Rose/Foncé</string>
|
<string name="indigo_pink_dark_theme">Indigo/Rose/Foncé</string>
|
||||||
<string name="red_teal_dark_theme">Rouge/Sarcelle/Foncé</string>
|
<string name="red_teal_dark_theme">Rouge/Sarcelle/Foncé</string>
|
||||||
|
<string name="pref_header_debug">Debug</string>
|
||||||
|
<string name="login_debug_title">Activez pour loguer toutes les erreurs de conexion</string>
|
||||||
|
<string name="login_debug_on">Toutes les erreurs de connexion vont être loguées</string>
|
||||||
|
<string name="login_debug_off">Aucune erreur de connexion ne sera loguée</string>
|
||||||
|
<string name="login_menu_debug">Debug</string>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -131,4 +131,9 @@
|
|||||||
<string name="blue_amber_dark_theme">Blue/Amber/Dark</string>
|
<string name="blue_amber_dark_theme">Blue/Amber/Dark</string>
|
||||||
<string name="indigo_pink_dark_theme">Indigo/Pink/Dark</string>
|
<string name="indigo_pink_dark_theme">Indigo/Pink/Dark</string>
|
||||||
<string name="red_teal_dark_theme">Red/Teal/Dark</string>
|
<string name="red_teal_dark_theme">Red/Teal/Dark</string>
|
||||||
|
<string name="pref_header_debug">Debug</string>
|
||||||
|
<string name="login_debug_title">Activate to log login errors</string>
|
||||||
|
<string name="login_debug_on">Any error on the login page will be logged</string>
|
||||||
|
<string name="login_debug_off">No log on the login page</string>
|
||||||
|
<string name="login_menu_debug">Debug</string>
|
||||||
</resources>
|
</resources>
|
||||||
4
app/src/main/res/values/ic_launcher_background.xml
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<resources>
|
||||||
|
<color name="ic_launcher_background">#26B29F</color>
|
||||||
|
</resources>
|
||||||
@@ -133,4 +133,9 @@
|
|||||||
<string name="blue_amber_dark_theme">Blue/Amber/Dark</string>
|
<string name="blue_amber_dark_theme">Blue/Amber/Dark</string>
|
||||||
<string name="indigo_pink_dark_theme">Indigo/Pink/Dark</string>
|
<string name="indigo_pink_dark_theme">Indigo/Pink/Dark</string>
|
||||||
<string name="red_teal_dark_theme">Red/Teal/Dark</string>
|
<string name="red_teal_dark_theme">Red/Teal/Dark</string>
|
||||||
|
<string name="pref_header_debug">Debug</string>
|
||||||
|
<string name="login_debug_title">Activate to log login errors</string>
|
||||||
|
<string name="login_debug_on">Any error on the login page will be logged</string>
|
||||||
|
<string name="login_debug_off">No log on the login page</string>
|
||||||
|
<string name="login_menu_debug">Debug</string>
|
||||||
</resources>
|
</resources>
|
||||||
10
app/src/main/res/xml/pref_debug.xml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
|
|
||||||
|
<SwitchPreference
|
||||||
|
android:defaultValue="false"
|
||||||
|
android:key="loging_debug"
|
||||||
|
android:summaryOff="@string/login_debug_off"
|
||||||
|
android:summaryOn="@string/login_debug_on"
|
||||||
|
android:title="@string/login_debug_title" />
|
||||||
|
</PreferenceScreen>
|
||||||
@@ -5,6 +5,11 @@
|
|||||||
android:icon="@drawable/ic_settings_black_24dp"
|
android:icon="@drawable/ic_settings_black_24dp"
|
||||||
android:title="@string/pref_header_general"/>
|
android:title="@string/pref_header_general"/>
|
||||||
|
|
||||||
|
<header
|
||||||
|
android:fragment="apps.amine.bou.readerforselfoss.settings.SettingsActivity$DebugPreferenceFragment"
|
||||||
|
android:icon="@drawable/ic_bug_report"
|
||||||
|
android:title="@string/pref_header_debug"/>
|
||||||
|
|
||||||
<header
|
<header
|
||||||
android:id="@+id/theme_change"
|
android:id="@+id/theme_change"
|
||||||
android:icon="@drawable/ic_color_lens_black_24dp"
|
android:icon="@drawable/ic_color_lens_black_24dp"
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ buildscript {
|
|||||||
jcenter()
|
jcenter()
|
||||||
}
|
}
|
||||||
dependencies {
|
dependencies {
|
||||||
classpath 'com.android.tools.build:gradle:3.0.0-alpha5'
|
classpath 'com.android.tools.build:gradle:3.0.0-alpha8'
|
||||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||||
|
|
||||||
// NOTE: Do not place your application dependencies here; they belong
|
// NOTE: Do not place your application dependencies here; they belong
|
||||||
|
|||||||
56
circle.yml
@@ -1,56 +0,0 @@
|
|||||||
machine:
|
|
||||||
timezone: Europe/Paris
|
|
||||||
java:
|
|
||||||
version: 'oraclejdk8'
|
|
||||||
environment:
|
|
||||||
ANDROID_HOME: /usr/local/android-sdk-linux
|
|
||||||
PATH: ANDROID_HOME:$ANDROID_HOME/platform-tools:$ANDROID_BUUILD:$ANDROID_HOME/tools:$PATH
|
|
||||||
_JAVA_OPTIONS: "-Xms512m -Xmx1024m"
|
|
||||||
GRADLE_OPTS: '-Dorg.gradle.jvmargs="-Xmx2048m -XX:+HeapDumpOnOutOfMemoryError"'
|
|
||||||
|
|
||||||
dependencies:
|
|
||||||
pre:
|
|
||||||
- touch app/google-services.json
|
|
||||||
- echo $GOOGLE_SERVICES_JSON > app/google-services.json
|
|
||||||
- touch app/src/main/res/values/secrets.xml
|
|
||||||
- echo $SECRETS_XML > app/src/main/res/values/secrets.xml
|
|
||||||
- mkdir app/src/main/res/mipmap-hdpi
|
|
||||||
- convert -size 72x72 xc:white app/src/main/res/mipmap-hdpi/ic_launcher.png
|
|
||||||
- mkdir app/src/main/res/mipmap-mdpi
|
|
||||||
- convert -size 48x48 xc:white app/src/main/res/mipmap-mdpi/ic_launcher.png
|
|
||||||
- mkdir app/src/main/res/mipmap-xhdpi
|
|
||||||
- convert -size 96x96 xc:white app/src/main/res/mipmap-xhdpi/ic_launcher.png
|
|
||||||
- mkdir app/src/main/res/mipmap-xxhdpi
|
|
||||||
- convert -size 192x192 xc:white app/src/main/res/mipmap-xxhdpi/ic_launcher.png
|
|
||||||
- mkdir app/src/main/res/mipmap-xxxhdpi
|
|
||||||
- convert -size 512x512 xc:white app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
|
|
||||||
|
|
||||||
cache_directories:
|
|
||||||
- ~/.gradle
|
|
||||||
- ~/.android
|
|
||||||
|
|
||||||
override:
|
|
||||||
- echo y | android update sdk --no-ui --filter "android-26,build-tools-26.0.0"
|
|
||||||
- echo y | android update sdk --no-ui --all --filter "platform-tools, tools"
|
|
||||||
- echo y | android update sdk --no-ui --all --filter "android-26, build-tools-26.0.0"
|
|
||||||
- echo y | android update sdk --no-ui --all --filter "extra-android-m2repository"
|
|
||||||
- echo y | android update sdk --no-ui --all --filter "extra-android-support"
|
|
||||||
- echo y | android update sdk --no-ui --all --filter "extra-google-m2repository"
|
|
||||||
- echo y | android update sdk --no-ui --all --filter "extra-google-google_play_services"
|
|
||||||
|
|
||||||
test:
|
|
||||||
override:
|
|
||||||
- (TERM="dumb" ./gradlew assemble --configure-on-demand --no-daemon -P crashlyticsdemoApikey=$FABRIC_API_KEY -P crashlyticsdemoApisecret=$FABRIC_API_SECRET -P appLoginUrl=$LOGIN_URL -P appLoginUsername=$LOGIN_USER_NAME -P appLoginPassword=$LOGIN_PASSWORD -PdisablePreDex -Pandroid.threadPoolSize=1 -Porg.gradle.parallel=false):
|
|
||||||
timeout: 1440
|
|
||||||
- emulator -avd circleci-android22 -no-window:
|
|
||||||
background: true
|
|
||||||
parallel: true
|
|
||||||
- circle-android wait-for-boot
|
|
||||||
- sleep 30
|
|
||||||
- adb shell input keyevent 82
|
|
||||||
- adb shell input tap 650 300
|
|
||||||
- (TERM="dumb" ./gradlew connectedAndroidTest --configure-on-demand --no-daemon --stacktrace -P crashlyticsdemoApikey=$FABRIC_API_KEY -P crashlyticsdemoApisecret=$FABRIC_API_SECRET -P appLoginUrl=$LOGIN_URL -P appLoginUsername=$LOGIN_USER_NAME -P appLoginPassword=$LOGIN_PASSWORD -PdisablePreDex -Pandroid.threadPoolSize=1 -Porg.gradle.parallel=false):
|
|
||||||
timeout: 1440
|
|
||||||
- cp -r app/build/outputs $CIRCLE_ARTIFACTS
|
|
||||||
- cp -r app/build/reports/androidTests $CIRCLE_ARTIFACTS
|
|
||||||
- cp -r app/build/outputs/androidTest-results/* $CIRCLE_TEST_REPORTS
|
|
||||||