Compare commits
9 Commits
Author | SHA1 | Date | |
---|---|---|---|
65974166be | |||
ee8924f986 | |||
170e575465 | |||
b7d5317b10 | |||
f12e7748c5 | |||
69a2418afc | |||
4924ddd172 | |||
1889b43786 | |||
f2e38a4203 |
14
CHANGELOG.md
@ -1,3 +1,17 @@
|
|||||||
|
**1.5.1.9**
|
||||||
|
|
||||||
|
- 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)
|
||||||
|
|
||||||
|
@ -24,9 +24,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 1519
|
||||||
versionName "1.5.1.6"
|
versionName "1.5.1.9"
|
||||||
|
|
||||||
// Enabling multidex support.
|
// Enabling multidex support.
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
@ -80,19 +80,19 @@ 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
|
||||||
compile 'com.google.firebase:firebase-core:11.0.1'
|
compile 'com.google.firebase:firebase-core:11.0.2'
|
||||||
compile 'com.google.firebase:firebase-config:11.0.1'
|
compile 'com.google.firebase:firebase-config:11.0.2'
|
||||||
compile 'com.google.firebase:firebase-invites:11.0.1'
|
compile 'com.google.firebase:firebase-invites:11.0.2'
|
||||||
compile('com.crashlytics.sdk.android:crashlytics:2.6.8@aar') {
|
compile('com.crashlytics.sdk.android:crashlytics:2.6.8@aar') {
|
||||||
transitive = true
|
transitive = true
|
||||||
}
|
}
|
||||||
@ -128,10 +128,10 @@ dependencies {
|
|||||||
compile 'com.github.stkent:amplify:1.5.0'
|
compile 'com.github.stkent:amplify:1.5.0'
|
||||||
|
|
||||||
// For the article reader
|
// For the article reader
|
||||||
compile 'com.klinkerapps:drag-dismiss-activity:1.4.1'
|
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'
|
||||||
|
@ -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()
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ 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.ftinc.scoop.Scoop
|
import com.ftinc.scoop.Scoop
|
||||||
|
|
||||||
|
|
||||||
@ -149,7 +149,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
|
||||||
|
@ -23,17 +23,31 @@ class MyApp : MultiDexApplication() {
|
|||||||
if (!BuildConfig.DEBUG)
|
if (!BuildConfig.DEBUG)
|
||||||
Fabric.with(this, Crashlytics())
|
Fabric.with(this, Crashlytics())
|
||||||
|
|
||||||
Amplify.initSharedInstance(this)
|
initAmplify()
|
||||||
.setFeedbackEmailAddress(getString(R.string.feedback_email))
|
|
||||||
.setAlwaysShow(BuildConfig.DEBUG)
|
|
||||||
.applyAllDefaultRules()
|
|
||||||
|
|
||||||
|
initCache()
|
||||||
|
|
||||||
|
initDrawerImageLoader()
|
||||||
|
|
||||||
|
initTheme()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun initAmplify() {
|
||||||
|
Amplify.initSharedInstance(this)
|
||||||
|
.setFeedbackEmailAddress(getString(R.string.feedback_email))
|
||||||
|
.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 +61,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 +81,5 @@ 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()
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -22,6 +22,7 @@ import apps.amine.bou.readerforselfoss.api.mercury.MercuryApi
|
|||||||
import apps.amine.bou.readerforselfoss.api.mercury.ParsedContent
|
import apps.amine.bou.readerforselfoss.api.mercury.ParsedContent
|
||||||
import apps.amine.bou.readerforselfoss.utils.buildCustomTabsIntent
|
import apps.amine.bou.readerforselfoss.utils.buildCustomTabsIntent
|
||||||
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
|
import apps.amine.bou.readerforselfoss.utils.customtabs.CustomTabActivityHelper
|
||||||
|
import apps.amine.bou.readerforselfoss.utils.openItemUrl
|
||||||
import apps.amine.bou.readerforselfoss.utils.shareLink
|
import apps.amine.bou.readerforselfoss.utils.shareLink
|
||||||
import com.ftinc.scoop.Scoop
|
import com.ftinc.scoop.Scoop
|
||||||
|
|
||||||
@ -84,10 +85,12 @@ class ReaderActivity : DragDismissActivity() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
browserBtn.setOnClickListener {
|
browserBtn.setOnClickListener {
|
||||||
val intent = Intent(Intent.ACTION_VIEW)
|
this@ReaderActivity.openItemUrl(
|
||||||
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
|
response.body()!!.url,
|
||||||
intent.data = Uri.parse(response.body()!!.url)
|
customTabsIntent,
|
||||||
startActivity(intent)
|
false,
|
||||||
|
false,
|
||||||
|
this@ReaderActivity)
|
||||||
}
|
}
|
||||||
|
|
||||||
hideProgressBar()
|
hideProgressBar()
|
||||||
@ -97,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()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
@ -212,7 +212,7 @@ class ItemCardAdapter(private val app: Activity,
|
|||||||
helper.bindCustomTabsService(app)
|
helper.bindCustomTabsService(app)
|
||||||
|
|
||||||
mView.setOnClickListener {
|
mView.setOnClickListener {
|
||||||
c.openItemUrl(items[adapterPosition],
|
c.openItemUrl(items[adapterPosition].getLinkDecoded(),
|
||||||
customTabsIntent,
|
customTabsIntent,
|
||||||
internalBrowser,
|
internalBrowser,
|
||||||
articleViewer,
|
articleViewer,
|
||||||
|
@ -223,7 +223,7 @@ class ItemListAdapter(private val app: Activity,
|
|||||||
|
|
||||||
if (!clickBehavior) {
|
if (!clickBehavior) {
|
||||||
mView.setOnClickListener {
|
mView.setOnClickListener {
|
||||||
c.openItemUrl(items[adapterPosition],
|
c.openItemUrl(items[adapterPosition].getLinkDecoded(),
|
||||||
customTabsIntent,
|
customTabsIntent,
|
||||||
internalBrowser,
|
internalBrowser,
|
||||||
articleViewer,
|
articleViewer,
|
||||||
@ -236,7 +236,7 @@ class ItemListAdapter(private val app: Activity,
|
|||||||
} else {
|
} else {
|
||||||
mView.setOnClickListener { actionBarShowHide() }
|
mView.setOnClickListener { actionBarShowHide() }
|
||||||
mView.setOnLongClickListener {
|
mView.setOnLongClickListener {
|
||||||
c.openItemUrl(items[adapterPosition],
|
c.openItemUrl(items[adapterPosition].getLinkDecoded(),
|
||||||
customTabsIntent,
|
customTabsIntent,
|
||||||
internalBrowser,
|
internalBrowser,
|
||||||
articleViewer,
|
articleViewer,
|
||||||
|
@ -206,7 +206,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) {
|
||||||
getBaseContext().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) {
|
||||||
|
@ -50,15 +50,13 @@ fun Context.buildCustomTabsIntent(): CustomTabsIntent {
|
|||||||
return intentBuilder.build()
|
return intentBuilder.build()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Context.openItemUrl(i: Item,
|
fun Context.openItemUrl(linkDecoded: String,
|
||||||
customTabsIntent: CustomTabsIntent,
|
customTabsIntent: CustomTabsIntent,
|
||||||
internalBrowser: Boolean,
|
internalBrowser: Boolean,
|
||||||
articleViewer: Boolean,
|
articleViewer: Boolean,
|
||||||
app: Activity) {
|
app: Activity) {
|
||||||
if (!internalBrowser) {
|
if (!internalBrowser || !linkDecoded.isUrlValid()) {
|
||||||
val intent = Intent(Intent.ACTION_VIEW)
|
openInBrowser(linkDecoded, app)
|
||||||
intent.data = Uri.parse(i.getLinkDecoded())
|
|
||||||
app.startActivity(intent)
|
|
||||||
} else {
|
} else {
|
||||||
if (articleViewer) {
|
if (articleViewer) {
|
||||||
val intent = Intent(this, ReaderActivity::class.java)
|
val intent = Intent(this, ReaderActivity::class.java)
|
||||||
@ -68,15 +66,25 @@ fun Context.openItemUrl(i: Item,
|
|||||||
.setDragElasticity(DragDismissIntentBuilder.DragElasticity.NORMAL) // Larger elasticities will make it easier to dismiss.
|
.setDragElasticity(DragDismissIntentBuilder.DragElasticity.NORMAL) // Larger elasticities will make it easier to dismiss.
|
||||||
.build(intent)
|
.build(intent)
|
||||||
|
|
||||||
intent.putExtra("url", i.getLinkDecoded())
|
intent.putExtra("url", linkDecoded)
|
||||||
app.startActivity(intent)
|
app.startActivity(intent)
|
||||||
} else {
|
} else {
|
||||||
CustomTabActivityHelper.openCustomTab(app, customTabsIntent, Uri.parse(i.getLinkDecoded())
|
try {
|
||||||
) { _, uri ->
|
CustomTabActivityHelper.openCustomTab(app, customTabsIntent, Uri.parse(linkDecoded)
|
||||||
val intent = Intent(Intent.ACTION_VIEW, uri)
|
) { _, uri ->
|
||||||
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
|
val intent = Intent(Intent.ACTION_VIEW, uri)
|
||||||
startActivity(intent)
|
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
|
||||||
|
startActivity(intent)
|
||||||
|
}
|
||||||
|
} catch (e: Exception) {
|
||||||
|
openInBrowser(linkDecoded, app)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun openInBrowser(linkDecoded: String, app: Activity) {
|
||||||
|
val intent = Intent(Intent.ACTION_VIEW)
|
||||||
|
intent.data = Uri.parse(linkDecoded)
|
||||||
|
app.startActivity(intent)
|
||||||
|
}
|
||||||
|
@ -1,9 +0,0 @@
|
|||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:width="24dp"
|
|
||||||
android:height="24dp"
|
|
||||||
android:viewportWidth="24.0"
|
|
||||||
android:viewportHeight="24.0">
|
|
||||||
<path
|
|
||||||
android:fillColor="#FF000000"
|
|
||||||
android:pathData="M11,17h2v-6h-2v6zM12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM12,20c-4.41,0 -8,-3.59 -8,-8s3.59,-8 8,-8 8,3.59 8,8 -3.59,8 -8,8zM11,9h2L13,7h-2v2z"/>
|
|
||||||
</vector>
|
|
@ -1,9 +0,0 @@
|
|||||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
android:width="24dp"
|
|
||||||
android:height="24dp"
|
|
||||||
android:viewportWidth="24.0"
|
|
||||||
android:viewportHeight="24.0">
|
|
||||||
<path
|
|
||||||
android:fillColor="#FF000000"
|
|
||||||
android:pathData="M19.43,12.98c0.04,-0.32 0.07,-0.64 0.07,-0.98s-0.03,-0.66 -0.07,-0.98l2.11,-1.65c0.19,-0.15 0.24,-0.42 0.12,-0.64l-2,-3.46c-0.12,-0.22 -0.39,-0.3 -0.61,-0.22l-2.49,1c-0.52,-0.4 -1.08,-0.73 -1.69,-0.98l-0.38,-2.65C14.46,2.18 14.25,2 14,2h-4c-0.25,0 -0.46,0.18 -0.49,0.42l-0.38,2.65c-0.61,0.25 -1.17,0.59 -1.69,0.98l-2.49,-1c-0.23,-0.09 -0.49,0 -0.61,0.22l-2,3.46c-0.13,0.22 -0.07,0.49 0.12,0.64l2.11,1.65c-0.04,0.32 -0.07,0.65 -0.07,0.98s0.03,0.66 0.07,0.98l-2.11,1.65c-0.19,0.15 -0.24,0.42 -0.12,0.64l2,3.46c0.12,0.22 0.39,0.3 0.61,0.22l2.49,-1c0.52,0.4 1.08,0.73 1.69,0.98l0.38,2.65c0.03,0.24 0.24,0.42 0.49,0.42h4c0.25,0 0.46,-0.18 0.49,-0.42l0.38,-2.65c0.61,-0.25 1.17,-0.59 1.69,-0.98l2.49,1c0.23,0.09 0.49,0 0.61,-0.22l2,-3.46c0.12,-0.22 0.07,-0.49 -0.12,-0.64l-2.11,-1.65zM12,15.5c-1.93,0 -3.5,-1.57 -3.5,-3.5s1.57,-3.5 3.5,-3.5 3.5,1.57 3.5,3.5 -1.57,3.5 -3.5,3.5z"/>
|
|
||||||
</vector>
|
|
BIN
app/src/main/res/drawable-hdpi/ic_info_outline.png
Normal file
After Width: | Height: | Size: 551 B |
BIN
app/src/main/res/drawable-hdpi/ic_settings.png
Normal file
After Width: | Height: | Size: 498 B |
BIN
app/src/main/res/drawable-mdpi/ic_info_outline.png
Normal file
After Width: | Height: | Size: 355 B |
BIN
app/src/main/res/drawable-mdpi/ic_settings.png
Normal file
After Width: | Height: | Size: 339 B |
BIN
app/src/main/res/drawable-xhdpi/ic_info_outline.png
Normal file
After Width: | Height: | Size: 725 B |
BIN
app/src/main/res/drawable-xhdpi/ic_settings.png
Normal file
After Width: | Height: | Size: 606 B |
BIN
app/src/main/res/drawable-xxhdpi/ic_info_outline.png
Normal file
After Width: | Height: | Size: 1.0 KiB |
BIN
app/src/main/res/drawable-xxhdpi/ic_settings.png
Normal file
After Width: | Height: | Size: 907 B |
BIN
app/src/main/res/drawable-xxxhdpi/ic_info_outline.png
Normal file
After Width: | Height: | Size: 1.4 KiB |
BIN
app/src/main/res/drawable-xxxhdpi/ic_settings.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
@ -1,7 +1,7 @@
|
|||||||
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
// Top-level build file where you can add configuration options common to all sub-projects/modules.
|
||||||
|
|
||||||
buildscript {
|
buildscript {
|
||||||
ext.kotlin_version = '1.1.3'
|
ext.kotlin_version = '1.1.3-2'
|
||||||
repositories {
|
repositories {
|
||||||
maven { url 'https://maven.google.com' }
|
maven { url 'https://maven.google.com' }
|
||||||
jcenter()
|
jcenter()
|
||||||
|
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
|
|