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>
This commit is contained in:
Trey t
2026-03-07 06:33:57 -06:00
parent 9c574c4343
commit 1e2adf7660
450 changed files with 1730 additions and 1788 deletions
@@ -0,0 +1,171 @@
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.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
/**
* BroadcastReceiver for handling notification action button clicks.
* Performs task actions (complete, cancel, etc.) directly from notifications.
*/
class NotificationActionReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val action = intent.action ?: return
val taskId = intent.getIntExtra(EXTRA_TASK_ID, -1)
val notificationId = intent.getIntExtra(EXTRA_NOTIFICATION_ID, 0)
Log.d(TAG, "Action received: $action for task $taskId")
if (taskId == -1) {
Log.e(TAG, "No task ID provided")
return
}
// Dismiss the notification
NotificationManagerCompat.from(context).cancel(notificationId)
// Check subscription status
val isPremium = isPremiumUser()
if (!isPremium) {
Log.d(TAG, "Non-premium user, ignoring action")
launchMainActivity(context, null)
return
}
// Handle action
when (action) {
ACTION_VIEW_TASK -> {
launchMainActivity(context, taskId)
}
ACTION_COMPLETE_TASK -> {
performCompleteTask(context, taskId)
}
ACTION_MARK_IN_PROGRESS -> {
performMarkInProgress(context, taskId)
}
ACTION_CANCEL_TASK -> {
performCancelTask(context, taskId)
}
ACTION_UNCANCEL_TASK -> {
performUncancelTask(context, taskId)
}
else -> {
Log.w(TAG, "Unknown action: $action")
}
}
}
private fun isPremiumUser(): Boolean {
val subscription = DataManager.subscription.value
// User is premium if limitations are disabled
return subscription?.limitationsEnabled == false
}
private fun launchMainActivity(context: Context, taskId: Int?) {
val intent = Intent(context, MainActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP
if (taskId != null) {
putExtra(EXTRA_NAVIGATE_TO_TASK, taskId)
}
}
context.startActivity(intent)
}
private fun performCompleteTask(context: Context, taskId: Int) {
Log.d(TAG, "Completing task $taskId")
CoroutineScope(Dispatchers.IO).launch {
val request = TaskCompletionCreateRequest(
taskId = taskId,
completedAt = null,
notes = null,
actualCost = null,
rating = null,
imageUrls = null
)
when (val result = APILayer.createTaskCompletion(request)) {
is ApiResult.Success -> {
Log.d(TAG, "Task $taskId completed successfully")
// Launch app to show result
launchMainActivity(context, taskId)
}
is ApiResult.Error -> {
Log.e(TAG, "Failed to complete task: ${result.message}")
}
else -> {}
}
}
}
private fun performMarkInProgress(context: Context, taskId: Int) {
Log.d(TAG, "Marking task $taskId as in progress")
CoroutineScope(Dispatchers.IO).launch {
when (val result = APILayer.markInProgress(taskId)) {
is ApiResult.Success -> {
Log.d(TAG, "Task $taskId marked as in progress")
}
is ApiResult.Error -> {
Log.e(TAG, "Failed to mark task in progress: ${result.message}")
}
else -> {}
}
}
}
private fun performCancelTask(context: Context, taskId: Int) {
Log.d(TAG, "Cancelling task $taskId")
CoroutineScope(Dispatchers.IO).launch {
when (val result = APILayer.cancelTask(taskId)) {
is ApiResult.Success -> {
Log.d(TAG, "Task $taskId cancelled")
}
is ApiResult.Error -> {
Log.e(TAG, "Failed to cancel task: ${result.message}")
}
else -> {}
}
}
}
private fun performUncancelTask(context: Context, taskId: Int) {
Log.d(TAG, "Uncancelling task $taskId")
CoroutineScope(Dispatchers.IO).launch {
when (val result = APILayer.uncancelTask(taskId)) {
is ApiResult.Success -> {
Log.d(TAG, "Task $taskId uncancelled")
}
is ApiResult.Error -> {
Log.e(TAG, "Failed to uncancel task: ${result.message}")
}
else -> {}
}
}
}
companion object {
private const val TAG = "NotificationAction"
// Action constants
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"
const val EXTRA_NOTIFICATION_ID = "notification_id"
const val EXTRA_NAVIGATE_TO_TASK = "navigate_to_task"
}
}