Start integration with app: adds Hilt for dep injection, implements a view model
This commit is contained in:
@@ -12,6 +12,7 @@
|
||||
android:supportsRtl="true"
|
||||
android:theme="@style/Theme.KordophoneDroid"
|
||||
android:name=".KordophoneApplication"
|
||||
android:networkSecurityConfig="@xml/network_security_config"
|
||||
tools:targetApi="31">
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
|
||||
25
app/src/main/java/net/buzzert/kordophonedroid/AppModule.kt
Normal file
25
app/src/main/java/net/buzzert/kordophonedroid/AppModule.kt
Normal file
@@ -0,0 +1,25 @@
|
||||
package net.buzzert.kordophonedroid
|
||||
|
||||
import dagger.Module
|
||||
import dagger.Provides
|
||||
import dagger.hilt.InstallIn
|
||||
import dagger.hilt.components.SingletonComponent
|
||||
import net.buzzert.kordophone.backend.db.CachedChatDatabase
|
||||
import net.buzzert.kordophone.backend.server.ChatRepository
|
||||
import net.buzzert.kordophone.backend.server.RetrofitAPIClient
|
||||
import java.net.URL
|
||||
import javax.inject.Singleton
|
||||
|
||||
@Module
|
||||
@InstallIn(SingletonComponent::class)
|
||||
object AppModule {
|
||||
@Singleton
|
||||
@Provides
|
||||
fun provideChatRepository(): ChatRepository {
|
||||
val host = "http://192.168.1.123:5738"
|
||||
val client = RetrofitAPIClient(URL(host))
|
||||
val apiInterface = client.getAPIInterface()
|
||||
val database = CachedChatDatabase.liveDatabase()
|
||||
return ChatRepository(apiInterface, database)
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,11 @@
|
||||
package net.buzzert.kordophonedroid
|
||||
|
||||
import android.app.Application
|
||||
import dagger.hilt.android.HiltAndroidApp
|
||||
import net.buzzert.kordophonedroid.data.AppContainer
|
||||
import net.buzzert.kordophonedroid.data.AppContainerImpl
|
||||
|
||||
@HiltAndroidApp
|
||||
class KordophoneApplication : Application() {
|
||||
lateinit var container: AppContainer
|
||||
|
||||
|
||||
@@ -3,9 +3,11 @@ package net.buzzert.kordophonedroid
|
||||
import android.os.Bundle
|
||||
import androidx.activity.ComponentActivity
|
||||
import androidx.activity.compose.setContent
|
||||
import dagger.hilt.android.AndroidEntryPoint
|
||||
import net.buzzert.kordophonedroid.data.AppContainerImpl
|
||||
import net.buzzert.kordophonedroid.ui.KordophoneApp
|
||||
|
||||
@AndroidEntryPoint
|
||||
class MainActivity : ComponentActivity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
|
||||
@@ -1,10 +1,18 @@
|
||||
package net.buzzert.kordophonedroid.data
|
||||
|
||||
interface AppContainer {
|
||||
val something: String
|
||||
import androidx.lifecycle.ViewModelStore
|
||||
import androidx.lifecycle.ViewModelStoreOwner
|
||||
import net.buzzert.kordophone.backend.server.ChatRepository
|
||||
|
||||
interface AppContainer: ViewModelStoreOwner {
|
||||
val repository: ChatRepository
|
||||
}
|
||||
|
||||
class AppContainerImpl() : AppContainer {
|
||||
override val something: String
|
||||
override val repository: ChatRepository
|
||||
get() = TODO("Not yet implemented")
|
||||
}
|
||||
|
||||
override val viewModelStore: ViewModelStore
|
||||
get() = TODO("Not yet implemented")
|
||||
}
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@ fun KordophoneApp(
|
||||
startDestination = Destination.ConversationList.route,
|
||||
) {
|
||||
composable(route = Destination.ConversationList.route) {
|
||||
ConversationListScreen(onMessageSelected = {
|
||||
ConversationListScreen(onConversationSelected = {
|
||||
navController.navigate(Destination.MessageList.createRoute(it))
|
||||
})
|
||||
}
|
||||
|
||||
@@ -11,7 +11,8 @@ import androidx.compose.material.*
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.rounded.Info
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.ComposeCompilerApi
|
||||
import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.text.TextStyle
|
||||
@@ -20,15 +21,23 @@ import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.Dp
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import androidx.hilt.navigation.compose.hiltViewModel
|
||||
import net.buzzert.kordophone.backend.model.Conversation
|
||||
|
||||
@Composable
|
||||
fun ConversationListScreen(
|
||||
onMessageSelected: (conversationID: String) -> Unit
|
||||
viewModel: ConversationListViewModel = hiltViewModel(),
|
||||
onConversationSelected: (conversationID: String) -> Unit
|
||||
) {
|
||||
val conversations by viewModel.conversations.collectAsState(initial = listOf())
|
||||
ConversationListView(conversations = conversations, onConversationSelected = onConversationSelected)
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun ConversationListView(
|
||||
conversations: List<Conversation>,
|
||||
onConversationSelected: (conversationID: String) -> Unit
|
||||
) {
|
||||
val convos = ArrayList<String>()
|
||||
for (i in 0..200) {
|
||||
convos += "Test"
|
||||
}
|
||||
|
||||
val listState = rememberLazyListState()
|
||||
|
||||
@@ -42,12 +51,12 @@ fun ConversationListScreen(
|
||||
}
|
||||
) {
|
||||
LazyColumn(state = listState, modifier = Modifier.padding(it)) {
|
||||
items(convos) { conversation ->
|
||||
items(conversations) { conversation ->
|
||||
ConversationListItem(
|
||||
name = "James Magahern",
|
||||
id = "asdf",
|
||||
isUnread = false,
|
||||
onClick = { onMessageSelected("asdf") }
|
||||
name = conversation.formattedDisplayName(),
|
||||
id = conversation.guid,
|
||||
isUnread = conversation.unreadCount > 0,
|
||||
onClick = { onConversationSelected(conversation.guid) }
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -137,5 +146,5 @@ fun ConversationListItemPreview() {
|
||||
@Preview
|
||||
@Composable
|
||||
fun ConversationListScreenPreview() {
|
||||
ConversationListScreen(onMessageSelected = {})
|
||||
ConversationListScreen(onConversationSelected = {})
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
package net.buzzert.kordophonedroid.ui.conversationlist
|
||||
|
||||
import androidx.lifecycle.ViewModel
|
||||
import androidx.lifecycle.viewModelScope
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.launch
|
||||
import net.buzzert.kordophone.backend.model.Conversation
|
||||
import net.buzzert.kordophone.backend.server.ChatRepository
|
||||
import javax.inject.Inject
|
||||
|
||||
@HiltViewModel
|
||||
class ConversationListViewModel @Inject constructor(
|
||||
private val repository: ChatRepository
|
||||
) : ViewModel() {
|
||||
val conversations: Flow<List<Conversation>>
|
||||
get() = repository.conversationChanges
|
||||
|
||||
init {
|
||||
viewModelScope.launch {
|
||||
repository.synchronize()
|
||||
}
|
||||
}
|
||||
}
|
||||
6
app/src/main/res/xml/network_security_config.xml
Normal file
6
app/src/main/res/xml/network_security_config.xml
Normal file
@@ -0,0 +1,6 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<network-security-config>
|
||||
<domain-config cleartextTrafficPermitted="true">
|
||||
<domain includeSubdomains="true">192.168.1.123</domain>
|
||||
</domain-config>
|
||||
</network-security-config>
|
||||
Reference in New Issue
Block a user