Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 36 additions & 2 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,23 @@ fun getSecret(key: String): String? {
}

plugins {

alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose)
id("com.google.android.libraries.mapsplatform.secrets-gradle-plugin")
kotlin("plugin.serialization") version "2.2.0"
alias(libs.plugins.google.gms.google.services)
id("com.google.devtools.ksp")
id ("io.realm.kotlin")
}

android {
namespace = "com.kdbrian.templated"
namespace = "com.kdbrian.sage"
compileSdk = 35

defaultConfig {
applicationId = "com.kdbrian.templated"
applicationId = "com.kdbrian.sage"
minSdk = 26
targetSdk = 35
versionCode = 1
Expand Down Expand Up @@ -87,6 +92,9 @@ dependencies {
implementation(libs.androidx.ui.graphics)
implementation(libs.androidx.ui.tooling.preview)
implementation(libs.androidx.material3)
implementation(libs.firebase.analytics)
implementation(libs.firebase.firestore)
implementation(libs.firebase.storage)
testImplementation(libs.junit)
testImplementation(libs.junit.jupiter)
testImplementation(libs.junit.jupiter)
Expand All @@ -108,6 +116,32 @@ dependencies {
implementation(libs.koin.compose)
implementation(libs.koin.compose.viewmodel)

//nav
implementation(libs.androidx.navigation.compose)

//coil
implementation(libs.coil.compose)
implementation(libs.coil.network.okhttp)

//extended icons
implementation(libs.androidx.material.icons.extended)

//serialization
implementation(libs.kotlinx.serialization.json)

//datastore prefs
implementation(libs.androidx.datastore.preferences)

//accompanist permissions
implementation(libs.accompanist.permissions)

//room
// val room_version = "2.7.2"
// implementation("androidx.room:room-runtime:$room_version")
// ksp("androidx.room:room-compiler:$room_version")
// implementation("androidx.room:room-ktx:${room_version}")

//realm
implementation(libs.library.base)

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.kdbrian.templated
package com.kdbrian.sage

import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.ext.junit.runners.AndroidJUnit4
Expand Down

This file was deleted.

26 changes: 0 additions & 26 deletions app/src/androidTest/java/com/kdbrian/templated/GreetingEnvTest.kt

This file was deleted.

8 changes: 5 additions & 3 deletions app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,24 @@
xmlns:tools="http://schemas.android.com/tools">

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

<application
android:name=".TemplatedApp"
android:name=".Sage"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Templated"
android:theme="@style/Theme.Sage"
tools:targetApi="31">
<activity
android:name=".MainActivity"
android:exported="true"
android:label="@string/app_name"
android:theme="@style/Theme.Templated">
android:theme="@style/Theme.Sage">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

Expand Down
148 changes: 148 additions & 0 deletions app/src/main/java/com/kdbrian/sage/MainActivity.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,148 @@
package com.kdbrian.sage

import android.Manifest
import android.app.NotificationChannel
import android.app.NotificationManager
import android.os.Build
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.core.view.WindowCompat
import com.google.accompanist.permissions.ExperimentalPermissionsApi
import com.google.accompanist.permissions.isGranted
import com.google.accompanist.permissions.rememberPermissionState
import com.google.firebase.firestore.FirebaseFirestore
import com.kdbrian.sage.domain.model.TopicItem
import com.kdbrian.sage.nav.MainNav
import com.kdbrian.sage.ui.theme.SageTheme
import timber.log.Timber

class MainActivity : ComponentActivity() {

@OptIn(ExperimentalPermissionsApi::class)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
WindowCompat.setDecorFitsSystemWindows(window, false)
enableEdgeToEdge()

//create notification channel for android 14 and up
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(
NotificationChannel(
applicationContext.getString(R.string.default_notification_channel),
"Sage Notifications",
NotificationManager.IMPORTANCE_HIGH
)
)
}



setContent {
App {

/* val firebaseFirestore = koinInject<FirebaseFirestore>()
val appDataStore = koinInject<AppDataStore>()
val coroutineScope = rememberCoroutineScope()
*/
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
val permissionState =
rememberPermissionState(Manifest.permission.POST_NOTIFICATIONS)
LaunchedEffect(Unit) {
if (!permissionState.status.isGranted) {
permissionState.launchPermissionRequest()
}
}
}

/*LaunchedEffect(Unit) {
if (appDataStore.firstTime.first()){ //if is first time
uploadDefaultTopics(firebaseFirestore) {

val data = NotificationData(
channelId = applicationContext.getString(R.string.default_notification_channel),
title = if (it != null) "Error" else "Success",
message = it?.message ?: "Uploaded to firestore done.",
smallIcon = R.drawable.outline_brightness_alert_24
)

applicationContext.showNotification(
data = data,
notificationId = Random.nextInt(1, 9)
)

coroutineScope.launch {
appDataStore.updateFirstTime(false);
}

}
}
}*/


MainNav()
}
}

}

private fun uploadDefaultTopics(
db: FirebaseFirestore, onCompleteListener: (Throwable?) -> Unit = {}
) {
val topics = listOf(
"Business",
"Finance",
"Lifestyle",
"Technology",
"Health",
"Travel",
"Food",
"Education",
"Sports",
"Science",
"Entertainment",
"Politics",
"Environment",
"Art",
"Music",
"History",
"Fashion",
"Relationships",
"Self Improvement",
"Real Estate"
).map { topicName ->
TopicItem(topicName = topicName)
}

val batch = db.batch()
val topicsRef = db.collection(TopicItem.defaultCollectionName)

topics.forEach { topic ->
val docRef = topicsRef.document()
val topicWithId = topic.copy(topicId = docRef.id) // set topicId to Firestore doc id
batch.set(docRef, topicWithId)
}

batch.commit().addOnSuccessListener {
Timber.d("Firestore All topics uploaded successfully")
onCompleteListener(null)
}.addOnFailureListener { e ->
Timber.e("Firestore Error uploading topics ${e.localizedMessage}")
onCompleteListener(e)
}
}


}


@Composable
fun App(content: @Composable () -> Unit) {
SageTheme {
content()
}
}
43 changes: 43 additions & 0 deletions app/src/main/java/com/kdbrian/sage/Sage.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.kdbrian.sage

import android.app.Application
import com.kdbrian.sage.di.analyticsModule
import com.kdbrian.sage.di.coreModules
import com.kdbrian.sage.di.createDocumentModules
import com.kdbrian.sage.di.documentModules
import com.kdbrian.sage.di.firebaseModules
import com.kdbrian.sage.di.homeModules
import com.kdbrian.sage.di.realmModules
import com.kdbrian.sage.di.searchModules
import com.kdbrian.sage.di.topicModules
import org.koin.android.ext.koin.androidContext
import org.koin.android.ext.koin.androidLogger
import org.koin.core.context.startKoin
import timber.log.Timber

class Sage : Application() {
override fun onCreate() {
super.onCreate()

if (BuildConfig.DEBUG)
Timber.plant(Timber.DebugTree())

startKoin {

androidLogger()
androidContext(this@Sage)

modules(
analyticsModule,
coreModules,
createDocumentModules,
documentModules,
firebaseModules,
homeModules,
searchModules,
realmModules,
topicModules,
)
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.kdbrian.sage.data.local.model

import androidx.compose.ui.tooling.preview.datasource.LoremIpsum
import io.realm.kotlin.types.RealmObject
import io.realm.kotlin.types.annotations.PrimaryKey
import kotlinx.serialization.Serializable
import java.util.UUID

class InAppActivity(
@PrimaryKey
val _id: org.mongodb.kbson.ObjectId = org.mongodb.kbson.ObjectId(),
val timestamp: Long = System.currentTimeMillis(),
val name: String = "",
val route: String? = "",
) : RealmObject
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.kdbrian.sage.data.local.model.dao

import com.kdbrian.sage.data.local.model.InAppActivity
import kotlinx.coroutines.flow.Flow

interface InAppActivityDao {

suspend fun logActivity(inAppActivity: InAppActivity)

suspend fun logs(): Flow<InAppActivity>

suspend fun loadLogById(id: String): InAppActivity?

suspend fun clearLogs()
}
Loading
Loading