Skip to content

Commit 9b54bbd

Browse files
committed
Add offline xkcd
1 parent a42f4b8 commit 9b54bbd

30 files changed

+462
-257
lines changed

build.gradle

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,23 @@
11
// Top-level build file where you can add configuration options common to all sub-projects/modules.
22

33
buildscript {
4-
ext.objectboxVersion = '2.5.1'
5-
ext.booster_version = '1.5.1'
4+
ext.objectboxVersion = '2.6.0'
5+
ext.booster_version = '2.1.0'
66
ext.isProprietary = getGradle().getStartParameter().getTaskRequests().toString().contains("Proprietary")
77
repositories {
88
google()
99
jcenter()
1010

1111
}
1212
dependencies {
13-
classpath 'com.android.tools.build:gradle:3.6.2'
13+
classpath 'com.android.tools.build:gradle:4.0.0'
1414
if (isProprietary) {
1515
classpath 'com.google.gms:google-services:4.3.3'
16-
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.0.0-beta03'
17-
classpath "com.tencent.mm:AndResGuard-gradle-plugin:1.2.17"
16+
classpath 'com.google.firebase:firebase-crashlytics-gradle:2.1.1'
17+
classpath "com.tencent.mm:AndResGuard-gradle-plugin:1.2.18"
1818
}
1919
classpath "io.objectbox:objectbox-gradle-plugin:$objectboxVersion"
20-
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.61"
20+
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.72"
2121
classpath "com.didiglobal.booster:booster-gradle-plugin:$booster_version"
2222
classpath "com.didiglobal.booster:booster-transform-thread:$booster_version"
2323
classpath "com.didiglobal.booster:booster-transform-webview:$booster_version"

gradle.properties

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,8 @@ org.gradle.jvmargs=-Xmx3072m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryErro
1818
android.enableD8=true
1919
android.useAndroidX=true
2020
android.enableJetifier=true
21-
android.enableR8=true
2221
android.debug.obsoleteApi=true
2322
org.gradle.parallel=true
2423
org.gradle.configureondemand=true
2524
org.gradle.caching=true
26-
android.enableBuildScriptClasspathCheck=false
27-
android.enableSeparateAnnotationProcessing=true
25+
android.enableBuildScriptClasspathCheck=false

gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
33
distributionPath=wrapper/dists
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
6-
distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.4-all.zip
6+
distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-all.zip

xkcd/build.gradle

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,6 @@ android {
116116
minifyEnabled true
117117
zipAlignEnabled true
118118
shrinkResources true
119-
useProguard false
120119
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro', 'proguard-rules-no-obfuscate.pro'
121120
testProguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project-test.pro'
122121
applicationIdSuffix ".debug"
@@ -175,22 +174,22 @@ android {
175174
dependencies {
176175
implementation fileTree(include: ['*.jar'], dir: 'libs')
177176

178-
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.2'
177+
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.3'
179178
debugImplementation 'com.gu.android:toolargetool:0.2.1@aar'
180179
debugImplementation "io.objectbox:objectbox-android-objectbrowser:$objectboxVersion"
181180
releaseImplementation "io.objectbox:objectbox-android:$objectboxVersion"
182181

183-
implementation 'androidx.core:core-ktx:1.2.0'
182+
implementation 'androidx.core:core-ktx:1.3.0'
184183
implementation 'androidx.appcompat:appcompat:1.1.0'
185-
implementation 'androidx.preference:preference:1.1.0'
184+
implementation 'androidx.preference:preference:1.1.1'
186185
implementation 'androidx.media:media:1.1.0'
187186
implementation 'androidx.exifinterface:exifinterface:1.2.0'
188-
implementation 'androidx.recyclerview:recyclerview:1.2.0-alpha02'
189-
implementation 'com.google.android.material:material:1.2.0-alpha06'
187+
implementation 'androidx.recyclerview:recyclerview:1.2.0-alpha04'
188+
implementation 'com.google.android.material:material:1.3.0-alpha01'
190189
implementation 'androidx.percentlayout:percentlayout:1.0.0'
191190
implementation 'org.jsoup:jsoup:1.12.1'
192-
implementation 'com.squareup.retrofit2:converter-gson:2.6.4'
193-
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.6.4'
191+
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
192+
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0'
194193
//noinspection GradleDependency
195194
implementation('com.squareup.okhttp3:logging-interceptor:3.12.3') {
196195
force = true // don't change
@@ -201,10 +200,10 @@ dependencies {
201200
// https://cashapp.github.io/2019-02-05/okhttp-3-13-requires-android-5
202201
}
203202
implementation 'com.squareup:seismic:1.0.2'
204-
implementation 'io.reactivex.rxjava2:rxjava:2.2.10'
203+
implementation 'io.reactivex.rxjava2:rxjava:2.2.19'
205204
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
206205
implementation 'com.jakewharton.rxbinding3:rxbinding:3.1.0'
207-
implementation 'com.google.code.gson:gson:2.8.5'
206+
implementation 'com.google.code.gson:gson:2.8.6'
208207
//noinspection GradleDependency
209208
implementation('com.github.bumptech.glide:glide:3.8.0') {
210209
force = true
@@ -217,11 +216,11 @@ dependencies {
217216
implementation 'me.dkzwm.widget.srl:core:1.6.6.7.androidx'
218217
implementation 'me.dkzwm.widget.srl:ext-classics:1.6.6.7.androidx'
219218

220-
fossImplementation "androidx.work:work-runtime-ktx:2.3.4"
221-
fossImplementation "androidx.work:work-rxjava2:2.3.4"
222-
proprietaryImplementation 'com.google.firebase:firebase-analytics:17.3.0'
223-
proprietaryImplementation 'com.google.firebase:firebase-messaging:20.1.5'
224-
proprietaryImplementation 'com.google.firebase:firebase-crashlytics:17.0.0-beta04'
219+
implementation "androidx.work:work-runtime-ktx:2.3.4"
220+
implementation "androidx.work:work-rxjava2:2.3.4"
221+
proprietaryImplementation 'com.google.firebase:firebase-analytics:17.4.3'
222+
proprietaryImplementation 'com.google.firebase:firebase-messaging:20.2.1'
223+
proprietaryImplementation 'com.google.firebase:firebase-crashlytics:17.1.0'
225224

226225
// implementation 'androidx.slice:slice-core:1.0.0'
227226
// implementation 'androidx.slice:slice-builders:1.0.0'

xkcd/src/main/AndroidManifest.xml

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,21 @@
33
xmlns:tools="http://schemas.android.com/tools"
44
package="xyz.jienan.xkcd">
55

6-
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
76
<uses-permission android:name="android.permission.INTERNET" />
7+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
88

99
<application
1010
android:name=".XkcdApplication"
1111
android:allowBackup="true"
12+
android:extractNativeLibs="true"
1213
android:icon="@mipmap/ic_launcher"
1314
android:label="@string/app_name"
15+
android:networkSecurityConfig="@xml/network_security_config"
1416
android:roundIcon="@mipmap/ic_launcher_round"
1517
android:supportsRtl="true"
16-
android:extractNativeLibs="true"
17-
tools:replace="android:extractNativeLibs"
18-
android:networkSecurityConfig="@xml/network_security_config"
1918
android:theme="@style/AppBarFontTheme"
20-
tools:ignore="GoogleAppIndexingWarning,UnusedAttribute">
19+
tools:ignore="GoogleAppIndexingWarning,UnusedAttribute"
20+
tools:replace="android:extractNativeLibs">
2121

2222
<activity
2323
android:name=".home.MainActivity"
@@ -37,20 +37,20 @@
3737
<activity
3838
android:name=".comics.activity.ImageDetailPageActivity"
3939
android:configChanges="screenSize|orientation|keyboardHidden"
40-
android:theme="@style/TransparentBackgroundTheme"
41-
android:launchMode="singleTask" />
40+
android:launchMode="singleTask"
41+
android:theme="@style/TransparentBackgroundTheme" />
4242

4343
<activity
4444
android:name=".comics.activity.ImageWebViewActivity"
4545
android:configChanges="screenSize|orientation|keyboardHidden"
46-
android:theme="@style/TransparentBackgroundTheme"
4746
android:label=" "
48-
android:launchMode="singleTask" />
47+
android:launchMode="singleTask"
48+
android:theme="@style/TransparentBackgroundTheme" />
4949

5050
<activity
5151
android:name=".settings.PreferenceActivity"
52-
android:label="@string/settings"
5352
android:configChanges="screenSize|orientation|keyboardHidden|uiMode"
53+
android:label="@string/settings"
5454
android:launchMode="singleTop" />
5555

5656
<activity
@@ -63,9 +63,6 @@
6363
android:configChanges="screenSize|orientation|keyboardHidden"
6464
android:label="@string/title_what_if_list" />
6565

66-
<service android:name=".whatif.WhatIfFastLoadService"
67-
android:permission="android.permission.BIND_JOB_SERVICE" />
68-
6966
<meta-data
7067
android:name="xyz.jienan.xkcd.base.glide.OkHttpProgressGlideModule"
7168
android:value="GlideModule" />

xkcd/src/main/java/xyz/jienan/xkcd/XkcdApplication.kt

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
11
package xyz.jienan.xkcd
22

3+
import android.annotation.SuppressLint
34
import android.app.Application
45
import android.content.res.Configuration
56
import androidx.appcompat.app.AppCompatDelegate
67
import androidx.preference.PreferenceManager
8+
import androidx.work.*
79
import xyz.jienan.xkcd.base.glide.GlideImageLoader
810
import xyz.jienan.xkcd.model.MyObjectBox
911
import xyz.jienan.xkcd.model.XkcdModel
1012
import xyz.jienan.xkcd.model.persist.BoxManager
1113
import xyz.jienan.xkcd.model.persist.SharedPrefManager
1214
import xyz.jienan.xkcd.model.util.XkcdSideloadUtils
15+
import xyz.jienan.xkcd.model.work.WhatIfFastLoadWorker
16+
import xyz.jienan.xkcd.model.work.XkcdFastLoadWorker
1317
import xyz.jienan.xkcd.ui.xkcdimageview.ImageLoaderFactory
1418

1519
/**
@@ -38,6 +42,7 @@ class XkcdApplication : Application() {
3842
SharedPrefManager.init(this)
3943

4044
ImageLoaderFactory.initialize(GlideImageLoader.with(this))
45+
fastLoad()
4146
}
4247

4348
companion object {
@@ -55,4 +60,27 @@ class XkcdApplication : Application() {
5560
XkcdModel.localizedUrl = resources.getString(R.string.api_xkcd_localization)
5661
FlavorUtils.updateLocale()
5762
}
63+
64+
65+
@SuppressLint("EnqueueWork")
66+
private fun fastLoad() {
67+
val xkcdFastLoadRequest: OneTimeWorkRequest =
68+
OneTimeWorkRequestBuilder<XkcdFastLoadWorker>()
69+
.setConstraints(Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build())
70+
.addTag("xkcd")
71+
.build()
72+
73+
val whatIfFastLoad: OneTimeWorkRequest =
74+
OneTimeWorkRequestBuilder<WhatIfFastLoadWorker>()
75+
.setConstraints(Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build())
76+
.build()
77+
78+
val xkcdWork = WorkManager.getInstance(this)
79+
.beginUniqueWork("xkcd", ExistingWorkPolicy.KEEP, xkcdFastLoadRequest)
80+
81+
val whatIfWork = WorkManager.getInstance(this)
82+
.beginUniqueWork("what_if", ExistingWorkPolicy.KEEP, whatIfFastLoad)
83+
84+
WorkContinuation.combine(listOf(xkcdWork, whatIfWork)).enqueue()
85+
}
5886
}

xkcd/src/main/java/xyz/jienan/xkcd/base/glide/OkHttpProgressGlideModule.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.bumptech.glide.Glide;
88
import com.bumptech.glide.GlideBuilder;
99
import com.bumptech.glide.integration.okhttp3.OkHttpUrlLoader;
10+
import com.bumptech.glide.load.engine.cache.InternalCacheDiskCacheFactory;
1011
import com.bumptech.glide.load.model.GlideUrl;
1112
import com.bumptech.glide.module.GlideModule;
1213

@@ -46,7 +47,7 @@ public static void expect(String url, UIProgressListener listener) {
4647

4748
@Override
4849
public void applyOptions(Context context, GlideBuilder builder) {
49-
50+
builder.setDiskCache(new InternalCacheDiskCacheFactory(context, 600 * 1024 * 1024));
5051
}
5152

5253
@Override

xkcd/src/main/java/xyz/jienan/xkcd/comics/contract/ComicsMainContract.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@ interface View extends BaseView<Presenter> {
2323

2424
interface Presenter extends ContentMainBasePresenter {
2525

26-
void fastLoad(int latestIndex);
27-
2826
long getBookmark();
2927

3028
boolean setBookmark(long index);

xkcd/src/main/java/xyz/jienan/xkcd/comics/fragment/ComicsMainFragment.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ class ComicsMainFragment : ContentMainBaseFragment(), ComicsMainContract.View {
4444
override fun latestXkcdLoaded(xkcdPic: XkcdPic) {
4545
latestIndex = xkcdPic.num.toInt()
4646
super.latestLoaded()
47-
(presenter as ComicsMainPresenter).fastLoad(latestIndex)
4847
}
4948

5049
override fun showFab(xkcdPic: XkcdPic) {
@@ -84,7 +83,7 @@ class ComicsMainFragment : ContentMainBaseFragment(), ComicsMainContract.View {
8483
}
8584

8685
override fun showThumbUpCount(thumbCount: Long?) {
87-
showToast(context!!, thumbCount.toString())
86+
showToast(requireContext(), thumbCount.toString())
8887
}
8988

9089
override fun renderXkcdSearch(xkcdPics: List<XkcdPic>) {
@@ -112,7 +111,7 @@ class ComicsMainFragment : ContentMainBaseFragment(), ComicsMainContract.View {
112111
override fun onTabTitleDoubleTap() {
113112
if (currentIndex > 0) {
114113
(presenter as ComicsMainPresenter).bookmark = currentIndex.toLong()
115-
showToast(context!!, getString(R.string.bookmark_saved))
114+
showToast(requireContext(), getString(R.string.bookmark_saved))
116115
view?.performHapticFeedback(LONG_PRESS, FLAG_IGNORE_GLOBAL_SETTING)
117116
logUXEvent(Const.FIRE_XKCD_BOOKMARK_DOUBLE_TAP)
118117
}

xkcd/src/main/java/xyz/jienan/xkcd/comics/presenter/ComicsMainPresenter.kt

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -53,17 +53,6 @@ class ComicsMainPresenter(private val view: ComicsMainContract.View) : ComicsMai
5353
view.toggleFab(isFav)
5454
}
5555

56-
override fun fastLoad(latestIndex: Int) {
57-
if (latestIndex <= 0) {
58-
return
59-
}
60-
Timber.d("Start fast load")
61-
XkcdModel.fastLoad(latestIndex)
62-
.subscribe({ Timber.d("Fast load succeed") },
63-
{ e -> Timber.e(e, "Error in fast load") })
64-
.also { compositeDisposable.add(it) }
65-
}
66-
6756
override fun getInfoAndShowFab(index: Int) {
6857
if (!fabShowDisposable.isDisposed) {
6958
fabShowDisposable.dispose()
@@ -149,7 +138,7 @@ class ComicsMainPresenter(private val view: ComicsMainContract.View) : ComicsMai
149138

150139
override fun getBookmark() = SharedPrefManager.getBookmark(XKCD_BOOKMARK)
151140

152-
override fun setBookmark(index: Long) : Boolean {
141+
override fun setBookmark(index: Long): Boolean {
153142
return if (index > 0) {
154143
SharedPrefManager.setBookmark(XKCD_BOOKMARK, index)
155144
true

0 commit comments

Comments
 (0)