Skip to content

Commit 4703f5d

Browse files
committed
Merge branch 'dev'
2 parents 878d8c5 + f0d4090 commit 4703f5d

File tree

12 files changed

+158
-75
lines changed

12 files changed

+158
-75
lines changed

CHANGELOG.md

+4
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
### v3.1.0
2+
- Added progress bar in dialog for when icon pack is not loaded yet.
3+
- Fixed `IconDialogSettings.dialogTitle` having no effect.
4+
15
# v3.0.0
26
- Complete rewrite in Kotlin with MVP architecture.
37
- Now based on Google's Material Components with out of the box support for dark theme.

app/src/main/kotlin/com/maltaisn/icondialog/demo/MainFragment.kt

+10-28
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@ import androidx.annotation.ArrayRes
2828
import androidx.appcompat.app.AppCompatDelegate
2929
import androidx.appcompat.content.res.AppCompatResources
3030
import androidx.core.graphics.drawable.DrawableCompat
31-
import androidx.core.view.isInvisible
32-
import androidx.core.view.isVisible
3331
import androidx.core.widget.addTextChangedListener
3432
import androidx.fragment.app.Fragment
3533
import androidx.recyclerview.widget.LinearLayoutManager
@@ -55,12 +53,10 @@ class MainFragment : Fragment(), IconDialog.Callback {
5553

5654
private val coroutineScope = CoroutineScope(Dispatchers.Main + SupervisorJob())
5755
private var packLoadJob: Job? = null
58-
private var progressVisbJob: Job? = null
5956

6057
private lateinit var iconDialog: IconDialog
6158
private lateinit var iconsAdapter: IconsAdapter
62-
private lateinit var iconPackPb: ProgressBar
63-
private lateinit var fab: FloatingActionButton
59+
private lateinit var fakeLoadingCheck: CheckBox
6460

6561
private lateinit var iconPackLoader: IconPackLoader
6662

@@ -84,7 +80,6 @@ class MainFragment : Fragment(), IconDialog.Callback {
8480
setupDropdown(view.findViewById(R.id.dropdown_icon_pack), R.array.icon_packs) {
8581
changeIconPack(it)
8682
}
87-
iconPackPb = view.findViewById(R.id.pb_icon_pack)
8883

8984
var titleVisbIndex = 2
9085
setupDropdown(view.findViewById(R.id.dropdown_title_visibility), R.array.title_visibility) {
@@ -142,16 +137,15 @@ class MainFragment : Fragment(), IconDialog.Callback {
142137
})
143138
}
144139

140+
fakeLoadingCheck = view.findViewById(R.id.chk_fake_loading)
141+
145142
val iconsRcv: RecyclerView = view.findViewById(R.id.rcv_icon_list)
146143
iconsAdapter = IconsAdapter()
147144
iconsRcv.adapter = iconsAdapter
148145
iconsRcv.layoutManager = LinearLayoutManager(context)
149146

150-
fab = view.findViewById(R.id.fab)
151-
fab.isVisible = (app.iconPack != null)
147+
val fab: FloatingActionButton = view.findViewById(R.id.fab)
152148
fab.setOnClickListener {
153-
if (app.iconPack == null) return@setOnClickListener
154-
155149
// Create new settings and set them.
156150
iconDialog.settings = IconDialogSettings {
157151
this.iconFilter = iconFilter
@@ -241,29 +235,17 @@ class MainFragment : Fragment(), IconDialog.Callback {
241235
// Load drawables
242236
pack.loadDrawables(iconPackLoader.drawableLoader)
243237

238+
if (fakeLoadingCheck.isChecked) {
239+
delay(4000)
240+
}
241+
244242
pack
245243
}
246244

247-
iconPackPb.isInvisible = true
248-
fab.show()
249-
250245
updateSelectedIcons()
251246

252-
progressVisbJob?.cancel()
253-
progressVisbJob = null
254247
packLoadJob = null
255248
}
256-
257-
// Start new job to show progress after some delay.
258-
progressVisbJob?.cancel()
259-
progressVisbJob = coroutineScope.launch(Dispatchers.Default) {
260-
delay(250)
261-
withContext(Dispatchers.Main) {
262-
iconPackPb.isInvisible = false
263-
fab.hide()
264-
}
265-
progressVisbJob = null
266-
}
267249
}
268250

269251
private fun changeIconPack(index: Int) {
@@ -293,8 +275,8 @@ class MainFragment : Fragment(), IconDialog.Callback {
293275
}
294276

295277
// Called by icon dialog to get the icon pack.
296-
override val iconDialogIconPack: IconPack
297-
get() = app.iconPack!!
278+
override val iconDialogIconPack: IconPack?
279+
get() = app.iconPack
298280

299281
override fun onIconDialogIconsSelected(dialog: IconDialog, icons: List<Icon>) {
300282
// Called by icon dialog when icons were selected.

app/src/main/res/layout/fragment_main.xml

-2
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,7 @@
105105
android:layout_margin="16dp"
106106
android:layout_gravity="bottom|end"
107107
android:src="@drawable/ic_edit"
108-
android:visibility="gone"
109108
app:fabSize="normal"
110-
tools:visibility="visible"
111109
/>
112110

113111
</androidx.coordinatorlayout.widget.CoordinatorLayout>

app/src/main/res/layout/layout_options.xml

+10-15
Original file line numberDiff line numberDiff line change
@@ -63,21 +63,6 @@
6363
/>
6464
</com.google.android.material.textfield.TextInputLayout>
6565

66-
<ProgressBar
67-
android:id="@+id/pb_icon_pack"
68-
android:layout_width="36dp"
69-
android:layout_height="36dp"
70-
android:layout_marginLeft="16dp"
71-
android:layout_marginStart="16dp"
72-
app:layout_constraintBottom_toBottomOf="@id/layout_icon_pack_dropdown"
73-
app:layout_constraintEnd_toEndOf="parent"
74-
app:layout_constraintHorizontal_bias="0"
75-
app:layout_constraintStart_toEndOf="@id/layout_icon_pack_dropdown"
76-
app:layout_constraintTop_toTopOf="@id/layout_icon_pack_dropdown"
77-
android:visibility="invisible"
78-
tools:visibility="visible"
79-
/>
80-
8166
<TextView
8267
android:id="@+id/txv_title_visibility_label"
8368
style="@style/OptionTextStyle"
@@ -275,4 +260,14 @@
275260
android:text="@string/option_dark_theme"
276261
/>
277262

263+
<CheckBox
264+
android:id="@+id/chk_fake_loading"
265+
style="@style/OptionTextStyle"
266+
android:layout_width="wrap_content"
267+
android:layout_height="0dp"
268+
app:layout_constraintStart_toStartOf="parent"
269+
app:layout_constraintTop_toBottomOf="@id/chk_dark_theme"
270+
android:text="@string/option_fake_loading"
271+
/>
272+
278273
</androidx.constraintlayout.widget.ConstraintLayout>

app/src/main/res/values/strings.xml

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
<string name="option_show_select_btn">Show select button</string>
3030
<string name="option_show_clear_btn">Show clear button</string>
3131
<string name="option_dark_theme">Dark theme</string>
32+
<string name="option_fake_loading">Fake loading time</string>
3233

3334
<string name="icon_pack_default">Default</string>
3435
<string name="icon_pack_fa">Font Awesome</string>

gradle.properties

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Library
2-
libVersion=3.0.0
2+
libVersion=3.0.1
33

44
# Icon packs
55
iconPackDefaultVersion=1.0.0

lib/src/main/kotlin/com/maltaisn/icondialog/IconDialog.kt

+30-2
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ class IconDialog : DialogFragment(), IconDialogContract.View {
5858
/** The settings used for the dialog. */
5959
override lateinit var settings: IconDialogSettings
6060

61-
override val iconPack: IconPack
61+
override val iconPack: IconPack?
6262
get() = callback.iconDialogIconPack
6363

6464
/**
@@ -77,6 +77,7 @@ class IconDialog : DialogFragment(), IconDialogContract.View {
7777
private lateinit var searchEdt: EditText
7878
private lateinit var searchClearBtn: ImageView
7979
private lateinit var noResultTxv: TextView
80+
private lateinit var progressBar: ProgressBar
8081
private lateinit var footerDiv: View
8182
private lateinit var selectBtn: Button
8283
private lateinit var cancelBtn: Button
@@ -86,6 +87,9 @@ class IconDialog : DialogFragment(), IconDialogContract.View {
8687
private lateinit var listAdapter: IconAdapter
8788
private lateinit var listLayout: IconLayoutManager
8889

90+
private lateinit var progressHandler: Handler
91+
private var progressCallback: Runnable? = null
92+
8993
private lateinit var searchHandler: Handler
9094
private val searchCallback = Runnable {
9195
presenter?.onSearchQueryEntered(searchEdt.text.toString())
@@ -117,6 +121,7 @@ class IconDialog : DialogFragment(), IconDialogContract.View {
117121
iconColorSelected = getColor(it.getResourceId(R.styleable.IconDialog_icdSelectedIconColor, 0))
118122
}
119123

124+
progressHandler = Handler()
120125
searchHandler = Handler()
121126

122127
// Create the dialog view
@@ -127,6 +132,7 @@ class IconDialog : DialogFragment(), IconDialogContract.View {
127132
searchEdt = dialogView.findViewById(R.id.icd_edt_search)
128133
searchClearBtn = dialogView.findViewById(R.id.icd_imv_clear_search)
129134
noResultTxv = dialogView.findViewById(R.id.icd_txv_no_result)
135+
progressBar = dialogView.findViewById(R.id.icd_progress_bar)
130136

131137
// Search
132138
searchEdt.addTextChangedListener {
@@ -235,6 +241,17 @@ class IconDialog : DialogFragment(), IconDialogContract.View {
235241
presenter?.onDialogCancelled()
236242
}
237243

244+
override fun postDelayed(delay: Long, action: () -> Unit) {
245+
val callback = Runnable(action)
246+
progressHandler.post(callback)
247+
progressCallback = callback
248+
}
249+
250+
override fun cancelCallbacks() {
251+
progressHandler.removeCallbacks(progressCallback ?: return)
252+
progressCallback = null
253+
}
254+
238255
override fun exit() {
239256
dismiss()
240257
}
@@ -259,6 +276,10 @@ class IconDialog : DialogFragment(), IconDialogContract.View {
259276
titleTxv.isVisible = visible
260277
}
261278

279+
override fun updateTitle(titleRes: Int) {
280+
titleTxv.text = getString(titleRes)
281+
}
282+
262283
override fun setSearchBarVisible(visible: Boolean) {
263284
searchImv.isVisible = visible
264285
searchEdt.isVisible = visible
@@ -277,6 +298,10 @@ class IconDialog : DialogFragment(), IconDialogContract.View {
277298
noResultTxv.isVisible = visible
278299
}
279300

301+
override fun setProgressBarVisible(visible: Boolean) {
302+
progressBar.isVisible = visible
303+
}
304+
280305
override fun setFooterVisible(visible: Boolean) {
281306
clearBtn.isVisible = visible
282307
cancelBtn.isVisible = visible
@@ -404,8 +429,11 @@ class IconDialog : DialogFragment(), IconDialogContract.View {
404429
/**
405430
* The icon pack to be displayed by the dialog.
406431
* All icon drawables in the pack must have been loaded, or they won't be displayed.
432+
*
433+
* If `null` is returned, the icon dialog will periodically try to get the icon
434+
* pack while showing a progress indicator, until it no longer returns `null`.
407435
*/
408-
val iconDialogIconPack: IconPack
436+
val iconDialogIconPack: IconPack?
409437

410438
/**
411439
* Called when icons are selected and user confirms the selection.

lib/src/main/kotlin/com/maltaisn/icondialog/IconDialogContract.kt

+7-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.maltaisn.icondialog
1818

1919
import android.os.Bundle
20+
import androidx.annotation.StringRes
2021
import com.maltaisn.icondialog.data.Category
2122
import com.maltaisn.icondialog.data.Icon
2223
import com.maltaisn.icondialog.pack.IconPack
@@ -27,20 +28,24 @@ internal interface IconDialogContract {
2728

2829
interface View {
2930
val settings: IconDialogSettings
30-
val iconPack: IconPack
31+
val iconPack: IconPack?
3132
val selectedIconIds: List<Int>
3233
val locale: Locale
3334

35+
fun postDelayed(delay: Long, action: () -> Unit)
36+
fun cancelCallbacks()
37+
3438
fun exit()
3539
fun hideKeyboard()
3640

3741
fun setCancelResult()
3842
fun setSelectionResult(selected: List<Icon>)
39-
4043
fun setTitleVisible(visible: Boolean)
44+
fun updateTitle(@StringRes titleRes: Int)
4145
fun setSearchBarVisible(visible: Boolean)
4246
fun setClearSearchBtnVisible(visible: Boolean)
4347
fun setClearBtnVisible(visible: Boolean)
48+
fun setProgressBarVisible(visible: Boolean)
4449
fun setNoResultLabelVisible(visible: Boolean)
4550
fun setFooterVisible(visible: Boolean)
4651
fun removeLayoutPadding()

0 commit comments

Comments
 (0)