diff --git a/app/src/main/java/net/helcel/cowspent/android/bill_edit/EditBillActivity.kt b/app/src/main/java/net/helcel/cowspent/android/bill_edit/EditBillActivity.kt index 20f0727..843b225 100644 --- a/app/src/main/java/net/helcel/cowspent/android/bill_edit/EditBillActivity.kt +++ b/app/src/main/java/net/helcel/cowspent/android/bill_edit/EditBillActivity.kt @@ -12,6 +12,7 @@ import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.compose.runtime.remember import androidx.lifecycle.lifecycleScope +import androidx.preference.PreferenceManager import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext @@ -151,12 +152,25 @@ class EditBillActivity : AppCompatActivity() { val billIdToDuplicate = intent.getLongExtra(PARAM_BILL_ID_TO_DUPLICATE, 0) val timeNowSeconds = System.currentTimeMillis() / 1000 if (billIdToDuplicate == 0L) { - val project = db.getProject(projectId) - bill = DBBill( - 0, 0, projectId, project?.lastPayerId ?: 0, 0.0, timeNowSeconds, - "", DBBill.STATE_ADDED, DBBill.NON_REPEATED, - DBBill.PAYMODE_NONE, DBBill.CATEGORY_NONE, "", DBBill.PAYMODE_ID_NONE - ) + val preferences = PreferenceManager.getDefaultSharedPreferences(applicationContext) + val fillFromLast = preferences.getBoolean(getString(R.string.pref_key_fill_new_bill_from_last), false) + val lastBill = if (fillFromLast) db.getLastBillOfProject(projectId) else null + + if (lastBill != null) { + bill = DBBill( + 0, 0, projectId, lastBill.payerId, 0.0, timeNowSeconds, + "", DBBill.STATE_ADDED, lastBill.repeat ?: DBBill.NON_REPEATED, + lastBill.paymentMode, lastBill.categoryId, "", lastBill.paymentModeId + ) + bill.billOwers = lastBill.billOwers.map { DBBillOwer(0, 0, it.memberId) } + } else { + val project = db.getProject(projectId) + bill = DBBill( + 0, 0, projectId, project?.lastPayerId ?: 0, 0.0, timeNowSeconds, + "", DBBill.STATE_ADDED, DBBill.NON_REPEATED, + DBBill.PAYMODE_NONE, DBBill.CATEGORY_NONE, "", DBBill.PAYMODE_ID_NONE + ) + } } else { val btd = db.getBill(billIdToDuplicate)!! bill = DBBill( diff --git a/app/src/main/java/net/helcel/cowspent/android/settings/SettingsScreen.kt b/app/src/main/java/net/helcel/cowspent/android/settings/SettingsScreen.kt index 3232c4b..a8f2a57 100644 --- a/app/src/main/java/net/helcel/cowspent/android/settings/SettingsScreen.kt +++ b/app/src/main/java/net/helcel/cowspent/android/settings/SettingsScreen.kt @@ -81,6 +81,7 @@ fun SettingsScreen( val keyOfflineMode = stringResource(R.string.pref_key_offline_mode) val keyShowArchived = stringResource(R.string.pref_key_show_archived) val keyBetaFeatures = stringResource(R.string.pref_key_beta_features) + val keyFillNewBillFromLast = stringResource(R.string.pref_key_fill_new_bill_from_last) val isNextcloudConfigured = CowspentServerSyncHelper.isNextcloudAccountConfigured(context) @@ -123,6 +124,9 @@ fun SettingsScreen( var betaFeatures by remember(keyBetaFeatures) { mutableStateOf(sharedPreferences.getBoolean(keyBetaFeatures, false)) } + var fillNewBillFromLast by remember(keyFillNewBillFromLast) { + mutableStateOf(sharedPreferences.getBoolean(keyFillNewBillFromLast, false)) + } Scaffold( topBar = { @@ -269,6 +273,21 @@ fun SettingsScreen( } ) + if (betaFeatures) { + SettingsSwitchPreference( + title = stringResource(R.string.settings_fill_new_bill_from_last), + summary = stringResource(R.string.settings_fill_new_bill_from_last_summary), + icon = Icons.Default.Info, + checked = fillNewBillFromLast, + onCheckedChange = { + fillNewBillFromLast = it + sharedPreferences.edit { + putBoolean(keyFillNewBillFromLast, it) + } + } + ) + } + SettingsPreference( title = stringResource(R.string.title_about), icon = Icons.Default.Info, diff --git a/app/src/main/java/net/helcel/cowspent/persistence/CowspentSQLiteOpenHelper.kt b/app/src/main/java/net/helcel/cowspent/persistence/CowspentSQLiteOpenHelper.kt index dd8d076..d83689c 100644 --- a/app/src/main/java/net/helcel/cowspent/persistence/CowspentSQLiteOpenHelper.kt +++ b/app/src/main/java/net/helcel/cowspent/persistence/CowspentSQLiteOpenHelper.kt @@ -557,6 +557,15 @@ class CowspentSQLiteOpenHelper private constructor(val context: Context) : return if (bills.isEmpty()) null else bills[0] } + fun getLastBillOfProject(projectId: Long): DBBill? { + val list = getBillsCustom( + "$key_projectid = ? AND $key_state != ?", + arrayOf(projectId.toString(), DBBill.STATE_DELETED.toString()), + "$key_id DESC LIMIT 1" + ) + return if (list.isEmpty()) null else list[0] + } + @WorkerThread fun searchBills(query: CharSequence?, projectId: Long): List { val andWhere: MutableList = ArrayList() diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index c11e725..95bafae 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -137,6 +137,8 @@ Show archived projects Beta Features Enable experimental features. Use at your own risk. + Auto-fill from last bill + Pre-fill payer, category, mode and owers from the last bill created in the project. WARNING: "http" is unsafe. Use "https". Choose Color @@ -158,6 +160,7 @@ offlineMode showArchived betaFeatures + fillNewBillFromLast 1 2 -1