Skip to content

Commit 86fedd5

Browse files
author
Moroi
committed
implement a function to check if imageAdapter is null to avoid a crash due to UninitializedPropertyAccessException
1 parent c4ec2a2 commit 86fedd5

File tree

10 files changed

+63
-40
lines changed

10 files changed

+63
-40
lines changed

FishBun/src/main/java/com/sangcomz/fishbun/Fishton.kt

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ import android.graphics.drawable.Drawable
66
import android.net.Uri
77
import com.sangcomz.fishbun.adapter.image.ImageAdapter
88
import com.sangcomz.fishbun.util.getDimension
9-
import java.util.ArrayList
109

1110
/**
1211
* Created by seokwon.jeong on 04/01/2018.
1312
*/
1413
object Fishton {
15-
lateinit var imageAdapter: ImageAdapter
14+
// System may destroy Activity due to system constraints
15+
// such as configuration change or memory pressure.
16+
// That's why this should be belonged to callsite's lifecycle.
17+
var imageAdapter: ImageAdapter? = null
1618
var currentPickerImageList: List<Uri> = emptyList()
1719

1820
//BaseParams

FishBun/src/main/java/com/sangcomz/fishbun/datasource/FishBunDataSource.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ interface FishBunDataSource {
2424
fun getAllViewTitle(): String
2525
fun getDetailViewData(): DetailImageViewData
2626
fun getAlbumViewData(): AlbumViewData
27-
fun getImageAdapter(): ImageAdapter
27+
fun getImageAdapter(): ImageAdapter?
2828
fun gatAlbumMenuViewData(): AlbumMenuViewData
2929
fun getPickerViewData(): PickerViewData
3030
fun setCurrentPickerImageList(pickerImageList: List<Uri>)

FishBun/src/main/java/com/sangcomz/fishbun/ui/album/adapter/AlbumListAdapter.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ class AlbumListAdapter(
3232
}
3333

3434
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
35-
val binding =
3635
return ViewHolder(
3736
parent,
3837
thumbnailSize,

FishBun/src/main/java/com/sangcomz/fishbun/ui/album/model/repository/AlbumRepository.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ interface AlbumRepository {
1515

1616
fun getAlbumViewData(): AlbumViewData
1717

18-
fun getImageAdapter(): ImageAdapter
18+
fun getImageAdapter(): ImageAdapter?
1919

2020
fun getSelectedImageList(): List<Uri>
2121

FishBun/src/main/java/com/sangcomz/fishbun/ui/album/mvp/AlbumPresenter.kt

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
package com.sangcomz.fishbun.ui.album.mvp
22

33
import android.net.Uri
4-
import android.os.Environment
5-
import com.sangcomz.fishbun.ui.album.model.Album
6-
import com.sangcomz.fishbun.ui.album.model.repository.AlbumRepository
74
import com.sangcomz.fishbun.ui.album.AlbumContract
5+
import com.sangcomz.fishbun.ui.album.model.Album
86
import com.sangcomz.fishbun.ui.album.model.AlbumMenuViewData
7+
import com.sangcomz.fishbun.ui.album.model.repository.AlbumRepository
98
import com.sangcomz.fishbun.util.UiHandler
109
import com.sangcomz.fishbun.util.future.CallableFutureTask
1110
import com.sangcomz.fishbun.util.future.FutureCallback
12-
import java.util.ArrayList
1311

1412
class AlbumPresenter(
1513
private val albumView: AlbumContract.View,
@@ -21,25 +19,11 @@ class AlbumPresenter(
2119

2220
override fun loadAlbumList() {
2321
albumListFuture = albumRepository.getAlbumList()
24-
25-
albumListFuture?.let {
26-
it.execute(object : FutureCallback<List<Album>> {
27-
override fun onSuccess(result: List<Album>) {
28-
uiHandler.run {
29-
if (result.isNotEmpty()) {
30-
changeToolbarTitle()
31-
albumView.showAlbumList(
32-
it.get(),
33-
albumRepository.getImageAdapter(),
34-
albumRepository.getAlbumViewData()
35-
)
36-
} else {
37-
albumView.showEmptyView()
38-
}
39-
}
40-
}
41-
})
42-
}
22+
albumListFuture?.execute(object : FutureCallback<List<Album>> {
23+
override fun onSuccess(result: List<Album>) {
24+
handleResult(result)
25+
}
26+
})
4327
}
4428

4529
override fun takePicture() {
@@ -111,6 +95,27 @@ class AlbumPresenter(
11195
albumView.scanAndRefresh()
11296
}
11397

98+
private fun handleResult(result: List<Album>) {
99+
val adapter = albumRepository.getImageAdapter()
100+
// imageAdapter is null, so we can not proceed anymore
101+
if (adapter == null) {
102+
finish()
103+
return
104+
}
105+
uiHandler.run {
106+
if (result.isNotEmpty()) {
107+
changeToolbarTitle()
108+
albumView.showAlbumList(
109+
result,
110+
adapter,
111+
albumRepository.getAlbumViewData()
112+
)
113+
} else {
114+
albumView.showEmptyView()
115+
}
116+
}
117+
}
118+
114119
companion object {
115120
private const val defaultDir = "/Camera"
116121
}

FishBun/src/main/java/com/sangcomz/fishbun/ui/detail/model/DetailImageRepository.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ interface DetailImageRepository {
1010
fun getImageIndex(imageUri: Uri): Int
1111
fun selectImage(imageUri: Uri)
1212
fun unselectImage(imageUri: Uri)
13-
fun getImageAdapter(): ImageAdapter
13+
fun getImageAdapter(): ImageAdapter?
1414
fun isFullSelected(): Boolean
1515
fun checkForFinish(): Boolean
1616
fun getMessageLimitReached(): String

FishBun/src/main/java/com/sangcomz/fishbun/ui/detail/mvp/DetailImagePresenter.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package com.sangcomz.fishbun.ui.detail.mvp
22

33
import android.net.Uri
4-
import androidx.annotation.VisibleForTesting
54
import com.sangcomz.fishbun.ui.detail.DetailImageContract
65
import com.sangcomz.fishbun.ui.detail.model.DetailImageRepository
76

@@ -66,7 +65,13 @@ class DetailImagePresenter(
6665
}
6766

6867
private fun initViewPagerAdapter() {
69-
detailView.initViewPagerAdapter(detailImageRepository.getImageAdapter())
68+
val adapter = detailImageRepository.getImageAdapter()
69+
// we can not proceed any more if imageAdapter is null
70+
if (adapter == null) {
71+
detailView.finishActivity()
72+
return
73+
}
74+
detailView.initViewPagerAdapter(adapter)
7075
}
7176

7277
private fun changeButtonStatusInternal(imageUri: Uri) {

FishBun/src/main/java/com/sangcomz/fishbun/ui/picker/PickerPresenter.kt

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class PickerPresenter internal constructor(
3838
.also {
3939
it.execute(object : FutureCallback<List<Uri>> {
4040
override fun onSuccess(result: List<Uri>) {
41-
onSuccessAllMediaThumbnailsPath(result)
41+
handleResult(result)
4242
}
4343
})
4444
}
@@ -47,7 +47,10 @@ class PickerPresenter internal constructor(
4747
override fun transImageFinish() {
4848
val albumData = pickerRepository.getPickerAlbumData() ?: return
4949

50-
pickerView.takeANewPictureWithFinish(albumData.albumPosition, pickerRepository.getAddedPathList())
50+
pickerView.takeANewPictureWithFinish(
51+
albumData.albumPosition,
52+
pickerRepository.getAddedPathList()
53+
)
5154
}
5255

5356
override fun takePicture() {
@@ -146,7 +149,7 @@ class PickerPresenter internal constructor(
146149
}
147150

148151
override fun onSuccessTakePicture() {
149-
pickerView.onSuccessTakePicture()
152+
pickerView.onSuccessTakePicture()
150153
}
151154

152155
override fun release() {
@@ -219,6 +222,7 @@ class PickerPresenter internal constructor(
219222
}
220223

221224
private fun onSuccessAllMediaThumbnailsPath(imageUriList: List<Uri>) {
225+
val adapter = requireNotNull(pickerRepository.getImageAdapter())
222226
pickerRepository.setCurrentPickerImageList(imageUriList)
223227

224228
val viewData = pickerRepository.getPickerViewData()
@@ -227,15 +231,14 @@ class PickerPresenter internal constructor(
227231
if (pickerRepository.hasCameraInPickerPage()) {
228232
pickerList.add(PickerListItem.Camera)
229233
}
230-
231234
imageUriList.map {
232235
PickerListItem.Image(it, selectedImageList.indexOf(it), viewData)
233236
}.also {
234237
pickerList.addAll(it)
235238
uiHandler.run {
236239
pickerView.showImageList(
237240
pickerList,
238-
pickerRepository.getImageAdapter(),
241+
adapter,
239242
pickerRepository.hasCameraInPickerPage()
240243
)
241244
setToolbarTitle()
@@ -250,7 +253,7 @@ class PickerPresenter internal constructor(
250253
.also {
251254
it.execute(object : FutureCallback<List<Uri>> {
252255
override fun onSuccess(result: List<Uri>) {
253-
onSuccessAllMediaThumbnailsPath(result)
256+
handleResult(result)
254257
}
255258
})
256259
}
@@ -263,4 +266,13 @@ class PickerPresenter internal constructor(
263266
pickerView.finishActivity()
264267
}
265268
}
266-
}
269+
270+
private fun handleResult(result: List<Uri>) {
271+
if (pickerRepository.getImageAdapter() != null) {
272+
onSuccessAllMediaThumbnailsPath(result)
273+
} else {
274+
// imageAdapter is null, so we can not proceed anymore
275+
finish()
276+
}
277+
}
278+
}

FishBun/src/main/java/com/sangcomz/fishbun/ui/picker/model/PickerRepository.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ interface PickerRepository {
2323

2424
fun getSelectedImageList(): List<Uri>
2525

26-
fun getImageAdapter(): ImageAdapter
26+
fun getImageAdapter(): ImageAdapter?
2727

2828
fun hasCameraInPickerPage(): Boolean
2929

FishBun/src/main/java/com/sangcomz/fishbun/ui/picker/model/PickerRepositoryImpl.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class PickerRepositoryImpl(
5959

6060
override fun getSelectedImageList() = fishBunDataSource.getSelectedImageList()
6161

62-
override fun getImageAdapter(): ImageAdapter = fishBunDataSource.getImageAdapter()
62+
override fun getImageAdapter(): ImageAdapter? = fishBunDataSource.getImageAdapter()
6363

6464
override fun hasCameraInPickerPage(): Boolean {
6565
return when {

0 commit comments

Comments
 (0)