Skip to content

Commit

Permalink
Redesign Home UI (ismartcoding#54)
Browse files Browse the repository at this point in the history
  • Loading branch information
ismartcoding authored Jun 21, 2023
1 parent a9eefc6 commit 12a5fa2
Show file tree
Hide file tree
Showing 139 changed files with 1,931 additions and 1,782 deletions.
4 changes: 2 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,9 @@ android {
else -> 0
}

val vCode = 52
val vCode = 55
versionCode = vCode - singleAbiNum
versionName = "1.0.27"
versionName = "1.0.28"

ndk {
if (abiFilterList.isNotEmpty()) {
Expand Down
2 changes: 2 additions & 0 deletions app/src/main/java/com/ismartcoding/plain/LocalStorage.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import com.ismartcoding.plain.features.video.DVideo
import com.ismartcoding.lib.helpers.CryptoHelper
import com.ismartcoding.lib.helpers.StringHelper
import com.ismartcoding.plain.data.enums.PasswordType
import com.ismartcoding.plain.features.exchange.ExchangeConfig

object LocalStorage {
var endictShowWord: Boolean by serialLazy(true)
Expand Down Expand Up @@ -53,6 +54,7 @@ object LocalStorage {
var chatGPTApiKey: String by serialLazy("")
var httpServerPasswordType: PasswordType by serialLazy(PasswordType.RANDOM)
var httpServerPassword: String by serialLazy("")
var exchange: ExchangeConfig by serialLazy(ExchangeConfig())

fun resetAuthDevToken() {
authDevToken = CryptoHelper.randomPassword(128)
Expand Down
13 changes: 3 additions & 10 deletions app/src/main/java/com/ismartcoding/plain/db/DChat.kt
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,6 @@ fun DMessageContent.toJSONString(): String {
DMessageType.FILES.value -> {
valueJSON = jsonEncode(value as DMessageFiles)
}
DMessageType.EXCHANGE.value -> {
valueJSON = jsonEncode(value as DMessageExchange)
}
}
obj.put("value", JSONObject(valueJSON))
}
Expand All @@ -41,7 +38,6 @@ enum class DMessageType(val value: String) {
TEXT("text"),
IMAGES("images"),
FILES("files"),
EXCHANGE("exchange"),
}

@Serializable
Expand All @@ -53,9 +49,6 @@ class DMessageFile(val uri: String, val size: Long, val duration: Long = 0)
@Serializable
class DMessageImages(val items: List<DMessageFile>)

@Serializable
class DMessageExchange(var base: String = "USD", var value: Double = 100.0, val selected: MutableSet<String> = mutableSetOf("USD", "CNY", "EUR"))

@Serializable
class DMessageFiles(val items: List<DMessageFile>)

Expand Down Expand Up @@ -93,9 +86,6 @@ data class DChat(
DMessageType.FILES.value -> {
message.value = Json.decodeFromString<DMessageFiles>(valueJson)
}
DMessageType.EXCHANGE.value -> {
message.value = Json.decodeFromString<DMessageExchange>(valueJson)
}
}

return message
Expand Down Expand Up @@ -130,5 +120,8 @@ interface ChatDao {

@Query("DELETE FROM chats WHERE id = :id")
fun delete(id: String)

@Query("DELETE FROM chats WHERE id in (:ids)")
fun deleteByIds(ids: List<String>)
}

Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import com.ismartcoding.plain.features.audio.AudioPlayer
import com.ismartcoding.plain.features.exchange.DExchangeRates
import com.ismartcoding.plain.features.feed.FeedWorkerStatus
import com.ismartcoding.plain.services.HttpServerService
import com.ismartcoding.plain.ui.home.HomeItemModel
import com.ismartcoding.plain.web.websocket.EventType
import com.ismartcoding.plain.web.websocket.WebSocketEvent
import com.ismartcoding.plain.web.websocket.WebSocketHelper
Expand Down Expand Up @@ -62,6 +63,9 @@ class HttpServerPortChanged

class SendMessageEvent(val content: DMessageContent)
class UpdateMessageEvent(var chatItem: DChat)

class UpdateHomeItemEvent(var type: HomeItemType)

class DeleteChatItemViewEvent(val id: String)

class DeviceNameUpdatedEvent(val id: String, val name: String?)
Expand All @@ -71,6 +75,8 @@ class CurrentBoxChangedEvent
class ChatInputEditEvent(val content: String)
class ChatItemRefreshEvent(val data: DMessageContent)

class HomeItemRefreshEvent(val data: HomeItemModel)

class VocabularyCreatedEvent
class VocabularyUpdatedEvent
class VocabularyDeletedEvent(val id: String)
Expand Down Expand Up @@ -107,6 +113,8 @@ class FetchLatestExchangeRatesEvent

class AIChatCreatedEvent(val item: DAIChat)

class ChatItemClickEvent

object AppEvents {
private val mediaPlayer = MediaPlayer()
private var mediaPlayingUri: Uri? = null
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package com.ismartcoding.plain.features.chat
package com.ismartcoding.plain.features

import com.ismartcoding.plain.features.locale.LocaleHelper

enum class ChatCommandType(val value: String) {
APP("app"),
enum class HomeItemType(val value: String) {
STORAGE("storage"),
EDUCATION("education"),
WORK("work"),
Expand All @@ -24,7 +23,7 @@ enum class ChatCommandType(val value: String) {
}

companion object {
fun parse(input: String): ChatCommandType? {
fun parse(input: String): HomeItemType? {
return values().find { it.value == input }
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import com.ismartcoding.lib.channel.sendEvent
import com.ismartcoding.lib.helpers.CoroutinesHelper.withIO
import com.ismartcoding.plain.features.DeleteChatItemViewEvent
import com.ismartcoding.plain.db.*
import com.ismartcoding.plain.helpers.FileHelper
import java.io.File

object ChatHelper {
Expand All @@ -17,9 +16,6 @@ object ChatHelper {
AppDatabase.instance.chatDao().insert(item)
}
items.add(item)
replyAsync(message)?.let {
items.add(it)
}
return items
}

Expand All @@ -44,23 +40,4 @@ object ChatHelper {
sendEvent(DeleteChatItemViewEvent(chatItem.id))
}

private suspend fun replyAsync(input: DMessageContent): DChat? {
if (input.value is DMessageText) {
val commandType = ChatCommandType.parse((input.value as DMessageText).text.removePrefix(":"))
if (commandType != null) {
val item = DChat()
item.content = DMessageContent(commandType.value)
if (commandType == ChatCommandType.EXCHANGE) {
item.content.value = DMessageExchange()
}
withIO {
AppDatabase.instance.chatDao().insert(item)
}
return item
}
}

return null
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.ismartcoding.plain.features.exchange

import kotlinx.serialization.Serializable

@Serializable
class ExchangeConfig(var base: String = "USD", var value: Double = 100.0, val selected: MutableSet<String> = mutableSetOf("USD", "CNY", "EUR"))

This file was deleted.

1 change: 0 additions & 1 deletion app/src/main/java/com/ismartcoding/plain/ui/BaseDialog.kt
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.core.view.updateLayoutParams
import androidx.core.view.updatePadding
import androidx.fragment.app.DialogFragment
import androidx.viewbinding.ViewBinding
Expand Down
81 changes: 18 additions & 63 deletions app/src/main/java/com/ismartcoding/plain/ui/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.coordinatorlayout.widget.CoordinatorLayout
import androidx.core.splashscreen.SplashScreen.Companion.installSplashScreen
import androidx.core.view.isVisible
import androidx.core.view.updateLayoutParams
import androidx.core.view.updatePadding
import androidx.fragment.app.DialogFragment
import androidx.lifecycle.lifecycleScope
import com.google.android.material.dialog.MaterialAlertDialogBuilder
import com.ismartcoding.lib.brv.utils.bindingAdapter
import com.ismartcoding.lib.channel.receiveEvent
import com.ismartcoding.lib.channel.sendEvent
import com.ismartcoding.lib.extensions.*
Expand All @@ -36,23 +36,18 @@ import com.ismartcoding.plain.db.*
import com.ismartcoding.plain.features.*
import com.ismartcoding.plain.features.bluetooth.BluetoothPermission
import com.ismartcoding.plain.features.box.BoxHelper
import com.ismartcoding.plain.features.box.CancelActiveJobEvent
import com.ismartcoding.plain.features.box.FetchInitDataEvent
import com.ismartcoding.plain.features.box.InitDataResultEvent
import com.ismartcoding.plain.features.chat.ChatHelper
import com.ismartcoding.plain.features.locale.LocaleHelper
import com.ismartcoding.plain.features.locale.LocaleHelper.getStringF
import com.ismartcoding.plain.features.theme.AppThemeHelper
import com.ismartcoding.plain.mediaProjectionManager
import com.ismartcoding.plain.services.ScreenMirrorService
import com.ismartcoding.plain.ui.chat.SendMessageDialog
import com.ismartcoding.plain.ui.chat.ChatDialog
import com.ismartcoding.plain.ui.extensions.*
import com.ismartcoding.plain.ui.helpers.DialogHelper
import com.ismartcoding.plain.ui.helpers.FilePickHelper
import com.ismartcoding.plain.ui.models.ShowMessageEvent
import com.ismartcoding.plain.web.*
import com.ismartcoding.plain.web.websocket.EventType
import com.ismartcoding.plain.web.websocket.WebSocketEvent
import io.ktor.server.request.*
import io.ktor.websocket.*
import kotlinx.coroutines.launch
Expand Down Expand Up @@ -128,6 +123,14 @@ class MainActivity : AppCompatActivity() {
super.onCreate(savedInstanceState)
installSplashScreen()

LocaleHelper.setLocale(this, LocalStorage.appLocale)

instance = WeakReference(this)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)

initStatusBar()

// https://stackoverflow.com/questions/51959944/sqliteblobtoobigexception-row-too-big-to-fit-into-cursorwindow-requiredpos-0-t
try {
val field = CursorWindow::class.java.getDeclaredField("sCursorWindowSize")
Expand All @@ -137,14 +140,6 @@ class MainActivity : AppCompatActivity() {
e.printStackTrace()
}

LocaleHelper.setLocale(this, LocalStorage.appLocale)

instance = WeakReference(this)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)

initStatusBar()

if (!isGestureNavigationBar()) {
binding.page.updateLayoutParams<CoordinatorLayout.LayoutParams> {
bottomMargin = navigationBarHeight
Expand All @@ -153,13 +148,14 @@ class MainActivity : AppCompatActivity() {

binding.topAppBar.quickNav.updatePadding(0, statusBarHeight, 0, 0)
binding.topAppBar.autoStatusBar(window)
binding.topAppBar.mainRefresh()

BluetoothPermission.init(this)
Permissions.init(this)
initEvents()

binding.fab.setSafeClick {
SendMessageDialog().show()
ChatDialog().show()
}

binding.page.pageName = javaClass.simpleName
Expand All @@ -170,7 +166,7 @@ class MainActivity : AppCompatActivity() {
setEnableRefresh(false)
}

binding.chatList.initView(lifecycle)
binding.home.initView(lifecycle)
Permissions.checkNotification(R.string.foreground_service_notification_prompt) {
sendEvent(StartHttpServerEvent())
}
Expand All @@ -197,28 +193,13 @@ class MainActivity : AppCompatActivity() {
}
sendEvent(FetchInitDataEvent.createDefault())
binding.topAppBar.mainRefresh()
binding.chatList.refreshAsync()
binding.home.refreshUI()
}
}
}

@SuppressLint("CheckResult")
private fun initEvents() {
receiveEvent<CurrentBoxChangedEvent> {
lifecycleScope.launch {
UIDataCache.current().clearConnectivityState()
binding.topAppBar.mainRefresh()
sendEvent(
CancelActiveJobEvent(
LocalStorage.selectedBoxId,
FetchInitDataEvent.javaClass
)
)
sendEvent(FetchInitDataEvent.createDefault())
binding.chatList.refreshAsync()
}
}

receiveEvent<HttpServerEnabledEvent> {
binding.topAppBar.mainRefresh()
}
Expand All @@ -235,26 +216,6 @@ class MainActivity : AppCompatActivity() {
Toast.makeText(instance.get()!!, event.message, event.duration).show()
}

receiveEvent<DeleteChatItemViewEvent> { event ->
binding.chatList.remove(event.id)
if (!binding.chatList.isScrollable()) {
binding.fab.isVisible = true
}
}

receiveEvent<SendMessageEvent> { event ->
lifecycleScope.launch {
val items = withIO { ChatHelper.createChatItemsAsync(event.content) }
sendEvent(WebSocketEvent(EventType.MESSAGE_CREATED))
binding.chatList.addAll(items)
DialogHelper.hideLoading()
}
}

receiveEvent<HttpServerEvents.MessageCreatedEvent> { event ->
binding.chatList.addAll(event.items)
}

receiveEvent<PermissionResultEvent> { event ->
if (event.permission == Permission.WRITE_SETTINGS.toSysPermission() && Permission.WRITE_SETTINGS.can()) {
val enable = !LocalStorage.keepScreenOn
Expand All @@ -273,14 +234,8 @@ class MainActivity : AppCompatActivity() {
screenCapture.launch(mediaProjectionManager.createScreenCaptureIntent())
}

receiveEvent<UpdateMessageEvent> { event ->
lifecycleScope.launch {
val update = ChatItemDataUpdate(event.chatItem.id, event.chatItem.content)
withIO {
AppDatabase.instance.chatDao().updateData(update)
}
binding.chatList.update(event.chatItem)
}
receiveEvent<UpdateHomeItemEvent> { event ->
binding.home.update(event.type)
}

receiveEvent<BoxConnectivityStateChangedEvent> {
Expand Down Expand Up @@ -393,12 +348,12 @@ class MainActivity : AppCompatActivity() {
window.decorView.setBackgroundColor(context.getColor(R.color.canvas))
binding.topAppBar.mainRefresh()
binding.topAppBar.refreshUI()
binding.chatList.refreshUI()
binding.home.bindingAdapter.notifyDataSetChanged()
}

private fun refreshUIForLocaleChanged() {
binding.topAppBar.mainRefresh()
binding.chatList.refreshUI()
binding.home.bindingAdapter.notifyDataSetChanged()
}

companion object {
Expand Down
Loading

0 comments on commit 12a5fa2

Please sign in to comment.