Rebrand from Casera/MyCrib to honeyDue
Total rebrand across KMM project: - Kotlin package: com.example.casera -> com.tt.honeyDue (dirs + declarations) - Gradle: rootProject.name, namespace, applicationId - Android: manifest, strings.xml (all languages), widget resources - iOS: pbxproj bundle IDs, Info.plist, entitlements, xcconfig - iOS directories: Casera/ -> HoneyDue/, CaseraTests/ -> HoneyDueTests/, etc. - Swift source: all class/struct/enum renames - Deep links: casera:// -> honeydue://, .casera -> .honeydue - App icons replaced with honeyDue honeycomb icon - Domains: casera.treytartt.com -> honeyDue.treytartt.com - Bundle IDs: com.tt.casera -> com.tt.honeyDue - Database table names preserved Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@@ -113,11 +113,11 @@ kotlin {
|
||||
}
|
||||
|
||||
android {
|
||||
namespace = "com.example.casera"
|
||||
namespace = "com.tt.honeyDue"
|
||||
compileSdk = libs.versions.android.compileSdk.get().toInt()
|
||||
|
||||
defaultConfig {
|
||||
applicationId = "com.example.casera"
|
||||
applicationId = "com.tt.honeyDue"
|
||||
minSdk = libs.versions.android.minSdk.get().toInt()
|
||||
targetSdk = libs.versions.android.targetSdk.get().toInt()
|
||||
versionCode = 1
|
||||
@@ -152,11 +152,11 @@ dependencies {
|
||||
|
||||
compose.desktop {
|
||||
application {
|
||||
mainClass = "com.example.casera.MainKt"
|
||||
mainClass = "com.tt.honeyDue.MainKt"
|
||||
|
||||
nativeDistributions {
|
||||
targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb)
|
||||
packageName = "com.example.casera"
|
||||
packageName = "com.tt.honeyDue"
|
||||
packageVersion = "1.0.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
"client_info": {
|
||||
"mobilesdk_app_id": "1:YOUR_PROJECT_NUMBER:android:YOUR_APP_ID",
|
||||
"android_client_info": {
|
||||
"package_name": "com.example.casera"
|
||||
"package_name": "com.tt.honeyDue"
|
||||
}
|
||||
},
|
||||
"oauth_client": [],
|
||||
|
||||
@@ -36,11 +36,11 @@
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
|
||||
<data
|
||||
android:scheme="casera"
|
||||
android:scheme="honeydue"
|
||||
android:host="reset-password" />
|
||||
</intent-filter>
|
||||
|
||||
<!-- .casera file import -->
|
||||
<!-- .honeydue file import -->
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
@@ -50,10 +50,10 @@
|
||||
<data android:scheme="file" />
|
||||
<data android:host="*" />
|
||||
<data android:mimeType="*/*" />
|
||||
<data android:pathPattern=".*\\.casera" />
|
||||
<data android:pathPattern=".*\\.honeydue" />
|
||||
</intent-filter>
|
||||
|
||||
<!-- .casera file import via content:// -->
|
||||
<!-- .honeydue file import via content:// -->
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
@@ -93,11 +93,11 @@
|
||||
android:name=".NotificationActionReceiver"
|
||||
android:exported="false">
|
||||
<intent-filter>
|
||||
<action android:name="com.example.casera.ACTION_VIEW_TASK" />
|
||||
<action android:name="com.example.casera.ACTION_COMPLETE_TASK" />
|
||||
<action android:name="com.example.casera.ACTION_MARK_IN_PROGRESS" />
|
||||
<action android:name="com.example.casera.ACTION_CANCEL_TASK" />
|
||||
<action android:name="com.example.casera.ACTION_UNCANCEL_TASK" />
|
||||
<action android:name="com.tt.honeyDue.ACTION_VIEW_TASK" />
|
||||
<action android:name="com.tt.honeyDue.ACTION_COMPLETE_TASK" />
|
||||
<action android:name="com.tt.honeyDue.ACTION_MARK_IN_PROGRESS" />
|
||||
<action android:name="com.tt.honeyDue.ACTION_CANCEL_TASK" />
|
||||
<action android:name="com.tt.honeyDue.ACTION_UNCANCEL_TASK" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
@@ -106,13 +106,13 @@
|
||||
android:name=".widget.WidgetTaskActionReceiver"
|
||||
android:exported="false">
|
||||
<intent-filter>
|
||||
<action android:name="com.example.casera.COMPLETE_TASK" />
|
||||
<action android:name="com.tt.honeyDue.COMPLETE_TASK" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<!-- Small Widget Receiver (2x1) -->
|
||||
<receiver
|
||||
android:name=".widget.CaseraSmallWidgetReceiver"
|
||||
android:name=".widget.HoneyDueSmallWidgetReceiver"
|
||||
android:exported="true"
|
||||
android:label="@string/widget_small_name">
|
||||
<intent-filter>
|
||||
@@ -120,12 +120,12 @@
|
||||
</intent-filter>
|
||||
<meta-data
|
||||
android:name="android.appwidget.provider"
|
||||
android:resource="@xml/casera_small_widget_info" />
|
||||
android:resource="@xml/honeydue_small_widget_info" />
|
||||
</receiver>
|
||||
|
||||
<!-- Medium Widget Receiver (4x2) -->
|
||||
<receiver
|
||||
android:name=".widget.CaseraMediumWidgetReceiver"
|
||||
android:name=".widget.HoneyDueMediumWidgetReceiver"
|
||||
android:exported="true"
|
||||
android:label="@string/widget_medium_name">
|
||||
<intent-filter>
|
||||
@@ -133,12 +133,12 @@
|
||||
</intent-filter>
|
||||
<meta-data
|
||||
android:name="android.appwidget.provider"
|
||||
android:resource="@xml/casera_medium_widget_info" />
|
||||
android:resource="@xml/honeydue_medium_widget_info" />
|
||||
</receiver>
|
||||
|
||||
<!-- Large Widget Receiver (4x4) -->
|
||||
<receiver
|
||||
android:name=".widget.CaseraLargeWidgetReceiver"
|
||||
android:name=".widget.HoneyDueLargeWidgetReceiver"
|
||||
android:exported="true"
|
||||
android:label="@string/widget_large_name">
|
||||
<intent-filter>
|
||||
@@ -146,7 +146,7 @@
|
||||
</intent-filter>
|
||||
<meta-data
|
||||
android:name="android.appwidget.provider"
|
||||
android:resource="@xml/casera_large_widget_info" />
|
||||
android:resource="@xml/honeydue_large_widget_info" />
|
||||
</receiver>
|
||||
</application>
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.ui.components
|
||||
package com.tt.honeyDue.ui.components
|
||||
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.layout.*
|
||||
@@ -10,8 +10,8 @@ import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.unit.dp
|
||||
import com.example.casera.models.TaskSummary
|
||||
import com.example.casera.models.TaskColumnCategory
|
||||
import com.tt.honeyDue.models.TaskSummary
|
||||
import com.tt.honeyDue.models.TaskColumnCategory
|
||||
|
||||
/**
|
||||
* Displays a task summary with dynamic categories from the backend.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera
|
||||
package com.tt.honeyDue
|
||||
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
@@ -22,22 +22,22 @@ import coil3.memory.MemoryCache
|
||||
import coil3.request.crossfade
|
||||
import coil3.util.DebugLogger
|
||||
import okio.FileSystem
|
||||
import com.example.casera.storage.TokenManager
|
||||
import com.example.casera.storage.TokenStorage
|
||||
import com.example.casera.storage.TaskCacheManager
|
||||
import com.example.casera.storage.TaskCacheStorage
|
||||
import com.example.casera.storage.ThemeStorage
|
||||
import com.example.casera.storage.ThemeStorageManager
|
||||
import com.example.casera.ui.theme.ThemeManager
|
||||
import com.example.casera.fcm.FCMManager
|
||||
import com.example.casera.platform.BillingManager
|
||||
import com.example.casera.network.APILayer
|
||||
import com.example.casera.sharing.ContractorSharingManager
|
||||
import com.example.casera.data.DataManager
|
||||
import com.example.casera.data.PersistenceManager
|
||||
import com.example.casera.models.CaseraPackageType
|
||||
import com.example.casera.models.detectCaseraPackageType
|
||||
import com.example.casera.analytics.PostHogAnalytics
|
||||
import com.tt.honeyDue.storage.TokenManager
|
||||
import com.tt.honeyDue.storage.TokenStorage
|
||||
import com.tt.honeyDue.storage.TaskCacheManager
|
||||
import com.tt.honeyDue.storage.TaskCacheStorage
|
||||
import com.tt.honeyDue.storage.ThemeStorage
|
||||
import com.tt.honeyDue.storage.ThemeStorageManager
|
||||
import com.tt.honeyDue.ui.theme.ThemeManager
|
||||
import com.tt.honeyDue.fcm.FCMManager
|
||||
import com.tt.honeyDue.platform.BillingManager
|
||||
import com.tt.honeyDue.network.APILayer
|
||||
import com.tt.honeyDue.sharing.ContractorSharingManager
|
||||
import com.tt.honeyDue.data.DataManager
|
||||
import com.tt.honeyDue.data.PersistenceManager
|
||||
import com.tt.honeyDue.models.honeyDuePackageType
|
||||
import com.tt.honeyDue.models.detecthoneyDuePackageType
|
||||
import com.tt.honeyDue.analytics.PostHogAnalytics
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
class MainActivity : ComponentActivity(), SingletonImageLoader.Factory {
|
||||
@@ -158,12 +158,12 @@ class MainActivity : ComponentActivity(), SingletonImageLoader.Factory {
|
||||
try {
|
||||
val authToken = TokenStorage.getToken()
|
||||
if (authToken != null) {
|
||||
val notificationApi = com.example.casera.network.NotificationApi()
|
||||
val notificationApi = com.tt.honeyDue.network.NotificationApi()
|
||||
val deviceId = android.provider.Settings.Secure.getString(
|
||||
contentResolver,
|
||||
android.provider.Settings.Secure.ANDROID_ID
|
||||
)
|
||||
val request = com.example.casera.models.DeviceRegistrationRequest(
|
||||
val request = com.tt.honeyDue.models.DeviceRegistrationRequest(
|
||||
deviceId = deviceId,
|
||||
registrationId = fcmToken,
|
||||
platform = "android",
|
||||
@@ -171,14 +171,14 @@ class MainActivity : ComponentActivity(), SingletonImageLoader.Factory {
|
||||
)
|
||||
|
||||
when (val result = notificationApi.registerDevice(authToken, request)) {
|
||||
is com.example.casera.network.ApiResult.Success -> {
|
||||
is com.tt.honeyDue.network.ApiResult.Success -> {
|
||||
Log.d("MainActivity", "Device registered successfully: ${result.data}")
|
||||
}
|
||||
is com.example.casera.network.ApiResult.Error -> {
|
||||
is com.tt.honeyDue.network.ApiResult.Error -> {
|
||||
Log.e("MainActivity", "Failed to register device: ${result.message}")
|
||||
}
|
||||
is com.example.casera.network.ApiResult.Loading,
|
||||
is com.example.casera.network.ApiResult.Idle -> {
|
||||
is com.tt.honeyDue.network.ApiResult.Loading,
|
||||
is com.tt.honeyDue.network.ApiResult.Idle -> {
|
||||
// These states shouldn't occur for direct API calls
|
||||
}
|
||||
}
|
||||
@@ -248,7 +248,7 @@ class MainActivity : ComponentActivity(), SingletonImageLoader.Factory {
|
||||
private fun handleDeepLink(intent: Intent?) {
|
||||
val data: Uri? = intent?.data
|
||||
val isResetLink = data != null &&
|
||||
data.scheme == "casera" &&
|
||||
data.scheme == "honeydue" &&
|
||||
data.host == "reset-password"
|
||||
if (isResetLink) {
|
||||
// Extract token from query parameter
|
||||
@@ -263,8 +263,8 @@ class MainActivity : ComponentActivity(), SingletonImageLoader.Factory {
|
||||
private fun handleFileImport(intent: Intent?) {
|
||||
if (intent?.action == Intent.ACTION_VIEW) {
|
||||
val uri = intent.data
|
||||
if (uri != null && ContractorSharingManager.isCaseraFile(applicationContext, uri)) {
|
||||
Log.d("MainActivity", "Casera file received: $uri")
|
||||
if (uri != null && ContractorSharingManager.ishoneyDueFile(applicationContext, uri)) {
|
||||
Log.d("MainActivity", "honeyDue file received: $uri")
|
||||
|
||||
// Read file content to detect package type
|
||||
try {
|
||||
@@ -273,11 +273,11 @@ class MainActivity : ComponentActivity(), SingletonImageLoader.Factory {
|
||||
val jsonString = inputStream.bufferedReader().use { it.readText() }
|
||||
inputStream.close()
|
||||
|
||||
val packageType = detectCaseraPackageType(jsonString)
|
||||
val packageType = detecthoneyDuePackageType(jsonString)
|
||||
Log.d("MainActivity", "Detected package type: $packageType")
|
||||
|
||||
when (packageType) {
|
||||
CaseraPackageType.RESIDENCE -> {
|
||||
honeyDuePackageType.RESIDENCE -> {
|
||||
Log.d("MainActivity", "Routing to residence import")
|
||||
pendingResidenceImportUri = uri
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera
|
||||
package com.tt.honeyDue
|
||||
|
||||
import android.app.NotificationChannel
|
||||
import android.app.NotificationManager
|
||||
@@ -8,7 +8,7 @@ import android.content.Intent
|
||||
import android.os.Build
|
||||
import android.util.Log
|
||||
import androidx.core.app.NotificationCompat
|
||||
import com.example.casera.data.DataManager
|
||||
import com.tt.honeyDue.data.DataManager
|
||||
import com.google.firebase.messaging.FirebaseMessagingService
|
||||
import com.google.firebase.messaging.RemoteMessage
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
@@ -31,14 +31,14 @@ class MyFirebaseMessagingService : FirebaseMessagingService() {
|
||||
// Note: In a real app, you might want to use WorkManager for reliable delivery
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
try {
|
||||
val authToken = com.example.casera.storage.TokenStorage.getToken()
|
||||
val authToken = com.tt.honeyDue.storage.TokenStorage.getToken()
|
||||
if (authToken != null) {
|
||||
val notificationApi = com.example.casera.network.NotificationApi()
|
||||
val notificationApi = com.tt.honeyDue.network.NotificationApi()
|
||||
val deviceId = android.provider.Settings.Secure.getString(
|
||||
applicationContext.contentResolver,
|
||||
android.provider.Settings.Secure.ANDROID_ID
|
||||
)
|
||||
val request = com.example.casera.models.DeviceRegistrationRequest(
|
||||
val request = com.tt.honeyDue.models.DeviceRegistrationRequest(
|
||||
deviceId = deviceId,
|
||||
registrationId = token,
|
||||
platform = "android",
|
||||
@@ -46,14 +46,14 @@ class MyFirebaseMessagingService : FirebaseMessagingService() {
|
||||
)
|
||||
|
||||
when (val result = notificationApi.registerDevice(authToken, request)) {
|
||||
is com.example.casera.network.ApiResult.Success -> {
|
||||
is com.tt.honeyDue.network.ApiResult.Success -> {
|
||||
Log.d(TAG, "Device registered successfully with new token")
|
||||
}
|
||||
is com.example.casera.network.ApiResult.Error -> {
|
||||
is com.tt.honeyDue.network.ApiResult.Error -> {
|
||||
Log.e(TAG, "Failed to register device with new token: ${result.message}")
|
||||
}
|
||||
is com.example.casera.network.ApiResult.Loading,
|
||||
is com.example.casera.network.ApiResult.Idle -> {
|
||||
is com.tt.honeyDue.network.ApiResult.Loading,
|
||||
is com.tt.honeyDue.network.ApiResult.Idle -> {
|
||||
// These states shouldn't occur for direct API calls
|
||||
}
|
||||
}
|
||||
@@ -73,7 +73,7 @@ class MyFirebaseMessagingService : FirebaseMessagingService() {
|
||||
message.notification?.let { notification ->
|
||||
Log.d(TAG, "Notification: ${notification.title} - ${notification.body}")
|
||||
sendNotification(
|
||||
notification.title ?: "MyCrib",
|
||||
notification.title ?: "honeyDue",
|
||||
notification.body ?: "",
|
||||
message.data
|
||||
)
|
||||
@@ -85,7 +85,7 @@ class MyFirebaseMessagingService : FirebaseMessagingService() {
|
||||
|
||||
// If there's no notification payload, create one from data
|
||||
if (message.notification == null) {
|
||||
val title = message.data["title"] ?: "MyCrib"
|
||||
val title = message.data["title"] ?: "honeyDue"
|
||||
val body = message.data["body"] ?: ""
|
||||
sendNotification(title, body, message.data)
|
||||
}
|
||||
@@ -143,7 +143,7 @@ class MyFirebaseMessagingService : FirebaseMessagingService() {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
||||
val channel = NotificationChannel(
|
||||
channelId,
|
||||
"Casera Notifications",
|
||||
"honeyDue Notifications",
|
||||
NotificationManager.IMPORTANCE_HIGH
|
||||
).apply {
|
||||
description = "Notifications for tasks, residences, and warranties"
|
||||
@@ -210,7 +210,7 @@ class MyFirebaseMessagingService : FirebaseMessagingService() {
|
||||
companion object {
|
||||
private const val TAG = "FCMService"
|
||||
private const val NOTIFICATION_ID = 0
|
||||
private const val PREFS_NAME = "mycrib_prefs"
|
||||
private const val PREFS_NAME = "honeydue_prefs"
|
||||
private const val KEY_FCM_TOKEN = "fcm_token"
|
||||
|
||||
fun getStoredToken(context: Context): String? {
|
||||
@@ -1,15 +1,15 @@
|
||||
package com.example.casera
|
||||
package com.tt.honeyDue
|
||||
|
||||
import android.content.BroadcastReceiver
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.util.Log
|
||||
import androidx.core.app.NotificationManagerCompat
|
||||
import com.example.casera.data.DataManager
|
||||
import com.example.casera.models.TaskCompletionCreateRequest
|
||||
import com.example.casera.network.APILayer
|
||||
import com.example.casera.network.ApiResult
|
||||
import com.example.casera.storage.TokenStorage
|
||||
import com.tt.honeyDue.data.DataManager
|
||||
import com.tt.honeyDue.models.TaskCompletionCreateRequest
|
||||
import com.tt.honeyDue.network.APILayer
|
||||
import com.tt.honeyDue.network.ApiResult
|
||||
import com.tt.honeyDue.storage.TokenStorage
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
@@ -157,11 +157,11 @@ class NotificationActionReceiver : BroadcastReceiver() {
|
||||
private const val TAG = "NotificationAction"
|
||||
|
||||
// Action constants
|
||||
const val ACTION_VIEW_TASK = "com.example.casera.ACTION_VIEW_TASK"
|
||||
const val ACTION_COMPLETE_TASK = "com.example.casera.ACTION_COMPLETE_TASK"
|
||||
const val ACTION_MARK_IN_PROGRESS = "com.example.casera.ACTION_MARK_IN_PROGRESS"
|
||||
const val ACTION_CANCEL_TASK = "com.example.casera.ACTION_CANCEL_TASK"
|
||||
const val ACTION_UNCANCEL_TASK = "com.example.casera.ACTION_UNCANCEL_TASK"
|
||||
const val ACTION_VIEW_TASK = "com.tt.honeyDue.ACTION_VIEW_TASK"
|
||||
const val ACTION_COMPLETE_TASK = "com.tt.honeyDue.ACTION_COMPLETE_TASK"
|
||||
const val ACTION_MARK_IN_PROGRESS = "com.tt.honeyDue.ACTION_MARK_IN_PROGRESS"
|
||||
const val ACTION_CANCEL_TASK = "com.tt.honeyDue.ACTION_CANCEL_TASK"
|
||||
const val ACTION_UNCANCEL_TASK = "com.tt.honeyDue.ACTION_UNCANCEL_TASK"
|
||||
|
||||
// Extra constants
|
||||
const val EXTRA_TASK_ID = "task_id"
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera
|
||||
package com.tt.honeyDue
|
||||
|
||||
import android.os.Build
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.analytics
|
||||
package com.tt.honeyDue.analytics
|
||||
|
||||
import android.app.Application
|
||||
import com.posthog.PostHog
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.auth
|
||||
package com.tt.honeyDue.auth
|
||||
|
||||
import android.content.Context
|
||||
import androidx.credentials.CredentialManager
|
||||
@@ -6,7 +6,7 @@ import androidx.credentials.CustomCredential
|
||||
import androidx.credentials.GetCredentialRequest
|
||||
import androidx.credentials.GetCredentialResponse
|
||||
import androidx.credentials.exceptions.GetCredentialException
|
||||
import com.example.casera.network.ApiConfig
|
||||
import com.tt.honeyDue.network.ApiConfig
|
||||
import com.google.android.libraries.identity.googleid.GetGoogleIdOption
|
||||
import com.google.android.libraries.identity.googleid.GoogleIdTokenCredential
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.data
|
||||
package com.tt.honeyDue.data
|
||||
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
@@ -29,7 +29,7 @@ actual class PersistenceManager(context: Context) {
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val PREFS_NAME = "casera_data_manager"
|
||||
private const val PREFS_NAME = "honeydue_data_manager"
|
||||
|
||||
@Volatile
|
||||
private var instance: PersistenceManager? = null
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.fcm
|
||||
package com.tt.honeyDue.fcm
|
||||
|
||||
import android.Manifest
|
||||
import android.app.Activity
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.network
|
||||
package com.tt.honeyDue.network
|
||||
|
||||
import io.ktor.client.*
|
||||
import io.ktor.client.engine.okhttp.*
|
||||
@@ -34,7 +34,7 @@ actual fun createHttpClient(): HttpClient {
|
||||
logger = Logger.DEFAULT
|
||||
// Only log full request/response bodies in debug builds to avoid
|
||||
// leaking auth tokens and PII in production logcat.
|
||||
level = if (com.example.casera.BuildConfig.DEBUG) LogLevel.ALL else LogLevel.INFO
|
||||
level = if (com.tt.honeyDue.BuildConfig.DEBUG) LogLevel.ALL else LogLevel.INFO
|
||||
}
|
||||
|
||||
install(DefaultRequest) {
|
||||
@@ -1,12 +1,12 @@
|
||||
package com.example.casera.platform
|
||||
package com.tt.honeyDue.platform
|
||||
|
||||
import android.app.Activity
|
||||
import android.content.Context
|
||||
import android.util.Log
|
||||
import com.android.billingclient.api.*
|
||||
import com.example.casera.network.APILayer
|
||||
import com.example.casera.network.ApiResult
|
||||
import com.example.casera.utils.SubscriptionProducts
|
||||
import com.tt.honeyDue.network.APILayer
|
||||
import com.tt.honeyDue.network.ApiResult
|
||||
import com.tt.honeyDue.utils.SubscriptionProducts
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.SupervisorJob
|
||||
@@ -1,9 +1,9 @@
|
||||
package com.example.casera.platform
|
||||
package com.tt.honeyDue.platform
|
||||
|
||||
import android.net.Uri
|
||||
import androidx.compose.runtime.Composable
|
||||
import com.example.casera.models.Contractor
|
||||
import com.example.casera.ui.components.ContractorImportHandler as ContractorImportHandlerImpl
|
||||
import com.tt.honeyDue.models.Contractor
|
||||
import com.tt.honeyDue.ui.components.ContractorImportHandler as ContractorImportHandlerImpl
|
||||
|
||||
@Composable
|
||||
actual fun ContractorImportHandler(
|
||||
@@ -1,12 +1,12 @@
|
||||
package com.example.casera.platform
|
||||
package com.tt.honeyDue.platform
|
||||
|
||||
import android.content.Intent
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import com.example.casera.models.Contractor
|
||||
import com.example.casera.sharing.ContractorSharingManager
|
||||
import com.example.casera.analytics.PostHogAnalytics
|
||||
import com.example.casera.analytics.AnalyticsEvents
|
||||
import com.tt.honeyDue.models.Contractor
|
||||
import com.tt.honeyDue.sharing.ContractorSharingManager
|
||||
import com.tt.honeyDue.analytics.PostHogAnalytics
|
||||
import com.tt.honeyDue.analytics.AnalyticsEvents
|
||||
|
||||
@Composable
|
||||
actual fun rememberShareContractor(): (Contractor) -> Unit {
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.platform
|
||||
package com.tt.honeyDue.platform
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Build
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.platform
|
||||
package com.tt.honeyDue.platform
|
||||
|
||||
import android.graphics.BitmapFactory
|
||||
import androidx.compose.runtime.Composable
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.platform
|
||||
package com.tt.honeyDue.platform
|
||||
|
||||
import android.content.Context
|
||||
import coil3.ImageLoader
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.platform
|
||||
package com.tt.honeyDue.platform
|
||||
|
||||
import android.content.Context
|
||||
import android.net.Uri
|
||||
@@ -1,9 +1,9 @@
|
||||
package com.example.casera.platform
|
||||
package com.tt.honeyDue.platform
|
||||
|
||||
import android.app.Activity
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import com.example.casera.ui.subscription.UpgradeScreen
|
||||
import com.tt.honeyDue.ui.subscription.UpgradeScreen
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
@Composable
|
||||
@@ -1,9 +1,9 @@
|
||||
package com.example.casera.platform
|
||||
package com.tt.honeyDue.platform
|
||||
|
||||
import android.net.Uri
|
||||
import androidx.compose.runtime.Composable
|
||||
import com.example.casera.models.JoinResidenceResponse
|
||||
import com.example.casera.ui.components.ResidenceImportHandler as ResidenceImportHandlerImpl
|
||||
import com.tt.honeyDue.models.JoinResidenceResponse
|
||||
import com.tt.honeyDue.ui.components.ResidenceImportHandler as ResidenceImportHandlerImpl
|
||||
|
||||
@Composable
|
||||
actual fun ResidenceImportHandler(
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.platform
|
||||
package com.tt.honeyDue.platform
|
||||
|
||||
import android.content.Intent
|
||||
import androidx.compose.runtime.Composable
|
||||
@@ -8,10 +8,10 @@ import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.rememberCoroutineScope
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import com.example.casera.models.Residence
|
||||
import com.example.casera.sharing.ResidenceSharingManager
|
||||
import com.example.casera.analytics.PostHogAnalytics
|
||||
import com.example.casera.analytics.AnalyticsEvents
|
||||
import com.tt.honeyDue.models.Residence
|
||||
import com.tt.honeyDue.sharing.ResidenceSharingManager
|
||||
import com.tt.honeyDue.analytics.PostHogAnalytics
|
||||
import com.tt.honeyDue.analytics.AnalyticsEvents
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
@Composable
|
||||
@@ -1,26 +1,26 @@
|
||||
package com.example.casera.sharing
|
||||
package com.tt.honeyDue.sharing
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import androidx.core.content.FileProvider
|
||||
import com.example.casera.data.DataManager
|
||||
import com.example.casera.models.CaseraShareCodec
|
||||
import com.example.casera.models.Contractor
|
||||
import com.example.casera.network.APILayer
|
||||
import com.example.casera.network.ApiResult
|
||||
import com.tt.honeyDue.data.DataManager
|
||||
import com.tt.honeyDue.models.honeyDueShareCodec
|
||||
import com.tt.honeyDue.models.Contractor
|
||||
import com.tt.honeyDue.network.APILayer
|
||||
import com.tt.honeyDue.network.ApiResult
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.withContext
|
||||
import java.io.File
|
||||
|
||||
/**
|
||||
* Manages contractor export and import via .casera files on Android.
|
||||
* Manages contractor export and import via .honeydue files on Android.
|
||||
*/
|
||||
object ContractorSharingManager {
|
||||
|
||||
/**
|
||||
* Creates a share Intent for a contractor.
|
||||
* The contractor data is written to a temporary .casera file and shared via FileProvider.
|
||||
* The contractor data is written to a temporary .honeydue file and shared via FileProvider.
|
||||
*
|
||||
* @param context Android context
|
||||
* @param contractor The contractor to share
|
||||
@@ -29,8 +29,8 @@ object ContractorSharingManager {
|
||||
fun createShareIntent(context: Context, contractor: Contractor): Intent? {
|
||||
return try {
|
||||
val currentUsername = DataManager.currentUser.value?.username ?: "Unknown"
|
||||
val jsonString = CaseraShareCodec.encodeContractorPackage(contractor, currentUsername)
|
||||
val fileName = CaseraShareCodec.safeShareFileName(contractor.name)
|
||||
val jsonString = honeyDueShareCodec.encodeContractorPackage(contractor, currentUsername)
|
||||
val fileName = honeyDueShareCodec.safeShareFileName(contractor.name)
|
||||
|
||||
// Create shared directory
|
||||
val shareDir = File(context.cacheDir, "shared")
|
||||
@@ -61,7 +61,7 @@ object ContractorSharingManager {
|
||||
* Imports a contractor from a content URI.
|
||||
*
|
||||
* @param context Android context
|
||||
* @param uri The content URI of the .casera file
|
||||
* @param uri The content URI of the .honeydue file
|
||||
* @return ApiResult with the created Contractor on success, or error on failure
|
||||
*/
|
||||
suspend fun importContractor(context: Context, uri: Uri): ApiResult<Contractor> {
|
||||
@@ -79,7 +79,7 @@ object ContractorSharingManager {
|
||||
val jsonString = inputStream.bufferedReader().use { it.readText() }
|
||||
inputStream.close()
|
||||
|
||||
val createRequest = CaseraShareCodec.createContractorImportRequestOrNull(
|
||||
val createRequest = honeyDueShareCodec.createContractorImportRequestOrNull(
|
||||
jsonContent = jsonString,
|
||||
availableSpecialties = DataManager.contractorSpecialties.value
|
||||
) ?: return@withContext ApiResult.Error("Invalid contractor share package")
|
||||
@@ -94,12 +94,12 @@ object ContractorSharingManager {
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the given URI appears to be a .casera file.
|
||||
* Checks if the given URI appears to be a .honeydue file.
|
||||
*/
|
||||
fun isCaseraFile(context: Context, uri: Uri): Boolean {
|
||||
fun ishoneyDueFile(context: Context, uri: Uri): Boolean {
|
||||
// Check file extension from URI path
|
||||
val path = uri.path ?: uri.toString()
|
||||
if (path.endsWith(".casera", ignoreCase = true)) {
|
||||
if (path.endsWith(".honeydue", ignoreCase = true)) {
|
||||
return true
|
||||
}
|
||||
|
||||
@@ -110,7 +110,7 @@ object ContractorSharingManager {
|
||||
val nameIndex = cursor.getColumnIndex(android.provider.OpenableColumns.DISPLAY_NAME)
|
||||
if (nameIndex >= 0) {
|
||||
val name = cursor.getString(nameIndex)
|
||||
if (name?.endsWith(".casera", ignoreCase = true) == true) {
|
||||
if (name?.endsWith(".honeydue", ignoreCase = true) == true) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
@@ -1,21 +1,21 @@
|
||||
package com.example.casera.sharing
|
||||
package com.tt.honeyDue.sharing
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import android.net.Uri
|
||||
import androidx.core.content.FileProvider
|
||||
import com.example.casera.data.DataManager
|
||||
import com.example.casera.models.CaseraShareCodec
|
||||
import com.example.casera.models.JoinResidenceResponse
|
||||
import com.example.casera.models.Residence
|
||||
import com.example.casera.network.APILayer
|
||||
import com.example.casera.network.ApiResult
|
||||
import com.tt.honeyDue.data.DataManager
|
||||
import com.tt.honeyDue.models.honeyDueShareCodec
|
||||
import com.tt.honeyDue.models.JoinResidenceResponse
|
||||
import com.tt.honeyDue.models.Residence
|
||||
import com.tt.honeyDue.network.APILayer
|
||||
import com.tt.honeyDue.network.ApiResult
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.withContext
|
||||
import java.io.File
|
||||
|
||||
/**
|
||||
* Manages residence share package creation and import via .casera files on Android.
|
||||
* Manages residence share package creation and import via .honeydue files on Android.
|
||||
* Unlike contractors (which are exported client-side), residence sharing uses
|
||||
* server-generated share codes.
|
||||
*/
|
||||
@@ -38,8 +38,8 @@ object ResidenceSharingManager {
|
||||
when (result) {
|
||||
is ApiResult.Success -> {
|
||||
val sharedResidence = result.data
|
||||
val jsonString = CaseraShareCodec.encodeSharedResidence(sharedResidence)
|
||||
val fileName = CaseraShareCodec.safeShareFileName(residence.name)
|
||||
val jsonString = honeyDueShareCodec.encodeSharedResidence(sharedResidence)
|
||||
val fileName = honeyDueShareCodec.safeShareFileName(residence.name)
|
||||
|
||||
// Create shared directory
|
||||
val shareDir = File(context.cacheDir, "shared")
|
||||
@@ -77,7 +77,7 @@ object ResidenceSharingManager {
|
||||
* Imports (joins) a residence from a content URI containing a share code.
|
||||
*
|
||||
* @param context Android context
|
||||
* @param uri The content URI of the .casera file
|
||||
* @param uri The content URI of the .honeydue file
|
||||
* @return ApiResult with the JoinResidenceResponse on success, or error on failure
|
||||
*/
|
||||
suspend fun importResidence(context: Context, uri: Uri): ApiResult<JoinResidenceResponse> {
|
||||
@@ -95,7 +95,7 @@ object ResidenceSharingManager {
|
||||
val jsonString = inputStream.bufferedReader().use { it.readText() }
|
||||
inputStream.close()
|
||||
|
||||
val shareCode = CaseraShareCodec.extractResidenceShareCodeOrNull(jsonString)
|
||||
val shareCode = honeyDueShareCodec.extractResidenceShareCodeOrNull(jsonString)
|
||||
?: return@withContext ApiResult.Error("Invalid residence share package")
|
||||
|
||||
// Call API with share code
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.storage
|
||||
package com.tt.honeyDue.storage
|
||||
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
@@ -47,7 +47,7 @@ actual class TaskCacheManager(private val context: Context) {
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val PREFS_NAME = "mycrib_cache"
|
||||
private const val PREFS_NAME = "honeydue_cache"
|
||||
private const val KEY_TASKS = "cached_tasks"
|
||||
private const val KEY_DIRTY_FLAG = "tasks_dirty"
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.storage
|
||||
package com.tt.honeyDue.storage
|
||||
|
||||
internal actual fun getPlatformTaskCacheManager(): TaskCacheManager? {
|
||||
// Android requires context, so must use initialize() method
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.storage
|
||||
package com.tt.honeyDue.storage
|
||||
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
@@ -22,7 +22,7 @@ actual class ThemeStorageManager(context: Context) {
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val PREFS_NAME = "mycrib_theme_prefs"
|
||||
private const val PREFS_NAME = "honeydue_theme_prefs"
|
||||
private const val KEY_THEME_ID = "theme_id"
|
||||
|
||||
@Volatile
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.storage
|
||||
package com.tt.honeyDue.storage
|
||||
|
||||
import android.content.Context
|
||||
import android.content.SharedPreferences
|
||||
@@ -31,8 +31,8 @@ actual class TokenManager(private val context: Context) {
|
||||
|
||||
companion object {
|
||||
private const val TAG = "TokenManager"
|
||||
private const val ENCRYPTED_PREFS_NAME = "mycrib_secure_prefs"
|
||||
private const val FALLBACK_PREFS_NAME = "mycrib_prefs"
|
||||
private const val ENCRYPTED_PREFS_NAME = "honeydue_secure_prefs"
|
||||
private const val FALLBACK_PREFS_NAME = "honeydue_prefs"
|
||||
private const val KEY_TOKEN = "auth_token"
|
||||
|
||||
@Volatile
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.storage
|
||||
package com.tt.honeyDue.storage
|
||||
|
||||
internal actual fun getPlatformTokenManager(): TokenManager? {
|
||||
// Android requires context, so must use initialize() method
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.ui.components
|
||||
package com.tt.honeyDue.ui.components
|
||||
|
||||
import android.net.Uri
|
||||
import androidx.compose.runtime.Composable
|
||||
@@ -9,10 +9,10 @@ import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.rememberCoroutineScope
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import com.example.casera.models.Contractor
|
||||
import com.example.casera.models.SharedContractor
|
||||
import com.example.casera.network.ApiResult
|
||||
import com.example.casera.sharing.ContractorSharingManager
|
||||
import com.tt.honeyDue.models.Contractor
|
||||
import com.tt.honeyDue.models.SharedContractor
|
||||
import com.tt.honeyDue.network.ApiResult
|
||||
import com.tt.honeyDue.sharing.ContractorSharingManager
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
@@ -33,7 +33,7 @@ sealed class ImportState {
|
||||
* Android-specific composable that handles the contractor import flow.
|
||||
* Shows confirmation dialog, performs import, and displays result.
|
||||
*
|
||||
* @param pendingImportUri The URI of the .casera file to import (or null if none)
|
||||
* @param pendingImportUri The URI of the .honeydue file to import (or null if none)
|
||||
* @param onClearImport Called when import flow is complete and URI should be cleared
|
||||
* @param onImportSuccess Called when import succeeds, with the imported contractor
|
||||
*/
|
||||
@@ -57,7 +57,7 @@ fun ContractorImportHandler(
|
||||
}
|
||||
}
|
||||
|
||||
// Parse the .casera file when a new URI is received
|
||||
// Parse the .honeydue file when a new URI is received
|
||||
LaunchedEffect(pendingImportUri) {
|
||||
if (pendingImportUri != null && importState is ImportState.Idle) {
|
||||
pendingUri = pendingImportUri
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.ui.components
|
||||
package com.tt.honeyDue.ui.components
|
||||
|
||||
import android.net.Uri
|
||||
import androidx.compose.runtime.Composable
|
||||
@@ -9,10 +9,10 @@ import androidx.compose.runtime.remember
|
||||
import androidx.compose.runtime.rememberCoroutineScope
|
||||
import androidx.compose.runtime.setValue
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import com.example.casera.models.JoinResidenceResponse
|
||||
import com.example.casera.models.SharedResidence
|
||||
import com.example.casera.network.ApiResult
|
||||
import com.example.casera.sharing.ResidenceSharingManager
|
||||
import com.tt.honeyDue.models.JoinResidenceResponse
|
||||
import com.tt.honeyDue.models.SharedResidence
|
||||
import com.tt.honeyDue.network.ApiResult
|
||||
import com.tt.honeyDue.sharing.ResidenceSharingManager
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
import kotlinx.coroutines.withContext
|
||||
@@ -33,7 +33,7 @@ sealed class ResidenceImportState {
|
||||
* Android-specific composable that handles the residence import flow.
|
||||
* Shows confirmation dialog, performs import, and displays result.
|
||||
*
|
||||
* @param pendingImportUri The URI of the .casera file to import (or null if none)
|
||||
* @param pendingImportUri The URI of the .honeydue file to import (or null if none)
|
||||
* @param onClearImport Called when import flow is complete and URI should be cleared
|
||||
* @param onImportSuccess Called when import succeeds, with the join response
|
||||
*/
|
||||
@@ -57,7 +57,7 @@ fun ResidenceImportHandler(
|
||||
}
|
||||
}
|
||||
|
||||
// Parse the .casera file when a new URI is received
|
||||
// Parse the .honeydue file when a new URI is received
|
||||
LaunchedEffect(pendingImportUri) {
|
||||
if (pendingImportUri != null && importState is ResidenceImportState.Idle) {
|
||||
pendingUri = pendingImportUri
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.ui.components.auth
|
||||
package com.tt.honeyDue.ui.components.auth
|
||||
|
||||
import androidx.compose.foundation.BorderStroke
|
||||
import androidx.compose.foundation.Image
|
||||
@@ -13,8 +13,8 @@ import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.res.painterResource
|
||||
import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.unit.dp
|
||||
import com.example.casera.auth.GoogleSignInManager
|
||||
import com.example.casera.auth.GoogleSignInResult
|
||||
import com.tt.honeyDue.auth.GoogleSignInManager
|
||||
import com.tt.honeyDue.auth.GoogleSignInResult
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
@Composable
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.ui.subscription
|
||||
package com.tt.honeyDue.ui.subscription
|
||||
|
||||
import android.app.Activity
|
||||
import androidx.compose.foundation.BorderStroke
|
||||
@@ -17,9 +17,9 @@ import androidx.compose.ui.text.font.FontWeight
|
||||
import androidx.compose.ui.text.style.TextAlign
|
||||
import androidx.compose.ui.unit.dp
|
||||
import com.android.billingclient.api.ProductDetails
|
||||
import com.example.casera.data.DataManager
|
||||
import com.example.casera.platform.BillingManager
|
||||
import com.example.casera.ui.theme.AppSpacing
|
||||
import com.tt.honeyDue.data.DataManager
|
||||
import com.tt.honeyDue.platform.BillingManager
|
||||
import com.tt.honeyDue.ui.theme.AppSpacing
|
||||
import kotlinx.coroutines.launch
|
||||
|
||||
/**
|
||||
@@ -344,7 +344,7 @@ private fun SubscriptionProductCardAndroid(
|
||||
onSelect: () -> Unit
|
||||
) {
|
||||
val isAnnual = productDetails.productId.contains("annual")
|
||||
val productName = if (isAnnual) "MyCrib Pro Annual" else "MyCrib Pro Monthly"
|
||||
val productName = if (isAnnual) "honeyDue Pro Annual" else "honeyDue Pro Monthly"
|
||||
val billingPeriod = if (isAnnual) "Billed annually" else "Billed monthly"
|
||||
|
||||
Card(
|
||||
@@ -1,8 +1,8 @@
|
||||
package com.example.casera.util
|
||||
package com.tt.honeyDue.util
|
||||
|
||||
import android.graphics.Bitmap
|
||||
import android.graphics.BitmapFactory
|
||||
import com.example.casera.platform.ImageData
|
||||
import com.tt.honeyDue.platform.ImageData
|
||||
import java.io.ByteArrayOutputStream
|
||||
|
||||
/**
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.widget
|
||||
package com.tt.honeyDue.widget
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
@@ -50,7 +50,7 @@ import kotlinx.serialization.json.Json
|
||||
* Large widget showing task list with stats and interactive actions (Pro only)
|
||||
* Size: 4x4
|
||||
*/
|
||||
class CaseraLargeWidget : GlanceAppWidget() {
|
||||
class HoneyDueLargeWidget : GlanceAppWidget() {
|
||||
|
||||
override val stateDefinition: GlanceStateDefinition<*> = PreferencesGlanceStateDefinition
|
||||
|
||||
@@ -97,7 +97,7 @@ class CaseraLargeWidget : GlanceAppWidget() {
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
Text(
|
||||
text = "Casera",
|
||||
text = "honeyDue",
|
||||
style = TextStyle(
|
||||
color = ColorProvider(Color(0xFF07A0C3)),
|
||||
fontSize = 20.sp,
|
||||
@@ -346,7 +346,7 @@ class CompleteTaskAction : ActionCallback {
|
||||
val taskId = parameters[ActionParameters.Key<Int>("task_id")] ?: return
|
||||
|
||||
// Send broadcast to app to complete the task
|
||||
val intent = Intent("com.example.casera.COMPLETE_TASK").apply {
|
||||
val intent = Intent("com.tt.honeyDue.COMPLETE_TASK").apply {
|
||||
putExtra("task_id", taskId)
|
||||
setPackage(context.packageName)
|
||||
}
|
||||
@@ -354,7 +354,7 @@ class CompleteTaskAction : ActionCallback {
|
||||
|
||||
// Update widget after action
|
||||
withContext(Dispatchers.Main) {
|
||||
CaseraLargeWidget().update(context, glanceId)
|
||||
HoneyDueLargeWidget().update(context, glanceId)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -362,6 +362,6 @@ class CompleteTaskAction : ActionCallback {
|
||||
/**
|
||||
* Receiver for the large widget
|
||||
*/
|
||||
class CaseraLargeWidgetReceiver : GlanceAppWidgetReceiver() {
|
||||
override val glanceAppWidget: GlanceAppWidget = CaseraLargeWidget()
|
||||
class HoneyDueLargeWidgetReceiver : GlanceAppWidgetReceiver() {
|
||||
override val glanceAppWidget: GlanceAppWidget = HoneyDueLargeWidget()
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.widget
|
||||
package com.tt.honeyDue.widget
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
@@ -46,7 +46,7 @@ import kotlinx.serialization.json.Json
|
||||
* Medium widget showing a list of upcoming tasks
|
||||
* Size: 4x2
|
||||
*/
|
||||
class CaseraMediumWidget : GlanceAppWidget() {
|
||||
class HoneyDueMediumWidget : GlanceAppWidget() {
|
||||
|
||||
override val stateDefinition: GlanceStateDefinition<*> = PreferencesGlanceStateDefinition
|
||||
|
||||
@@ -90,7 +90,7 @@ class CaseraMediumWidget : GlanceAppWidget() {
|
||||
verticalAlignment = Alignment.CenterVertically
|
||||
) {
|
||||
Text(
|
||||
text = "Casera",
|
||||
text = "honeyDue",
|
||||
style = TextStyle(
|
||||
color = ColorProvider(Color(0xFF07A0C3)),
|
||||
fontSize = 18.sp,
|
||||
@@ -247,6 +247,6 @@ class OpenTaskAction : ActionCallback {
|
||||
/**
|
||||
* Receiver for the medium widget
|
||||
*/
|
||||
class CaseraMediumWidgetReceiver : GlanceAppWidgetReceiver() {
|
||||
override val glanceAppWidget: GlanceAppWidget = CaseraMediumWidget()
|
||||
class HoneyDueMediumWidgetReceiver : GlanceAppWidgetReceiver() {
|
||||
override val glanceAppWidget: GlanceAppWidget = HoneyDueMediumWidget()
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.widget
|
||||
package com.tt.honeyDue.widget
|
||||
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
@@ -39,13 +39,13 @@ import androidx.glance.text.TextStyle
|
||||
import androidx.glance.unit.ColorProvider
|
||||
import androidx.datastore.preferences.core.Preferences
|
||||
import androidx.datastore.preferences.core.intPreferencesKey
|
||||
import com.example.casera.R
|
||||
import com.tt.honeyDue.R
|
||||
|
||||
/**
|
||||
* Small widget showing task count summary
|
||||
* Size: 2x1 or 2x2
|
||||
*/
|
||||
class CaseraSmallWidget : GlanceAppWidget() {
|
||||
class HoneyDueSmallWidget : GlanceAppWidget() {
|
||||
|
||||
override val stateDefinition: GlanceStateDefinition<*> = PreferencesGlanceStateDefinition
|
||||
|
||||
@@ -78,7 +78,7 @@ class CaseraSmallWidget : GlanceAppWidget() {
|
||||
) {
|
||||
// App name/logo
|
||||
Text(
|
||||
text = "Casera",
|
||||
text = "honeyDue",
|
||||
style = TextStyle(
|
||||
color = ColorProvider(Color(0xFF07A0C3)),
|
||||
fontSize = 16.sp,
|
||||
@@ -166,6 +166,6 @@ class OpenAppAction : ActionCallback {
|
||||
/**
|
||||
* Receiver for the small widget
|
||||
*/
|
||||
class CaseraSmallWidgetReceiver : GlanceAppWidgetReceiver() {
|
||||
override val glanceAppWidget: GlanceAppWidget = CaseraSmallWidget()
|
||||
class HoneyDueSmallWidgetReceiver : GlanceAppWidgetReceiver() {
|
||||
override val glanceAppWidget: GlanceAppWidget = HoneyDueSmallWidget()
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.widget
|
||||
package com.tt.honeyDue.widget
|
||||
|
||||
import android.content.Context
|
||||
import androidx.datastore.core.DataStore
|
||||
@@ -1,11 +1,11 @@
|
||||
package com.example.casera.widget
|
||||
package com.tt.honeyDue.widget
|
||||
|
||||
import android.content.BroadcastReceiver
|
||||
import android.content.Context
|
||||
import android.content.Intent
|
||||
import com.example.casera.data.DataManager
|
||||
import com.example.casera.models.TaskCompletionCreateRequest
|
||||
import com.example.casera.network.APILayer
|
||||
import com.tt.honeyDue.data.DataManager
|
||||
import com.tt.honeyDue.models.TaskCompletionCreateRequest
|
||||
import com.tt.honeyDue.network.APILayer
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.launch
|
||||
@@ -17,7 +17,7 @@ class WidgetTaskActionReceiver : BroadcastReceiver() {
|
||||
|
||||
override fun onReceive(context: Context, intent: Intent) {
|
||||
when (intent.action) {
|
||||
"com.example.casera.COMPLETE_TASK" -> {
|
||||
"com.tt.honeyDue.COMPLETE_TASK" -> {
|
||||
val taskId = intent.getIntExtra("task_id", -1)
|
||||
if (taskId != -1) {
|
||||
completeTask(context, taskId)
|
||||
@@ -45,7 +45,7 @@ class WidgetTaskActionReceiver : BroadcastReceiver() {
|
||||
val result = APILayer.createTaskCompletion(request)
|
||||
|
||||
// Update widgets after completion
|
||||
if (result is com.example.casera.network.ApiResult.Success) {
|
||||
if (result is com.tt.honeyDue.network.ApiResult.Success) {
|
||||
WidgetUpdateManager.updateAllWidgets(context)
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.widget
|
||||
package com.tt.honeyDue.widget
|
||||
|
||||
import android.content.Context
|
||||
import androidx.datastore.preferences.core.intPreferencesKey
|
||||
@@ -22,7 +22,7 @@ object WidgetUpdateManager {
|
||||
private val json = Json { ignoreUnknownKeys = true }
|
||||
|
||||
/**
|
||||
* Update all Casera widgets with new data
|
||||
* Update all honeyDue widgets with new data
|
||||
*/
|
||||
fun updateAllWidgets(context: Context) {
|
||||
CoroutineScope(Dispatchers.IO).launch {
|
||||
@@ -49,7 +49,7 @@ object WidgetUpdateManager {
|
||||
val glanceManager = GlanceAppWidgetManager(context)
|
||||
|
||||
// Update small widgets
|
||||
val smallWidgetIds = glanceManager.getGlanceIds(CaseraSmallWidget::class.java)
|
||||
val smallWidgetIds = glanceManager.getGlanceIds(HoneyDueSmallWidget::class.java)
|
||||
smallWidgetIds.forEach { id ->
|
||||
updateAppWidgetState(context, PreferencesGlanceStateDefinition, id) { prefs ->
|
||||
prefs.toMutablePreferences().apply {
|
||||
@@ -58,11 +58,11 @@ object WidgetUpdateManager {
|
||||
this[intPreferencesKey("in_progress_count")] = summary.inProgressCount
|
||||
}
|
||||
}
|
||||
CaseraSmallWidget().update(context, id)
|
||||
HoneyDueSmallWidget().update(context, id)
|
||||
}
|
||||
|
||||
// Update medium widgets
|
||||
val mediumWidgetIds = glanceManager.getGlanceIds(CaseraMediumWidget::class.java)
|
||||
val mediumWidgetIds = glanceManager.getGlanceIds(HoneyDueMediumWidget::class.java)
|
||||
mediumWidgetIds.forEach { id ->
|
||||
updateAppWidgetState(context, PreferencesGlanceStateDefinition, id) { prefs ->
|
||||
prefs.toMutablePreferences().apply {
|
||||
@@ -72,11 +72,11 @@ object WidgetUpdateManager {
|
||||
this[stringPreferencesKey("tasks_json")] = json.encodeToString(summary.tasks)
|
||||
}
|
||||
}
|
||||
CaseraMediumWidget().update(context, id)
|
||||
HoneyDueMediumWidget().update(context, id)
|
||||
}
|
||||
|
||||
// Update large widgets
|
||||
val largeWidgetIds = glanceManager.getGlanceIds(CaseraLargeWidget::class.java)
|
||||
val largeWidgetIds = glanceManager.getGlanceIds(HoneyDueLargeWidget::class.java)
|
||||
largeWidgetIds.forEach { id ->
|
||||
updateAppWidgetState(context, PreferencesGlanceStateDefinition, id) { prefs ->
|
||||
prefs.toMutablePreferences().apply {
|
||||
@@ -89,7 +89,7 @@ object WidgetUpdateManager {
|
||||
this[longPreferencesKey("last_updated")] = summary.lastUpdated
|
||||
}
|
||||
}
|
||||
CaseraLargeWidget().update(context, id)
|
||||
HoneyDueLargeWidget().update(context, id)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Casera"
|
||||
android:text="honeyDue"
|
||||
android:textColor="#07A0C3"
|
||||
android:textSize="20sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Casera"
|
||||
android:text="honeyDue"
|
||||
android:textColor="#07A0C3"
|
||||
android:textSize="18sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<TextView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="Casera"
|
||||
android:text="honeyDue"
|
||||
android:textColor="#07A0C3"
|
||||
android:textSize="16sp"
|
||||
android:textStyle="bold" />
|
||||
|
||||
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 5.2 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 4.8 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 39 KiB |
@@ -1,14 +1,14 @@
|
||||
<resources>
|
||||
<string name="app_name">Casera</string>
|
||||
<string name="default_notification_channel_id">casera_notifications</string>
|
||||
<string name="app_name">honeyDue</string>
|
||||
<string name="default_notification_channel_id">honeydue_notifications</string>
|
||||
|
||||
<!-- Widget Strings -->
|
||||
<string name="widget_small_name">Casera Summary</string>
|
||||
<string name="widget_small_name">honeyDue Summary</string>
|
||||
<string name="widget_small_description">Quick task count summary showing overdue, due soon, and active tasks</string>
|
||||
|
||||
<string name="widget_medium_name">Casera Tasks</string>
|
||||
<string name="widget_medium_name">honeyDue Tasks</string>
|
||||
<string name="widget_medium_description">List of upcoming tasks with quick access to task details</string>
|
||||
|
||||
<string name="widget_large_name">Casera Dashboard</string>
|
||||
<string name="widget_large_name">honeyDue Dashboard</string>
|
||||
<string name="widget_large_description">Full task dashboard with stats and interactive actions (Pro feature)</string>
|
||||
</resources>
|
||||
@@ -1,11 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- App Name -->
|
||||
<string name="app_name">Casera</string>
|
||||
<string name="app_name">honeyDue</string>
|
||||
<string name="app_tagline">Verwalten Sie Ihre Immobilien einfach</string>
|
||||
|
||||
<!-- Auth - Login -->
|
||||
<string name="auth_login_title">Casera</string>
|
||||
<string name="auth_login_title">honeyDue</string>
|
||||
<string name="auth_login_subtitle">Verwalten Sie Ihre Immobilien einfach</string>
|
||||
<string name="auth_login_username_label">Benutzername oder E-Mail</string>
|
||||
<string name="auth_login_password_label">Passwort</string>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- App Name -->
|
||||
<string name="app_name">Casera</string>
|
||||
<string name="app_name">honeyDue</string>
|
||||
<string name="app_tagline">Administra tus propiedades con facilidad</string>
|
||||
|
||||
<!-- Auth - Login -->
|
||||
<string name="auth_login_title">Casera</string>
|
||||
<string name="auth_login_title">honeyDue</string>
|
||||
<string name="auth_login_subtitle">Administra tus propiedades con facilidad</string>
|
||||
<string name="auth_login_username_label">Usuario o Correo</string>
|
||||
<string name="auth_login_password_label">Contrasena</string>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- App Name -->
|
||||
<string name="app_name">Casera</string>
|
||||
<string name="app_name">honeyDue</string>
|
||||
<string name="app_tagline">Gerez vos proprietes facilement</string>
|
||||
|
||||
<!-- Auth - Login -->
|
||||
<string name="auth_login_title">Casera</string>
|
||||
<string name="auth_login_title">honeyDue</string>
|
||||
<string name="auth_login_subtitle">Gerez vos proprietes facilement</string>
|
||||
<string name="auth_login_username_label">Nom d\'utilisateur ou Email</string>
|
||||
<string name="auth_login_password_label">Mot de passe</string>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- App Name -->
|
||||
<string name="app_name">Casera</string>
|
||||
<string name="app_name">honeyDue</string>
|
||||
<string name="app_tagline">Gestisci le tue proprietà con facilità</string>
|
||||
|
||||
<!-- Auth - Login -->
|
||||
<string name="auth_login_title">Casera</string>
|
||||
<string name="auth_login_title">honeyDue</string>
|
||||
<string name="auth_login_subtitle">Gestisci le tue proprietà con facilità</string>
|
||||
<string name="auth_login_username_label">Nome utente o Email</string>
|
||||
<string name="auth_login_password_label">Password</string>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- App Name -->
|
||||
<string name="app_name">Casera</string>
|
||||
<string name="app_name">honeyDue</string>
|
||||
<string name="app_tagline">物件管理を簡単に</string>
|
||||
|
||||
<!-- Auth - Login -->
|
||||
<string name="auth_login_title">Casera</string>
|
||||
<string name="auth_login_title">honeyDue</string>
|
||||
<string name="auth_login_subtitle">物件管理を簡単に</string>
|
||||
<string name="auth_login_username_label">ユーザー名またはメールアドレス</string>
|
||||
<string name="auth_login_password_label">パスワード</string>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- App Name -->
|
||||
<string name="app_name">Casera</string>
|
||||
<string name="app_name">honeyDue</string>
|
||||
<string name="app_tagline">부동산을 쉽게 관리하세요</string>
|
||||
|
||||
<!-- Auth - Login -->
|
||||
<string name="auth_login_title">Casera</string>
|
||||
<string name="auth_login_title">honeyDue</string>
|
||||
<string name="auth_login_subtitle">부동산을 쉽게 관리하세요</string>
|
||||
<string name="auth_login_username_label">사용자 이름 또는 이메일</string>
|
||||
<string name="auth_login_password_label">비밀번호</string>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- App Name -->
|
||||
<string name="app_name">Casera</string>
|
||||
<string name="app_name">honeyDue</string>
|
||||
<string name="app_tagline">Beheer uw eigendommen met gemak</string>
|
||||
|
||||
<!-- Auth - Login -->
|
||||
<string name="auth_login_title">Casera</string>
|
||||
<string name="auth_login_title">honeyDue</string>
|
||||
<string name="auth_login_subtitle">Beheer uw eigendommen met gemak</string>
|
||||
<string name="auth_login_username_label">Gebruikersnaam of E-mail</string>
|
||||
<string name="auth_login_password_label">Wachtwoord</string>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- App Name -->
|
||||
<string name="app_name">Casera</string>
|
||||
<string name="app_name">honeyDue</string>
|
||||
<string name="app_tagline">Gerencie suas propriedades com facilidade</string>
|
||||
|
||||
<!-- Auth - Login -->
|
||||
<string name="auth_login_title">Casera</string>
|
||||
<string name="auth_login_title">honeyDue</string>
|
||||
<string name="auth_login_subtitle">Gerencie suas propriedades com facilidade</string>
|
||||
<string name="auth_login_username_label">Usuario ou Email</string>
|
||||
<string name="auth_login_password_label">Senha</string>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- App Name -->
|
||||
<string name="app_name">Casera</string>
|
||||
<string name="app_name">honeyDue</string>
|
||||
<string name="app_tagline">轻松管理您的房产</string>
|
||||
|
||||
<!-- Auth - Login -->
|
||||
<string name="auth_login_title">Casera</string>
|
||||
<string name="auth_login_title">honeyDue</string>
|
||||
<string name="auth_login_subtitle">轻松管理您的房产</string>
|
||||
<string name="auth_login_username_label">用户名或邮箱</string>
|
||||
<string name="auth_login_password_label">密码</string>
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<!-- App Name -->
|
||||
<string name="app_name">Casera</string>
|
||||
<string name="app_name">honeyDue</string>
|
||||
<string name="app_tagline">Manage your properties with ease</string>
|
||||
|
||||
<!-- Auth - Login -->
|
||||
<string name="auth_login_title">Casera</string>
|
||||
<string name="auth_login_title">honeyDue</string>
|
||||
<string name="auth_login_subtitle">Manage your properties with ease</string>
|
||||
<string name="auth_login_username_label">Username or Email</string>
|
||||
<string name="auth_login_password_label">Password</string>
|
||||
@@ -282,7 +282,7 @@
|
||||
<string name="manage_users_invite_title">Invite Others</string>
|
||||
<string name="manage_users_easy_share">Easy Share</string>
|
||||
<string name="manage_users_send_invite">Send Invite Link</string>
|
||||
<string name="manage_users_easy_share_desc">Send a .casera file via Messages, Email, or share. They just tap to join.</string>
|
||||
<string name="manage_users_easy_share_desc">Send a .honeydue file via Messages, Email, or share. They just tap to join.</string>
|
||||
<string name="manage_users_share_code">Share Code</string>
|
||||
<string name="manage_users_no_code">No active code</string>
|
||||
<string name="manage_users_generate">Generate Code</string>
|
||||
@@ -553,7 +553,7 @@
|
||||
<string name="profile_privacy">Privacy Policy</string>
|
||||
<string name="profile_privacy_subtitle">View our privacy policy</string>
|
||||
<string name="profile_app_version">Version %1$s</string>
|
||||
<string name="profile_app_name">Casera</string>
|
||||
<string name="profile_app_name">honeyDue</string>
|
||||
<string name="profile_edit_profile">Edit Profile</string>
|
||||
|
||||
<!-- Settings -->
|
||||
@@ -690,7 +690,7 @@
|
||||
<string name="subscription_limit_tasks">You\'ve reached the task limit for your plan</string>
|
||||
|
||||
<!-- Onboarding -->
|
||||
<string name="onboarding_welcome_title">Welcome to Casera</string>
|
||||
<string name="onboarding_welcome_title">Welcome to honeyDue</string>
|
||||
<string name="onboarding_welcome_subtitle">Your home maintenance companion</string>
|
||||
<string name="onboarding_start_fresh">Start Fresh</string>
|
||||
<string name="onboarding_join_existing">Join Existing Home</string>
|
||||
@@ -763,7 +763,7 @@
|
||||
<!-- Onboarding - Subscription -->
|
||||
<string name="onboarding_subscription_title">Go Pro</string>
|
||||
<string name="onboarding_subscription_subtitle">Take your home management to the next level</string>
|
||||
<string name="onboarding_subscription_pro">CASERA PRO</string>
|
||||
<string name="onboarding_subscription_pro">HONEYDUE PRO</string>
|
||||
<string name="onboarding_subscription_social_proof">4.9 • 10K+ homeowners</string>
|
||||
<string name="onboarding_subscription_benefit_properties">Unlimited Properties</string>
|
||||
<string name="onboarding_subscription_benefit_properties_desc">Track every home you own</string>
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera
|
||||
package com.tt.honeyDue
|
||||
|
||||
import androidx.compose.animation.AnimatedVisibility
|
||||
import androidx.compose.foundation.Image
|
||||
@@ -16,22 +16,22 @@ import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.*
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import com.example.casera.ui.screens.AddResidenceScreen
|
||||
import com.example.casera.ui.screens.EditResidenceScreen
|
||||
import com.example.casera.ui.screens.EditTaskScreen
|
||||
import com.example.casera.ui.screens.ForgotPasswordScreen
|
||||
import com.example.casera.ui.screens.HomeScreen
|
||||
import com.example.casera.ui.screens.LoginScreen
|
||||
import com.example.casera.ui.screens.RegisterScreen
|
||||
import com.example.casera.ui.screens.ResetPasswordScreen
|
||||
import com.example.casera.ui.screens.ResidenceDetailScreen
|
||||
import com.example.casera.ui.screens.ResidencesScreen
|
||||
import com.example.casera.ui.screens.TasksScreen
|
||||
import com.example.casera.ui.screens.VerifyEmailScreen
|
||||
import com.example.casera.ui.screens.VerifyResetCodeScreen
|
||||
import com.example.casera.ui.screens.onboarding.OnboardingScreen
|
||||
import com.example.casera.viewmodel.OnboardingViewModel
|
||||
import com.example.casera.viewmodel.PasswordResetViewModel
|
||||
import com.tt.honeyDue.ui.screens.AddResidenceScreen
|
||||
import com.tt.honeyDue.ui.screens.EditResidenceScreen
|
||||
import com.tt.honeyDue.ui.screens.EditTaskScreen
|
||||
import com.tt.honeyDue.ui.screens.ForgotPasswordScreen
|
||||
import com.tt.honeyDue.ui.screens.HomeScreen
|
||||
import com.tt.honeyDue.ui.screens.LoginScreen
|
||||
import com.tt.honeyDue.ui.screens.RegisterScreen
|
||||
import com.tt.honeyDue.ui.screens.ResetPasswordScreen
|
||||
import com.tt.honeyDue.ui.screens.ResidenceDetailScreen
|
||||
import com.tt.honeyDue.ui.screens.ResidencesScreen
|
||||
import com.tt.honeyDue.ui.screens.TasksScreen
|
||||
import com.tt.honeyDue.ui.screens.VerifyEmailScreen
|
||||
import com.tt.honeyDue.ui.screens.VerifyResetCodeScreen
|
||||
import com.tt.honeyDue.ui.screens.onboarding.OnboardingScreen
|
||||
import com.tt.honeyDue.viewmodel.OnboardingViewModel
|
||||
import com.tt.honeyDue.viewmodel.PasswordResetViewModel
|
||||
import androidx.lifecycle.viewmodel.compose.viewModel
|
||||
import org.jetbrains.compose.resources.painterResource
|
||||
import org.jetbrains.compose.ui.tooling.preview.Preview
|
||||
@@ -40,29 +40,29 @@ import androidx.navigation.compose.NavHost
|
||||
import androidx.navigation.compose.rememberNavController
|
||||
import androidx.navigation.compose.composable
|
||||
import androidx.navigation.toRoute
|
||||
import com.example.casera.ui.screens.MainScreen
|
||||
import com.example.casera.ui.screens.ManageUsersScreen
|
||||
import com.example.casera.ui.screens.NotificationPreferencesScreen
|
||||
import com.example.casera.ui.screens.ProfileScreen
|
||||
import com.example.casera.ui.theme.MyCribTheme
|
||||
import com.example.casera.ui.theme.ThemeManager
|
||||
import com.example.casera.navigation.*
|
||||
import com.example.casera.repository.LookupsRepository
|
||||
import com.example.casera.models.Residence
|
||||
import com.example.casera.models.TaskCategory
|
||||
import com.example.casera.models.TaskDetail
|
||||
import com.example.casera.models.TaskFrequency
|
||||
import com.example.casera.models.TaskPriority
|
||||
import com.example.casera.network.ApiResult
|
||||
import com.example.casera.network.AuthApi
|
||||
import com.example.casera.data.DataManager
|
||||
import com.example.casera.network.APILayer
|
||||
import com.example.casera.platform.ContractorImportHandler
|
||||
import com.example.casera.platform.PlatformUpgradeScreen
|
||||
import com.example.casera.platform.ResidenceImportHandler
|
||||
import com.tt.honeyDue.ui.screens.MainScreen
|
||||
import com.tt.honeyDue.ui.screens.ManageUsersScreen
|
||||
import com.tt.honeyDue.ui.screens.NotificationPreferencesScreen
|
||||
import com.tt.honeyDue.ui.screens.ProfileScreen
|
||||
import com.tt.honeyDue.ui.theme.HoneyDueTheme
|
||||
import com.tt.honeyDue.ui.theme.ThemeManager
|
||||
import com.tt.honeyDue.navigation.*
|
||||
import com.tt.honeyDue.repository.LookupsRepository
|
||||
import com.tt.honeyDue.models.Residence
|
||||
import com.tt.honeyDue.models.TaskCategory
|
||||
import com.tt.honeyDue.models.TaskDetail
|
||||
import com.tt.honeyDue.models.TaskFrequency
|
||||
import com.tt.honeyDue.models.TaskPriority
|
||||
import com.tt.honeyDue.network.ApiResult
|
||||
import com.tt.honeyDue.network.AuthApi
|
||||
import com.tt.honeyDue.data.DataManager
|
||||
import com.tt.honeyDue.network.APILayer
|
||||
import com.tt.honeyDue.platform.ContractorImportHandler
|
||||
import com.tt.honeyDue.platform.PlatformUpgradeScreen
|
||||
import com.tt.honeyDue.platform.ResidenceImportHandler
|
||||
|
||||
import casera.composeapp.generated.resources.Res
|
||||
import casera.composeapp.generated.resources.compose_multiplatform
|
||||
import honeydue.composeapp.generated.resources.Res
|
||||
import honeydue.composeapp.generated.resources.compose_multiplatform
|
||||
|
||||
@Composable
|
||||
@Preview
|
||||
@@ -119,7 +119,7 @@ fun App(
|
||||
|
||||
val currentTheme by remember { derivedStateOf { ThemeManager.currentTheme } }
|
||||
|
||||
MyCribTheme(themeColors = currentTheme) {
|
||||
HoneyDueTheme(themeColors = currentTheme) {
|
||||
// Handle contractor file imports (Android-specific, no-op on other platforms)
|
||||
ContractorImportHandler(
|
||||
pendingContractorImportUri = pendingContractorImportUri,
|
||||
@@ -145,7 +145,7 @@ fun App(
|
||||
CircularProgressIndicator()
|
||||
}
|
||||
}
|
||||
return@MyCribTheme
|
||||
return@HoneyDueTheme
|
||||
}
|
||||
|
||||
val startDestination = when {
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera
|
||||
package com.tt.honeyDue
|
||||
|
||||
class Greeting {
|
||||
private val platform = getPlatform()
|
||||
@@ -1,4 +1,4 @@
|
||||
//package com.casera.android
|
||||
//package com.honeydue.android
|
||||
//
|
||||
//import android.os.Bundle
|
||||
//import androidx.activity.ComponentActivity
|
||||
@@ -10,15 +10,15 @@
|
||||
//import androidx.navigation.compose.NavHost
|
||||
//import androidx.navigation.compose.composable
|
||||
//import androidx.navigation.compose.rememberNavController
|
||||
//import com.example.casera.ui.screens.*
|
||||
//import com.example.casera.ui.theme.MyCribTheme
|
||||
//import com.tt.honeyDue.ui.screens.*
|
||||
//import com.tt.honeyDue.ui.theme.HoneyDueTheme
|
||||
//
|
||||
//class MainActivity : ComponentActivity() {
|
||||
// override fun onCreate(savedInstanceState: Bundle?) {
|
||||
// super.onCreate(savedInstanceState)
|
||||
// setContent {
|
||||
// MyCribTheme {
|
||||
// MyCribApp()
|
||||
// HoneyDueTheme {
|
||||
// HoneyDueApp()
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera
|
||||
package com.tt.honeyDue
|
||||
|
||||
interface Platform {
|
||||
val name: String
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.analytics
|
||||
package com.tt.honeyDue.analytics
|
||||
|
||||
/**
|
||||
* Common analytics interface for cross-platform event tracking.
|
||||
@@ -1,10 +1,10 @@
|
||||
package com.example.casera.cache
|
||||
package com.tt.honeyDue.cache
|
||||
|
||||
import com.example.casera.data.DataManager
|
||||
import com.example.casera.models.FeatureBenefit
|
||||
import com.example.casera.models.Promotion
|
||||
import com.example.casera.models.SubscriptionStatus
|
||||
import com.example.casera.models.UpgradeTriggerData
|
||||
import com.tt.honeyDue.data.DataManager
|
||||
import com.tt.honeyDue.models.FeatureBenefit
|
||||
import com.tt.honeyDue.models.Promotion
|
||||
import com.tt.honeyDue.models.SubscriptionStatus
|
||||
import com.tt.honeyDue.models.UpgradeTriggerData
|
||||
|
||||
/**
|
||||
* Thin facade over DataManager for subscription data.
|
||||
@@ -1,8 +1,8 @@
|
||||
package com.example.casera.data
|
||||
package com.tt.honeyDue.data
|
||||
|
||||
import com.example.casera.models.*
|
||||
import com.example.casera.storage.TokenManager
|
||||
import com.example.casera.storage.ThemeStorageManager
|
||||
import com.tt.honeyDue.models.*
|
||||
import com.tt.honeyDue.storage.TokenManager
|
||||
import com.tt.honeyDue.storage.ThemeStorageManager
|
||||
import kotlinx.coroutines.flow.MutableStateFlow
|
||||
import kotlinx.coroutines.flow.StateFlow
|
||||
import kotlinx.coroutines.flow.asStateFlow
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.data
|
||||
package com.tt.honeyDue.data
|
||||
|
||||
/**
|
||||
* Platform-specific persistence manager for storing app data to disk.
|
||||
@@ -1,15 +1,15 @@
|
||||
package com.example.casera.models
|
||||
package com.tt.honeyDue.models
|
||||
|
||||
import kotlinx.serialization.encodeToString
|
||||
import kotlinx.serialization.json.Json
|
||||
|
||||
/**
|
||||
* Shared encoder/decoder for `.casera` payloads across Android and iOS.
|
||||
* Shared encoder/decoder for `.honeydue` payloads across Android and iOS.
|
||||
*
|
||||
* This keeps package JSON shape in one place while each platform owns
|
||||
* native share-sheet presentation details.
|
||||
*/
|
||||
object CaseraShareCodec {
|
||||
object honeyDueShareCodec {
|
||||
private val json = Json {
|
||||
prettyPrint = true
|
||||
ignoreUnknownKeys = true
|
||||
@@ -58,13 +58,13 @@ object CaseraShareCodec {
|
||||
}
|
||||
|
||||
/**
|
||||
* Build a filesystem-safe package filename with `.casera` extension.
|
||||
* Build a filesystem-safe package filename with `.honeydue` extension.
|
||||
*/
|
||||
fun safeShareFileName(displayName: String): String {
|
||||
val safeName = displayName
|
||||
.replace(" ", "_")
|
||||
.replace("/", "-")
|
||||
.take(50)
|
||||
return "$safeName.casera"
|
||||
return "$safeName.honeydue"
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.models
|
||||
package com.tt.honeyDue.models
|
||||
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.example.casera.models
|
||||
package com.tt.honeyDue.models
|
||||
|
||||
import com.example.casera.data.DataManager
|
||||
import com.tt.honeyDue.data.DataManager
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.models
|
||||
package com.tt.honeyDue.models
|
||||
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.models
|
||||
package com.tt.honeyDue.models
|
||||
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.models
|
||||
package com.tt.honeyDue.models
|
||||
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.models
|
||||
package com.tt.honeyDue.models
|
||||
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.models
|
||||
package com.tt.honeyDue.models
|
||||
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.models
|
||||
package com.tt.honeyDue.models
|
||||
|
||||
import kotlin.time.Clock
|
||||
import kotlin.time.ExperimentalTime
|
||||
@@ -9,15 +9,15 @@ import kotlinx.serialization.json.JsonObject
|
||||
import kotlinx.serialization.json.jsonPrimitive
|
||||
|
||||
/**
|
||||
* Package type identifiers for .casera files
|
||||
* Package type identifiers for .honeydue files
|
||||
*/
|
||||
object CaseraPackageType {
|
||||
object honeyDuePackageType {
|
||||
const val CONTRACTOR = "contractor"
|
||||
const val RESIDENCE = "residence"
|
||||
}
|
||||
|
||||
/**
|
||||
* Data model for .casera file format used to share contractors between users.
|
||||
* Data model for .honeydue file format used to share contractors between users.
|
||||
* Contains only the data needed to recreate a contractor, without server-specific IDs.
|
||||
*/
|
||||
@Serializable
|
||||
@@ -26,7 +26,7 @@ data class SharedContractor(
|
||||
val version: Int = 1,
|
||||
|
||||
/** Package type discriminator */
|
||||
val type: String = CaseraPackageType.CONTRACTOR,
|
||||
val type: String = honeyDuePackageType.CONTRACTOR,
|
||||
|
||||
val name: String,
|
||||
val company: String? = null,
|
||||
@@ -61,7 +61,7 @@ data class SharedContractor(
|
||||
)
|
||||
|
||||
/**
|
||||
* Data model for .casera file format used to share residences between users.
|
||||
* Data model for .honeydue file format used to share residences between users.
|
||||
* Contains the share code needed to join the residence.
|
||||
*/
|
||||
@Serializable
|
||||
@@ -70,7 +70,7 @@ data class SharedResidence(
|
||||
val version: Int = 1,
|
||||
|
||||
/** Package type discriminator */
|
||||
val type: String = CaseraPackageType.RESIDENCE,
|
||||
val type: String = honeyDuePackageType.RESIDENCE,
|
||||
|
||||
/** The share code for joining the residence */
|
||||
@SerialName("share_code")
|
||||
@@ -98,14 +98,14 @@ data class SharedResidence(
|
||||
)
|
||||
|
||||
/**
|
||||
* Detect the type of a .casera package from its JSON content.
|
||||
* Detect the type of a .honeydue package from its JSON content.
|
||||
* Returns null if the type cannot be determined.
|
||||
*/
|
||||
fun detectCaseraPackageType(jsonContent: String): String? {
|
||||
fun detecthoneyDuePackageType(jsonContent: String): String? {
|
||||
return try {
|
||||
val json = Json { ignoreUnknownKeys = true }
|
||||
val jsonObject = json.decodeFromString<JsonObject>(jsonContent)
|
||||
jsonObject["type"]?.jsonPrimitive?.content ?: CaseraPackageType.CONTRACTOR // Default for backward compatibility
|
||||
jsonObject["type"]?.jsonPrimitive?.content ?: honeyDuePackageType.CONTRACTOR // Default for backward compatibility
|
||||
} catch (e: Exception) {
|
||||
null
|
||||
}
|
||||
@@ -118,7 +118,7 @@ fun detectCaseraPackageType(jsonContent: String): String? {
|
||||
fun Contractor.toSharedContractor(exportedBy: String? = null): SharedContractor {
|
||||
return SharedContractor(
|
||||
version = 1,
|
||||
type = CaseraPackageType.CONTRACTOR,
|
||||
type = honeyDuePackageType.CONTRACTOR,
|
||||
name = name,
|
||||
company = company,
|
||||
phone = phone,
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.models
|
||||
package com.tt.honeyDue.models
|
||||
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.models
|
||||
package com.tt.honeyDue.models
|
||||
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.models
|
||||
package com.tt.honeyDue.models
|
||||
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.models
|
||||
package com.tt.honeyDue.models
|
||||
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.navigation
|
||||
package com.tt.honeyDue.navigation
|
||||
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
@@ -1,8 +1,8 @@
|
||||
package com.example.casera.network
|
||||
package com.tt.honeyDue.network
|
||||
|
||||
import com.example.casera.data.DataManager
|
||||
import com.example.casera.models.*
|
||||
import com.example.casera.network.*
|
||||
import com.tt.honeyDue.data.DataManager
|
||||
import com.tt.honeyDue.models.*
|
||||
import com.tt.honeyDue.network.*
|
||||
import kotlinx.coroutines.sync.Mutex
|
||||
|
||||
/**
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.network
|
||||
package com.tt.honeyDue.network
|
||||
|
||||
import io.ktor.client.*
|
||||
import io.ktor.client.plugins.contentnegotiation.*
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.network
|
||||
package com.tt.honeyDue.network
|
||||
|
||||
/**
|
||||
* API Environment Configuration
|
||||
@@ -22,7 +22,7 @@ object ApiConfig {
|
||||
fun getBaseUrl(): String {
|
||||
return when (CURRENT_ENV) {
|
||||
Environment.LOCAL -> "http://${getLocalhostAddress()}:8000/api"
|
||||
Environment.DEV -> "https://casera.treytartt.com/api"
|
||||
Environment.DEV -> "https://honeyDue.treytartt.com/api"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ object ApiConfig {
|
||||
fun getMediaBaseUrl(): String {
|
||||
return when (CURRENT_ENV) {
|
||||
Environment.LOCAL -> "http://${getLocalhostAddress()}:8000"
|
||||
Environment.DEV -> "https://casera.treytartt.com"
|
||||
Environment.DEV -> "https://honeyDue.treytartt.com"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -42,7 +42,7 @@ object ApiConfig {
|
||||
fun getEnvironmentName(): String {
|
||||
return when (CURRENT_ENV) {
|
||||
Environment.LOCAL -> "Local (${getLocalhostAddress()}:8000)"
|
||||
Environment.DEV -> "Dev Server (casera.treytartt.com)"
|
||||
Environment.DEV -> "Dev Server (honeyDue.treytartt.com)"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package com.example.casera.network
|
||||
package com.tt.honeyDue.network
|
||||
|
||||
sealed class ApiResult<out T> {
|
||||
data class Success<T>(val data: T) : ApiResult<T>()
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.example.casera.network
|
||||
package com.tt.honeyDue.network
|
||||
|
||||
import com.example.casera.models.*
|
||||
import com.tt.honeyDue.models.*
|
||||
import io.ktor.client.*
|
||||
import io.ktor.client.call.*
|
||||
import io.ktor.client.request.*
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.example.casera.network
|
||||
package com.tt.honeyDue.network
|
||||
|
||||
import com.example.casera.models.*
|
||||
import com.tt.honeyDue.models.*
|
||||
import io.ktor.client.*
|
||||
import io.ktor.client.call.*
|
||||
import io.ktor.client.request.*
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.example.casera.network
|
||||
package com.tt.honeyDue.network
|
||||
|
||||
import com.example.casera.models.*
|
||||
import com.tt.honeyDue.models.*
|
||||
import io.ktor.client.*
|
||||
import io.ktor.client.call.*
|
||||
import io.ktor.client.request.*
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.example.casera.network
|
||||
package com.tt.honeyDue.network
|
||||
|
||||
import com.example.casera.models.ErrorResponse
|
||||
import com.tt.honeyDue.models.ErrorResponse
|
||||
import io.ktor.client.call.body
|
||||
import io.ktor.client.statement.HttpResponse
|
||||
import kotlinx.serialization.json.Json
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.example.casera.network
|
||||
package com.tt.honeyDue.network
|
||||
|
||||
import com.example.casera.models.*
|
||||
import com.tt.honeyDue.models.*
|
||||
import io.ktor.client.*
|
||||
import io.ktor.client.call.*
|
||||
import io.ktor.client.request.*
|
||||
@@ -1,6 +1,6 @@
|
||||
package com.example.casera.network
|
||||
package com.tt.honeyDue.network
|
||||
|
||||
import com.example.casera.models.*
|
||||
import com.tt.honeyDue.models.*
|
||||
import io.ktor.client.*
|
||||
import io.ktor.client.call.*
|
||||
import io.ktor.client.request.*
|
||||