Skip to content

Commit da88085

Browse files
committed
feat: add icon chooser
1 parent 0f62e0f commit da88085

File tree

11 files changed

+275
-18
lines changed

11 files changed

+275
-18
lines changed

app/build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ dependencies {
9191
implementation "io.coil-kt:coil-compose:2.1.0"
9292
implementation "io.coil-kt:coil-gif:2.1.0"
9393

94-
// Date picker
95-
implementation "io.github.vanpra.compose-material-dialogs:datetime:0.8.1-rc"
96-
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'
94+
// Select icons
95+
implementation "com.maltaisn:icondialog:3.3.0"
96+
implementation "com.maltaisn:iconpack-default:1.1.0"
9797
}

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
android:required="false" />
1616

1717
<application
18+
android:name=".App"
1819
android:allowBackup="true"
1920
android:dataExtractionRules="@xml/data_extraction_rules"
2021
android:fullBackupContent="@xml/backup_rules"
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.eps.todoturtle
2+
3+
import android.app.Application
4+
import com.maltaisn.icondialog.pack.IconPack
5+
import com.maltaisn.icondialog.pack.IconPackLoader
6+
import com.maltaisn.iconpack.defaultpack.createDefaultIconPack
7+
8+
class App : Application() {
9+
10+
var iconPack: IconPack? = null
11+
12+
override fun onCreate() {
13+
super.onCreate()
14+
// Load the icon pack on application start.
15+
loadIconPack()
16+
}
17+
18+
private fun loadIconPack() {
19+
val loader = IconPackLoader(this)
20+
val iconPack = createDefaultIconPack(loader)
21+
iconPack.loadDrawables(loader.drawableLoader)
22+
this.iconPack = iconPack
23+
}
24+
25+
}

app/src/main/java/com/eps/todoturtle/MainActivity.kt

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package com.eps.todoturtle
22

33
import android.os.Bundle
4-
import androidx.activity.ComponentActivity
4+
import android.widget.Toast
55
import androidx.activity.compose.setContent
6+
import androidx.appcompat.app.AppCompatActivity
7+
import androidx.fragment.app.DialogFragment.STYLE_NORMAL
8+
import androidx.fragment.app.DialogFragment.STYLE_NO_FRAME
69
import com.eps.todoturtle.nfc.logic.DevicesViewModel
710
import com.eps.todoturtle.nfc.logic.NfcWriteViewModel.INIT.getNfcWriteModel
811
import com.eps.todoturtle.note.logic.NoteScreenViewModel
@@ -13,10 +16,16 @@ import com.eps.todoturtle.shared.logic.extensions.dataStore
1316
import com.eps.todoturtle.shared.logic.extensions.hasCameraPermission
1417
import com.eps.todoturtle.ui.App
1518
import com.eps.todoturtle.ui.theme.ToDoTurtleTheme
19+
import com.maltaisn.icondialog.IconDialog
20+
import com.maltaisn.icondialog.IconDialogSettings
21+
import com.maltaisn.icondialog.data.Icon
22+
import com.maltaisn.icondialog.pack.IconPack
23+
import kotlinx.coroutines.flow.MutableStateFlow
1624

17-
class MainActivity : ComponentActivity() {
25+
class MainActivity : AppCompatActivity(), IconDialog.Callback {
1826
private val permissionsToRequest = listOf(CameraPermissionProvider(this))
1927
private lateinit var permissionRequester: PermissionRequester
28+
private val callBackIcons: MutableStateFlow<Int?> = MutableStateFlow(null)
2029

2130
override fun onCreate(savedInstanceState: Bundle?) {
2231
super.onCreate(savedInstanceState)
@@ -25,18 +34,39 @@ class MainActivity : ComponentActivity() {
2534
val noteScreenViewModel = NoteScreenViewModel(this)
2635
val profileViewModel = ProfileViewModel(this)
2736

37+
val iconDialog = supportFragmentManager.findFragmentByTag(ICON_DIALOG_TAG) as IconDialog?
38+
?: IconDialog.newInstance(IconDialogSettings())
39+
theme.applyStyle(R.style.AppTheme, true)
2840
setContent {
2941
ToDoTurtleTheme(dataStore) {
3042
App(
3143
permissionRequester = permissionRequester,
3244
noteScreenViewModel = noteScreenViewModel,
3345
devicesViewModel = DevicesViewModel(),
34-
nfcWriteViewModel = getNfcWriteModel(),
46+
nfcWriteViewModel = getNfcWriteModel(callBackIcons) {
47+
iconDialog.show(
48+
supportFragmentManager,
49+
ICON_DIALOG_TAG
50+
)
51+
},
3552
profileViewModel = profileViewModel,
3653
dataStore = dataStore,
3754
hasCameraPermission = { hasCameraPermission() },
3855
)
3956
}
4057
}
4158
}
59+
60+
61+
override val iconDialogIconPack: IconPack?
62+
get() = (application as App).iconPack
63+
64+
override fun onIconDialogIconsSelected(dialog: IconDialog, icons: List<Icon>) {
65+
this.callBackIcons.value = icons.last().id
66+
Toast.makeText(this, "Icon selected ${icons.last().pathData}", Toast.LENGTH_SHORT).show()
67+
}
68+
69+
companion object {
70+
private const val ICON_DIALOG_TAG = "icon-dialog"
71+
}
4272
}

app/src/main/java/com/eps/todoturtle/navigation/ui/ToDoTurtleNavHost.kt

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import androidx.navigation.navArgument
1818
import com.eps.todoturtle.invite.ui.InviteUI
1919
import com.eps.todoturtle.nfc.logic.DevicesViewModel
2020
import com.eps.todoturtle.nfc.logic.NfcWriteViewModel
21+
import com.eps.todoturtle.nfc.ui.DeviceConfigurationScreen
2122
import com.eps.todoturtle.nfc.ui.DeviceScreen
2223
import com.eps.todoturtle.nfc.ui.WriteDevice
2324
import com.eps.todoturtle.note.logic.NoteScreenViewModel
@@ -40,6 +41,7 @@ private const val DEVICES_WRITE_SUCCESSFUL_PARAM = "write_successful"
4041
private const val DEVICES = "devices/{$DEVICES_WRITE_SUCCESSFUL_PARAM}"
4142
const val DEVICES_WRITE_SUCCESSFUL = "devices/true"
4243
const val DEVICES_NORMAL = "devices/false"
44+
private const val DEVICE_CONFIGURATION = "device_configuration"
4345

4446
@Composable
4547
fun ToDoTurtleNavHost(
@@ -70,6 +72,7 @@ fun ToDoTurtleNavHost(
7072
notes(noteScreenViewModel)
7173
devices(navController, devicesViewModel)
7274
writeDevice(navController, nfcWriteViewModel)
75+
deviceConfiguration(navController, nfcWriteViewModel)
7376
settings(dataStore)
7477
invite()
7578
}
@@ -126,6 +129,16 @@ fun NavGraphBuilder.devices(navController: NavHostController, devicesViewModel:
126129
}
127130
}
128131

132+
fun NavGraphBuilder.deviceConfiguration(navController: NavHostController, nfcWriteViewModel: NfcWriteViewModel) {
133+
composable(
134+
DEVICE_CONFIGURATION,
135+
) {
136+
DeviceConfigurationScreen(nfcWriteViewModel) {
137+
navController.navigate(DEVICES_WRITE_SUCCESSFUL)
138+
}
139+
}
140+
}
141+
129142
@Composable
130143
fun DeviceScreen(
131144
devicesViewModel: DevicesViewModel,
@@ -173,7 +186,7 @@ fun NavGraphBuilder.writeDevice(
173186
},
174187
onWriteSuccessful = {
175188
nfcWriteViewModel.finishNfc()
176-
navController.navigate(DEVICES_WRITE_SUCCESSFUL)
189+
navController.navigate(DEVICE_CONFIGURATION)
177190
},
178191
)
179192
}

app/src/main/java/com/eps/todoturtle/nfc/WriteToDeviceActivity.kt

Lines changed: 41 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,39 @@ package com.eps.todoturtle.nfc
33
import android.content.Intent.FLAG_ACTIVITY_NO_ANIMATION
44
import android.os.Bundle
55
import android.widget.Toast
6-
import androidx.activity.ComponentActivity
76
import androidx.activity.compose.setContent
7+
import androidx.appcompat.app.AppCompatActivity
88
import androidx.compose.foundation.layout.fillMaxSize
99
import androidx.compose.material3.MaterialTheme
1010
import androidx.compose.material3.Surface
1111
import androidx.compose.ui.Modifier
1212
import androidx.compose.ui.platform.LocalContext
13+
import com.eps.todoturtle.App
1314
import com.eps.todoturtle.R
1415
import com.eps.todoturtle.nfc.logic.NfcWriteViewModel.INIT.getNfcWriteModel
1516
import com.eps.todoturtle.nfc.ui.WriteDevice
1617
import com.eps.todoturtle.shared.logic.extensions.dataStore
1718
import com.eps.todoturtle.ui.theme.ToDoTurtleTheme
19+
import com.maltaisn.icondialog.IconDialog
20+
import com.maltaisn.icondialog.IconDialogSettings
21+
import com.maltaisn.icondialog.data.Icon
22+
import com.maltaisn.icondialog.pack.IconPack
23+
import kotlinx.coroutines.flow.MutableStateFlow
24+
25+
class WriteToDeviceActivity : AppCompatActivity(), IconDialog.Callback {
26+
27+
private val callBackIcons: MutableStateFlow<Int?> = MutableStateFlow(null)
1828

19-
class WriteToDeviceActivity : ComponentActivity() {
2029
override fun onCreate(savedInstanceState: Bundle?) {
2130
super.onCreate(savedInstanceState)
22-
val viewModel = getNfcWriteModel()
31+
val iconDialog = supportFragmentManager.findFragmentByTag(ICON_DIALOG_TAG) as IconDialog?
32+
?: IconDialog.newInstance(IconDialogSettings())
33+
val viewModel = getNfcWriteModel(callBackIcons) {
34+
iconDialog.show(
35+
supportFragmentManager,
36+
ICON_DIALOG_TAG
37+
)
38+
}
2339
setContent {
2440
ToDoTurtleTheme(LocalContext.current.dataStore) {
2541
Surface(
@@ -32,11 +48,19 @@ class WriteToDeviceActivity : ComponentActivity() {
3248
onTagLost = ::restartActivity,
3349
unknownError = ::restartActivity,
3450
onNfcNotSupported = {
35-
Toast.makeText(this, getString(R.string.nfc_not_supported_solution), Toast.LENGTH_SHORT).show()
51+
Toast.makeText(
52+
this,
53+
getString(R.string.nfc_not_supported_solution),
54+
Toast.LENGTH_SHORT
55+
).show()
3656
finish()
3757
},
3858
onWriteSuccessful = {
39-
Toast.makeText(this, getString(R.string.nfc_write_success), Toast.LENGTH_SHORT)
59+
Toast.makeText(
60+
this,
61+
getString(R.string.nfc_write_success),
62+
Toast.LENGTH_SHORT
63+
)
4064
.show()
4165
finish()
4266
},
@@ -54,4 +78,16 @@ class WriteToDeviceActivity : ComponentActivity() {
5478
},
5579
)
5680
}
81+
82+
override val iconDialogIconPack: IconPack?
83+
get() = (application as App).iconPack
84+
85+
override fun onIconDialogIconsSelected(dialog: IconDialog, icons: List<Icon>) {
86+
this.callBackIcons.value = icons.last().id
87+
Toast.makeText(this, "Icon selected ${icons.last().pathData}", Toast.LENGTH_SHORT).show()
88+
}
89+
90+
companion object {
91+
private const val ICON_DIALOG_TAG = "icon-dialog"
92+
}
5793
}

app/src/main/java/com/eps/todoturtle/nfc/logic/NfcWriteViewModel.kt

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,17 @@ import com.eps.todoturtle.nfc.logic.NfcWriteDevice.Init.NfcWriteDevice
1010
import kotlinx.coroutines.CoroutineScope
1111
import kotlinx.coroutines.Dispatchers
1212
import kotlinx.coroutines.SupervisorJob
13+
import kotlinx.coroutines.flow.Flow
1314
import kotlinx.coroutines.flow.launchIn
1415
import kotlinx.coroutines.flow.onEach
1516
import kotlinx.coroutines.runBlocking
1617
import java.util.UUID
1718

18-
class NfcWriteViewModel private constructor(componentActivity: ComponentActivity) : ViewModel() {
19+
class NfcWriteViewModel private constructor(
20+
componentActivity: ComponentActivity,
21+
val showIconDialog: () -> Unit,
22+
val iconFlow: Flow<Int?>
23+
) : ViewModel() {
1924

2025
private val lifecycleScope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
2126
private var getNfcWriteDevice: () -> NfcWriteDevice = {
@@ -44,8 +49,10 @@ class NfcWriteViewModel private constructor(componentActivity: ComponentActivity
4449

4550
fun setActivity(componentActivity: ComponentActivity) {
4651
nfcAction = getNfcOpenAction(componentActivity)
47-
nfcWriteDevice = componentActivity.NfcWriteDevice(DeviceInformation(UUID.randomUUID().toString()))
48-
getNfcWriteDevice = { componentActivity.NfcWriteDevice(DeviceInformation(UUID.randomUUID().toString())) }
52+
nfcWriteDevice =
53+
componentActivity.NfcWriteDevice(DeviceInformation(UUID.randomUUID().toString()))
54+
getNfcWriteDevice =
55+
{ componentActivity.NfcWriteDevice(DeviceInformation(UUID.randomUUID().toString())) }
4956
}
5057

5158
private fun getNfcOpenAction(componentActivity: ComponentActivity): () -> Unit = {
@@ -61,18 +68,25 @@ class NfcWriteViewModel private constructor(componentActivity: ComponentActivity
6168
@Suppress("UNCHECKED_CAST")
6269
private class NfcWriteViewModelFactory(
6370
private val context: ComponentActivity,
71+
private val showIconDialog: () -> Unit,
72+
private val iconFlow: Flow<Int?>
6473
) :
6574
ViewModelProvider.Factory {
6675
override fun <T : ViewModel> create(modelClass: Class<T>): T {
67-
return NfcWriteViewModel(context) as T
76+
return NfcWriteViewModel(context, showIconDialog, iconFlow) as T
6877
}
6978
}
7079

71-
fun ComponentActivity.getNfcWriteModel(): NfcWriteViewModel {
80+
fun ComponentActivity.getNfcWriteModel(
81+
iconFlow: Flow<Int?>,
82+
showIconDialog: () -> Unit,
83+
): NfcWriteViewModel {
7284
val viewModel = ViewModelProvider(
7385
this,
7486
NfcWriteViewModelFactory(
7587
this,
88+
showIconDialog,
89+
iconFlow
7690
),
7791
)[NfcWriteViewModel::class.java]
7892
viewModel.setActivity(this)

0 commit comments

Comments
 (0)