Skip to content

Commit

Permalink
feat: added support for AI chat and fixed error when clicking to view…
Browse files Browse the repository at this point in the history
… file properties.
  • Loading branch information
Ruan625Br committed Feb 18, 2024
1 parent edd26e1 commit 93e8f87
Show file tree
Hide file tree
Showing 72 changed files with 2,603 additions and 1,980 deletions.
33 changes: 29 additions & 4 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@ plugins {
id("kotlin-parcelize")
id("com.google.devtools.ksp")
id("com.google.dagger.hilt.android")
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
id("org.jetbrains.kotlin.plugin.serialization")
id("androidx.room")
alias(libs.plugins.baselineprofile)

}
Expand All @@ -29,8 +32,6 @@ android {
vectorDrawables {
useSupportLibrary = true
}


}

buildFeatures {
Expand Down Expand Up @@ -77,6 +78,10 @@ android {
}
}

room {
schemaDirectory("$projectDir/schemas")
}

}
dependencies {

Expand All @@ -96,6 +101,20 @@ dependencies {
implementation("androidx.core:core-ktx:1.12.0")
implementation("androidx.appcompat:appcompat:1.6.1")
implementation("com.google.android.material:material:1.11.0")
implementation("com.google.android.material:material:1.11.0")
implementation("com.google.android.material:material:1.11.0")
implementation("com.google.android.material:material:1.11.0")
implementation("com.google.android.material:material:1.11.0")
implementation("com.google.android.material:material:1.11.0")
implementation("com.google.android.material:material:1.11.0")
implementation("com.google.android.material:material:1.11.0")
implementation("com.google.android.material:material:1.11.0")
implementation("com.google.android.material:material:1.11.0")
implementation("com.google.android.material:material:1.11.0")
implementation("com.google.android.material:material:1.11.0")
implementation("com.google.android.material:material:1.11.0")
implementation("com.google.android.material:material:1.11.0")
implementation("com.google.android.material:material:1.11.0")
implementation("androidx.constraintlayout:constraintlayout:2.1.4")
implementation("androidx.preference:preference-ktx:1.2.1")
implementation("androidx.legacy:legacy-support-v4:1.0.0")
Expand Down Expand Up @@ -177,7 +196,6 @@ dependencies {

//Room
implementation("androidx.room:room-runtime:$roomVersion")
implementation("androidx.core:core-ktx:1.12.0")
ksp("androidx.room:room-compiler:$roomVersion")
implementation("androidx.room:room-ktx:$roomVersion")

Expand All @@ -193,8 +211,15 @@ dependencies {
//Baseline Profile
baselineProfile(project(":app:benchmark"))

//FilePickerSphere
//GenerativeAI
implementation("com.google.ai.client.generativeai:generativeai:0.1.2")

//Kotlin serialization
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.2")

//Ruan625Br
implementation("com.github.Ruan625Br:FilePickerSphere:1.0.0")
implementation("com.github.Ruan625Br:AIResponseMatcher:4904b50758")
}


Expand Down
17 changes: 10 additions & 7 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES"
<uses-permission
android:name="android.permission.QUERY_ALL_PACKAGES"
tools:ignore="QueryAllPackagesPermission" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES"/>
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />


<application
Expand Down Expand Up @@ -66,11 +67,13 @@
</intent-filter>
</activity>
<activity android:name=".manager.media.MediaViewActivity" />
<activity android:name=".compose.feature.presentation.deletedfiles.deletedfileslist.DeletedFileListScreen" />
<activity android:name=".compose.feature.presentation.categorylist.apklist.ApkListScreen"
android:exported="true"
/>
<activity android:name=".compose.feature.presentation.categorylist.CategoryListScreen"/>
<activity
android:name=".compose.feature.presentation.categorylist.apklist.ApkListScreen"
android:exported="true" />
<activity
android:name=".compose.feature.presentation.HomeScreen"
android:windowSoftInputMode="adjustResize" />


<service
android:name=".manager.files.services.FileOperationService"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/*
* Copyright (c) 2024 Juan Nascimento
* Part of FileManagerSphere - MessageExt.kt
* SPDX-License-Identifier: GPL-3.0-or-later
* More details at: https://www.gnu.org/licenses/
*/

package com.etb.filemanager.compose.core.extensions

import com.etb.filemanager.compose.core.models.Message
import com.etb.filemanager.compose.core.models.Participant
import com.google.ai.client.generativeai.type.Content
import com.google.ai.client.generativeai.type.content

fun List<Message>.hasPendingMessage(): Boolean = any { it.isPending }

fun List<Message>.toContent(): List<Content> {
val filteredList = filter { !it.isPending && it.participant != Participant.ERROR && it.participant != Participant.USER_ERROR }

return filteredList.map { msg ->
val role = if (msg.participant == Participant.USER) "user" else "model"
content(role = role) {
text(msg.text)
}
}
}
14 changes: 14 additions & 0 deletions app/src/main/java/com/etb/filemanager/compose/core/models/Chat.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/*
* Copyright (c) 2024 Juan Nascimento
* Part of FileManagerSphere - ChatUtils.kt
* SPDX-License-Identifier: GPL-3.0-or-later
* More details at: https://www.gnu.org/licenses/
*/

package com.etb.filemanager.compose.core.models

data class Chat(
val id: Int = 0,
val chatSettings: ChatSettings = ChatSettings(),
val messages: List<Message> = emptyList(),
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
/*
* Copyright (c) 2024 Juan Nascimento
* Part of FileManagerSphere - ChatSettings.kt
* SPDX-License-Identifier: GPL-3.0-or-later
* More details at: https://www.gnu.org/licenses/
*/

package com.etb.filemanager.compose.core.models

import kotlinx.serialization.Serializable

@Serializable
data class ChatSettings(
val title: String = "ChatSphere"
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
/*
* Copyright (c) 2024 Juan Nascimento
* Part of FileManagerSphere - FileOperationItem.kt
* SPDX-License-Identifier: GPL-3.0-or-later
* More details at: https://www.gnu.org/licenses/
*/

package com.etb.filemanager.compose.core.models

data class FileOperationItem(
val title: String,
val content: String
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/*
* Copyright (c) 2024 Juan Nascimento
* Part of FileManagerSphere - FileOperationResult.kt
* SPDX-License-Identifier: GPL-3.0-or-later
* More details at: https://www.gnu.org/licenses/
*/

package com.etb.filemanager.compose.core.models

import kotlinx.serialization.Serializable

@Serializable
data class FileOperationResult(val name: String, val desc: String, val result: OperationResult)

enum class OperationResult(val value: String){
SUCCESS("Success"),
FAILED("Failed")
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/*
* Copyright (c) 2024 Juan Nascimento
* Part of FileManagerSphere - Message.kt
* SPDX-License-Identifier: GPL-3.0-or-later
* More details at: https://www.gnu.org/licenses/
*/

package com.etb.filemanager.compose.core.models

import android.net.Uri
import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder

enum class Participant {
USER,
MODEL,
ERROR,
USER_ERROR
}

@Serializable
data class Message(
val id: Int = 0 ,
val text: String = "",
val participant: Participant = Participant.MODEL,
val isPending: Boolean = false,
val operationResults: List<FileOperationResult> = emptyList()
){
override fun toString(): String {
return "id: $id\ntext: $text\nparticipant: $participant\nisPending: $isPending"
}
}

object UriSerializer : KSerializer<Uri> {
override val descriptor: SerialDescriptor
get() = PrimitiveSerialDescriptor("Uri", PrimitiveKind.STRING)

override fun deserialize(decoder: Decoder): Uri {
return Uri.parse(decoder.decodeString())
}

override fun serialize(encoder: Encoder, value: Uri) {
encoder.encodeString(value.toString())
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/*
* Copyright (c) 2024 Juan Nascimento
* Part of FileManagerSphere - CategoryGraphNavigation.kt
* SPDX-License-Identifier: GPL-3.0-or-later
* More details at: https://www.gnu.org/licenses/
*/

package com.etb.filemanager.compose.core.navigation

import androidx.compose.foundation.layout.PaddingValues
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavOptions
import androidx.navigation.navigation
import com.etb.filemanager.manager.category.adapter.CategoryFileModel

const val CategoryGraphPattern = "category"

fun NavController.navigateToCategoryGraph(navOptions: NavOptions? = null) {
navigate(CategoryGraphPattern, navOptions)
}

fun NavGraphBuilder.categoryGraph(
navController: NavController,
paddingValues: PaddingValues,
categoryFileModel: CategoryFileModel?
) {
navigation(
startDestination = CategoryListRoute, route = CategoryGraphPattern
) {
categoryListScreen(
paddingValues = paddingValues,
categoryFileModel = categoryFileModel,
onNavigateToMediaView = {
navController.navigateToMediaView(it)
}
)

mediaViewScreen(
paddingValues = paddingValues
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
/*
* Copyright (c) 2024 Juan Nascimento
* Part of FileManagerSphere - CategoryListNavigation.kt
* SPDX-License-Identifier: GPL-3.0-or-later
* More details at: https://www.gnu.org/licenses/
*/

package com.etb.filemanager.compose.core.navigation

import android.os.Bundle
import androidx.compose.foundation.layout.PaddingValues
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavOptions
import androidx.navigation.compose.composable
import com.etb.filemanager.compose.feature.presentation.categorylist.components.CategoryListScreen
import com.etb.filemanager.manager.category.adapter.CategoryFileModel

const val CategoryListRoute = "category_list"

fun NavGraphBuilder.categoryListScreen(
paddingValues: PaddingValues,
categoryFileModel: CategoryFileModel?,
onNavigateToMediaView: (Bundle) -> Unit
){
composable(CategoryListRoute){

CategoryListScreen(
innerPadding = paddingValues,
categoryFileModel = categoryFileModel,
navigate = {_, args ->
onNavigateToMediaView(args)
})
}
}

fun NavController.navigateToCategoryList(navOptions: NavOptions? = null){
navigate(CategoryListRoute, navOptions)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
/*
* Copyright (c) 2024 Juan Nascimento
* Part of FileManagerSphere - ChatNavigation.kt
* SPDX-License-Identifier: GPL-3.0-or-later
* More details at: https://www.gnu.org/licenses/
*/

package com.etb.filemanager.compose.core.navigation

import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.runtime.getValue
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.navigation.NavController
import androidx.navigation.NavGraphBuilder
import androidx.navigation.NavOptions
import androidx.navigation.compose.composable
import com.etb.filemanager.compose.feature.presentation.chat_screen.ChatScreen
import com.etb.filemanager.compose.feature.presentation.chat_screen.ChatViewModel

const val ChatRoute = "chat"

fun NavGraphBuilder.chatScreen(
paddingValues: PaddingValues
) {
composable(
route = ChatRoute
) {
val viewModel: ChatViewModel = hiltViewModel()
val uiState by viewModel.state.collectAsStateWithLifecycle()

ChatScreen(uiState = uiState,
paddingValues = paddingValues,
onClickSendMsg = { msg ->
viewModel.sendMessage(msg)
},
onClickChat = { viewModel.setCurrentChat(it) }) { viewModel.newChat() }
}
}

fun NavController.navigateToChat(navOptions: NavOptions? = null) {
navigate(ChatRoute, navOptions)
}
Loading

0 comments on commit 93e8f87

Please sign in to comment.