Skip to content

Commit b155946

Browse files
committed
Target SDK 33.
- Add notification settings.
1 parent 6b9588d commit b155946

File tree

15 files changed

+191
-30
lines changed

15 files changed

+191
-30
lines changed

gradle.properties

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
#Fri Jul 07 00:04:56 CST 2017
1616
org.gradle.jvmargs=-Xmx3072m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
1717
#org.gradle.jvmargs=-Xmx1536m
18-
android.enableD8=true
1918
android.useAndroidX=true
2019
android.enableJetifier=true
2120
android.debug.obsoleteApi=true

xkcd/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ android {
6969
defaultConfig {
7070
applicationId "xyz.jienan.xkcd"
7171
minSdkVersion 16
72-
targetSdkVersion 32
72+
targetSdkVersion 33
7373
versionCode 76
7474
versionName "2.8.2"
7575
vectorDrawables.useSupportLibrary = true
@@ -218,7 +218,7 @@ dependencies {
218218

219219
implementation 'androidx.work:work-runtime-ktx:2.8.0-beta02'
220220
implementation 'androidx.work:work-rxjava2:2.8.0-beta02'
221-
proprietaryImplementation 'com.google.firebase:firebase-analytics:21.2.0'
221+
proprietaryImplementation 'com.google.firebase:firebase-analytics:19.0.2'
222222
//noinspection GradleDependency
223223
proprietaryImplementation('com.google.firebase:firebase-messaging:22.0.0') {
224224
// 23.0.0 will require API level 19, Android 4.4 higher.

xkcd/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
<uses-permission android:name="android.permission.INTERNET" />
77
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
8+
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
89

910
<application
1011
android:name=".XkcdApplication"

xkcd/src/main/java/xyz/jienan/xkcd/Const.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ public class Const {
1414

1515
public static final String PREF_ARROW = "pref_arrow";
1616
public static final String PREF_RANDOM = "pref_random";
17+
18+
public static final String PREF_NOTIFICATION = "pref_notification";
1719
public static final String PREF_FONT = "pref_font";
1820
public static final String PREF_ZOOM = "pref_zoom";
1921
public static final String PREF_WHAT_IF_SEARCH = "pref_what_if_search";

xkcd/src/main/java/xyz/jienan/xkcd/base/NotificationWorker.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,15 @@
11
package xyz.jienan.xkcd.base
22

33
import android.content.Context
4+
import androidx.core.app.NotificationManagerCompat
5+
import androidx.preference.PreferenceManager
46
import androidx.work.RxWorker
57
import androidx.work.WorkerParameters
68
import io.reactivex.Completable
79
import io.reactivex.Single
810
import io.reactivex.schedulers.Schedulers
911
import timber.log.Timber
12+
import xyz.jienan.xkcd.Const
1013
import xyz.jienan.xkcd.base.network.NetworkService
1114
import xyz.jienan.xkcd.model.XkcdPic
1215
import xyz.jienan.xkcd.model.persist.BoxManager
@@ -32,7 +35,13 @@ class NotificationWorker(appContext: Context, workerParams: WorkerParameters)
3235
if (SharedPrefManager.latestXkcd < xkcdPic.num) {
3336
SharedPrefManager.latestXkcd = xkcdPic.num
3437
BoxManager.updateAndSave(xkcdPic)
35-
NotificationUtils.showNotification(applicationContext, xkcdPic)
38+
val allowNotification = PreferenceManager
39+
.getDefaultSharedPreferences(applicationContext)
40+
.getBoolean(Const.PREF_NOTIFICATION, true)
41+
&& NotificationManagerCompat.from(applicationContext).areNotificationsEnabled()
42+
if (allowNotification) {
43+
NotificationUtils.showNotification(applicationContext, xkcdPic)
44+
}
3645
}
3746
}
3847
}
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package xyz.jienan.xkcd.base.network
22

33

4-
import io.reactivex.Observable
4+
import io.reactivex.Single
55
import okhttp3.ResponseBody
66
import retrofit2.http.*
77
import xyz.jienan.xkcd.model.WhatIfArticle
@@ -10,16 +10,16 @@ interface WhatIfAPI {
1010

1111
@get:Headers("$HEADER_CACHEABLE: 600")
1212
@get:GET("archive/")
13-
val archive: Observable<ResponseBody>
13+
val archive: Single<ResponseBody>
1414

1515
@GET("{article_id}/")
16-
fun getArticle(@Path("article_id") id: Long): Observable<ResponseBody>
16+
fun getArticle(@Path("article_id") id: Long): Single<ResponseBody>
1717

1818
@FormUrlEncoded
1919
@POST
20-
fun thumbsUpWhatIf(@Url url: String, @Field("what_if_id") whatIfId: Int): Observable<WhatIfArticle>
20+
fun thumbsUpWhatIf(@Url url: String, @Field("what_if_id") whatIfId: Int): Single<WhatIfArticle>
2121

2222
@Headers("$HEADER_CACHEABLE: 60")
2323
@GET
24-
fun getTopWhatIfs(@Url url: String, @Query("sortby") sortby: String): Observable<List<WhatIfArticle>>
24+
fun getTopWhatIfs(@Url url: String, @Query("sortby") sortby: String): Single<List<WhatIfArticle>>
2525
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@ class SingleComicFragment : BaseFragment(), SingleComicContract.View {
201201
if (currentPic == null) {
202202
false
203203
} else {
204-
showInfoDialog(showAltText = comicOnly)
204+
showInfoDialog(showAltText = comicOnly && resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT)
205205
it.performHapticFeedback(LONG_PRESS)
206206
true
207207
}

xkcd/src/main/java/xyz/jienan/xkcd/list/presenter/WhatIfListPresenter.kt

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package xyz.jienan.xkcd.list.presenter
22

33
import android.view.View
4+
import io.reactivex.Flowable
45
import io.reactivex.Observable
6+
import io.reactivex.Single
57
import io.reactivex.android.schedulers.AndroidSchedulers
68
import io.reactivex.disposables.CompositeDisposable
79
import timber.log.Timber
@@ -39,14 +41,14 @@ class WhatIfListPresenter(private val view: WhatIfListContract.View) : ListPrese
3941
WhatIfModel.thumbUpList
4042
.observeOn(AndroidSchedulers.mainThread())
4143
.doOnSubscribe { view.setLoading(true) }
42-
.flatMapSingle { whatIfArticles ->
43-
Observable.fromIterable(whatIfArticles)
44+
.flatMap { whatIfArticles ->
45+
Flowable.fromIterable(whatIfArticles)
4446
.map { it.num }
4547
.filter { num -> num <= latest }
4648
.map { WhatIfModel.loadArticleFromDB(it)!! }
4749
.toList()
4850
}
49-
.doOnNext { view.setLoading(false) }
51+
.doOnSuccess { view.setLoading(false) }
5052
.subscribe({ view.updateData(it) },
5153
{ e -> Timber.e(e, "get top what if error") })
5254
.also { compositeDisposable.add(it) }

xkcd/src/main/java/xyz/jienan/xkcd/model/WhatIfModel.kt

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ package xyz.jienan.xkcd.model
22

33
import android.text.TextUtils
44
import io.reactivex.Completable
5+
import io.reactivex.Flowable
6+
import io.reactivex.Maybe
57
import io.reactivex.Observable
68
import io.reactivex.Single
79
import io.reactivex.android.schedulers.AndroidSchedulers
@@ -26,7 +28,7 @@ object WhatIfModel {
2628
val favWhatIf: List<WhatIfArticle>
2729
get() = BoxManager.favWhatIf
2830

29-
val thumbUpList: Observable<List<WhatIfArticle>>
31+
val thumbUpList: Single<List<WhatIfArticle>>
3032
get() = whatIfAPI.getTopWhatIfs(WHAT_IF_TOP, XKCD_TOP_SORT_BY_THUMB_UP)
3133
.subscribeOn(Schedulers.io())
3234

@@ -52,7 +54,6 @@ object WhatIfModel {
5254
fun loadAllWhatIf(): Single<List<WhatIfArticle>> {
5355
return whatIfAPI.archive
5456
.subscribeOn(Schedulers.io())
55-
.singleOrError()
5657
.map { WhatIfArticleUtil.getArticlesFromArchive(it) }
5758
.map { BoxManager.updateAndSaveWhatIf(it.toMutableList()) }
5859
}
@@ -65,7 +66,6 @@ object WhatIfModel {
6566
fun loadArticle(id: Long): Single<WhatIfArticle> {
6667
return loadArticleContentFromDB(id)
6768
.switchIfEmpty(loadArticleFromAPI(id))
68-
.singleOrError()
6969
.observeOn(AndroidSchedulers.mainThread())
7070
}
7171

@@ -90,42 +90,46 @@ object WhatIfModel {
9090
* @param index
9191
* @return thumb up count
9292
*/
93-
fun thumbsUp(index: Long): Observable<Long> {
93+
fun thumbsUp(index: Long): Single<Long> {
9494
return whatIfAPI.thumbsUpWhatIf(WHAT_IF_THUMBS_UP, index.toInt())
9595
.subscribeOn(Schedulers.io())
9696
.doOnSubscribe { BoxManager.likeWhatIf(index) }
9797
.map { it.thumbCount }
9898
}
9999

100100
fun fastLoadWhatIfs(index: Long): Completable =
101-
Observable.just(index)
102-
.flatMap<Long> {
101+
Flowable.just(index)
102+
.flatMap {
103103
if (index == 0L) {
104104
loadLatest().map { it.num }
105-
.flatMapObservable { Observable.rangeLong(1, it) }
105+
.toFlowable()
106+
.flatMap { Flowable.rangeLong(1, it) }
106107
} else {
107-
Observable.rangeLong(1, index)
108+
Flowable.rangeLong(1, index)
108109
}
109-
}.flatMap {
110+
}.flatMapSingle {
110111
if (loadArticleFromDB(it) == null || loadArticleFromDB(it)!!.content.isNullOrBlank()) {
111112
loadArticleFromAPI(it)
113+
.map { index }
114+
.onErrorReturnItem(index)
112115
} else {
113-
Observable.just(it)
116+
Single.just(it)
114117
}
115118
}
116119
.toList()
117120
.ignoreElement()
121+
.onErrorComplete()
118122

119-
private fun loadArticleFromAPI(id: Long): Observable<WhatIfArticle> {
123+
private fun loadArticleFromAPI(id: Long): Single<WhatIfArticle> {
120124
return whatIfAPI.getArticle(id)
121125
.subscribeOn(Schedulers.io())
122126
.map { WhatIfArticleUtil.getArticleFromHtml(it) }
123127
.map { it.html() }
124128
.map { BoxManager.updateAndSaveWhatIf(id, it) }
125129
}
126130

127-
private fun loadArticleContentFromDB(id: Long): Observable<WhatIfArticle> {
131+
private fun loadArticleContentFromDB(id: Long): Maybe<WhatIfArticle> {
128132
val article = BoxManager.getWhatIf(id)
129-
return if (article == null || TextUtils.isEmpty(article.content)) Observable.empty() else Observable.just(article)
133+
return if (article == null || TextUtils.isEmpty(article.content)) Maybe.empty() else Maybe.just(article)
130134
}
131135
}

0 commit comments

Comments
 (0)