Cleanup & Pruning legacy code

This commit is contained in:
2026-09-06 17:13:23 +02:00
parent aee1bd582b
commit 8d28ee2d6c
40 changed files with 71 additions and 303 deletions
@@ -46,7 +46,10 @@ fun LabelBillsScreen(
title = { Text(stringResource(R.string.title_label_bills)) }, title = { Text(stringResource(R.string.title_label_bills)) },
navigationIcon = { navigationIcon = {
IconButton(onClick = onBack) { IconButton(onClick = onBack) {
Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = null) Icon(
Icons.AutoMirrored.Filled.ArrowBack,
contentDescription = stringResource(R.string.simple_back)
)
} }
}, },
backgroundColor = MaterialTheme.colors.primary, backgroundColor = MaterialTheme.colors.primary,
@@ -61,11 +61,7 @@ fun ColorPicker(
var chroma by remember { mutableFloatStateOf(initialLch[1]) } var chroma by remember { mutableFloatStateOf(initialLch[1]) }
var hue by remember { mutableFloatStateOf(initialLch[2]) } var hue by remember { mutableFloatStateOf(initialLch[2]) }
val currentColorInt = remember(lightness, chroma, hue) { val currentColorInt = remember(lightness, chroma, hue) { mLCHtoRBG(lightness, chroma, hue) }
val color = mLCHtoRBG(lightness,chroma,hue)
onColorChanged(color)
color
}
val currentColor = Color(currentColorInt) val currentColor = Color(currentColorInt)
@@ -74,8 +70,9 @@ fun ColorPicker(
var isHexValid by remember { mutableStateOf(true) } var isHexValid by remember { mutableStateOf(true) }
val interactionSource = remember { MutableInteractionSource() } val interactionSource = remember { MutableInteractionSource() }
// Sync HEX with LCH // Report the colour, and keep the HEX field in step with the LCH sliders.
LaunchedEffect(currentColorInt) { LaunchedEffect(currentColorInt) {
onColorChanged(currentColorInt)
val newHex = "%06X".format(0xFFFFFF and currentColorInt) val newHex = "%06X".format(0xFFFFFF and currentColorInt)
if (hexText.uppercase() != newHex) { if (hexText.uppercase() != newHex) {
hexText = newHex hexText = newHex
@@ -3,6 +3,7 @@ package net.helcel.cowspent.android.label
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.ui.window.Dialog
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
@@ -275,6 +276,14 @@ fun LabelItem(
} }
} }
/**
* Split into a window and its content, the same way MemberEditDialogContent is.
*
* A Compose text field inside a Material AlertDialog never reaches idle under Robolectric: the
* composition spins in measure/layout until Espresso gives up 60s later, having exhausted the
* test heap and taken every later test class in that worker with it. A plain Dialog holding a
* Surface behaves, so the dialog body lives there instead - which is also what makes it testable.
*/
@Composable @Composable
fun EditLabelDialog( fun EditLabelDialog(
title: String, title: String,
@@ -283,15 +292,33 @@ fun EditLabelDialog(
initialColor: String, initialColor: String,
onDismiss: () -> Unit, onDismiss: () -> Unit,
onSave: (String, String, String) -> Unit onSave: (String, String, String) -> Unit
) {
Dialog(onDismissRequest = onDismiss) {
EditLabelDialogContent(title, initialName, initialIcon, initialColor, onDismiss, onSave)
}
}
@Composable
fun EditLabelDialogContent(
title: String,
initialName: String,
initialIcon: String,
initialColor: String,
onDismiss: () -> Unit,
onSave: (String, String, String) -> Unit
) { ) {
var name by remember { mutableStateOf(initialName) } var name by remember { mutableStateOf(initialName) }
var icon by remember { mutableStateOf(initialIcon) } var icon by remember { mutableStateOf(initialIcon) }
var color by remember { mutableStateOf(initialColor) } var color by remember { mutableStateOf(initialColor) }
AlertDialog( Surface(
onDismissRequest = onDismiss, shape = MaterialTheme.shapes.medium,
title = { Text(title) }, color = MaterialTheme.colors.surface,
text = { contentColor = contentColorFor(MaterialTheme.colors.surface)
) {
Column(modifier = Modifier.padding(24.dp)) {
Text(title, style = MaterialTheme.typography.h6)
Spacer(modifier = Modifier.height(16.dp))
Column(modifier = Modifier.verticalScroll(rememberScrollState())) { Column(modifier = Modifier.verticalScroll(rememberScrollState())) {
OutlinedTextField( OutlinedTextField(
value = name, value = name,
@@ -315,21 +342,25 @@ fun EditLabelDialog(
onColorChanged = { color = String.format("#%06X", 0xFFFFFF and it) } onColorChanged = { color = String.format("#%06X", 0xFFFFFF and it) }
) )
} }
}, Spacer(modifier = Modifier.height(16.dp))
confirmButton = { Row(
Button( modifier = Modifier.fillMaxWidth(),
onClick = { onSave(name, icon, color) }, horizontalArrangement = Arrangement.End,
enabled = name.isNotBlank() verticalAlignment = Alignment.CenterVertically
) { ) {
Text(stringResource(R.string.action_save)) TextButton(onClick = onDismiss) {
} Text(stringResource(R.string.simple_cancel))
}, }
dismissButton = { Spacer(modifier = Modifier.width(8.dp))
TextButton(onClick = onDismiss) { Button(
Text(stringResource(R.string.simple_cancel)) onClick = { onSave(name, icon, color) },
enabled = name.isNotBlank()
) {
Text(stringResource(R.string.action_save))
}
} }
} }
) }
} }
fun parseColor(colorString: String): Color { fun parseColor(colorString: String): Color {
@@ -17,8 +17,6 @@ object MainConstants {
const val BROADCAST_AVATAR_UPDATED = "net.helcel.cowspent.broadcast.avatar_updated" const val BROADCAST_AVATAR_UPDATED = "net.helcel.cowspent.broadcast.avatar_updated"
const val BROADCAST_AVATAR_UPDATED_MEMBER = "net.helcel.cowspent.broadcast.avatar_updated_for_member" const val BROADCAST_AVATAR_UPDATED_MEMBER = "net.helcel.cowspent.broadcast.avatar_updated_for_member"
const val MAIN_CHANNEL_ID = 1234567890
const val PARAM_DIALOG_CONTENT = "net.helcel.cowspent.PARAM_DIALOG_CONTENT" const val PARAM_DIALOG_CONTENT = "net.helcel.cowspent.PARAM_DIALOG_CONTENT"
const val PARAM_PROJECT_TO_SELECT = "net.helcel.cowspent.PARAM_PROJECT_TO_SELECT" const val PARAM_PROJECT_TO_SELECT = "net.helcel.cowspent.PARAM_PROJECT_TO_SELECT"
@@ -10,10 +10,8 @@ import androidx.activity.compose.setContent
import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import androidx.preference.PreferenceManager import androidx.preference.PreferenceManager
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import net.helcel.cowspent.R import net.helcel.cowspent.R
@@ -57,9 +55,6 @@ class NewProjectActivity : AppCompatActivity() {
.setAction(Intent.ACTION_GET_CONTENT) .setAction(Intent.ACTION_GET_CONTENT)
importFileLauncher.launch(Intent.createChooser(intent, "Select a file")) importFileLauncher.launch(Intent.createChooser(intent, "Select a file"))
}, },
onChooseFromNextcloud = {
chooseFromNextcloud()
},
onOkPressed = { onPressOk() }, onOkPressed = { onPressOk() },
onBack = { finish() }, onBack = { finish() },
onFieldsChanged = { updateAuthStatus() } onFieldsChanged = { updateAuthStatus() }
@@ -130,19 +125,6 @@ class NewProjectActivity : AppCompatActivity() {
} }
} }
private fun chooseFromNextcloud() {
lifecycleScope.launch {
val accountProjects = withContext(Dispatchers.IO) { db.accountProjects }
if (accountProjects.isEmpty()) {
showToast(getString(R.string.choose_account_project_dialog_impossible), Toast.LENGTH_LONG)
return@launch
}
viewModel.nextcloudProjects = accountProjects
viewModel.showNextcloudProjectDialog = true
}
}
private fun updateAuthStatus() { private fun updateAuthStatus() {
val url = getFormattedUrl() val url = getFormattedUrl()
val fakeProj = DBProject( val fakeProj = DBProject(
@@ -154,19 +136,7 @@ class NewProjectActivity : AppCompatActivity() {
viewModel.isAuthenticatedAccount = db.cowspentServerSyncHelper.canCreateAuthenticatedProject(fakeProj) viewModel.isAuthenticatedAccount = db.cowspentServerSyncHelper.canCreateAuthenticatedProject(fakeProj)
} }
private fun onPressOk() { private fun onPressOk() = createProject()
val type = viewModel.projectType
val todoCreate = viewModel.whatTodoIsCreate
val url = getFormattedUrl()
val fakeProj = DBProject(
0, "", "", "", url,
"", 0L, type, 0L,
null, false, DBProject.ACCESS_LEVEL_UNKNOWN,
""
)
createProject()
}
private fun getFormattedUrl(): String { private fun getFormattedUrl(): String {
var url = viewModel.projectUrl.trim() var url = viewModel.projectUrl.trim()
@@ -3,7 +3,6 @@ package net.helcel.cowspent.android.project.create
import android.annotation.SuppressLint import android.annotation.SuppressLint
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.selection.selectable
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material.* import androidx.compose.material.*
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
@@ -31,7 +30,6 @@ fun NewProjectScreen(
viewModel: NewProjectViewModel, viewModel: NewProjectViewModel,
onScanQrCode: () -> Unit, onScanQrCode: () -> Unit,
onImportFile: () -> Unit, onImportFile: () -> Unit,
onChooseFromNextcloud: () -> Unit,
onOkPressed: () -> Unit, onOkPressed: () -> Unit,
onBack: () -> Unit, onBack: () -> Unit,
onFieldsChanged: () -> Unit onFieldsChanged: () -> Unit
@@ -224,40 +222,6 @@ fun NewProjectScreen(
) )
} }
if (viewModel.showNextcloudProjectDialog) {
AlertDialog(
onDismissRequest = { viewModel.showNextcloudProjectDialog = false },
title = { Text(stringResource(R.string.choose_account_project_dialog_title)) },
text = {
Column {
viewModel.nextcloudProjects.forEach { project ->
Row(
Modifier
.fillMaxWidth()
.selectable(
selected = false,
onClick = {
viewModel.projectId = project.remoteId
viewModel.projectUrl = project.ncUrl
viewModel.showNextcloudProjectDialog = false
}
)
.padding(16.dp)
) {
Text(text = project.name)
}
}
}
},
confirmButton = {},
dismissButton = {
TextButton(onClick = { viewModel.showNextcloudProjectDialog = false }) {
Text(stringResource(R.string.simple_cancel))
}
}
)
}
if (viewModel.isCreatingRemoteProject) { if (viewModel.isCreatingRemoteProject) {
AlertDialog( AlertDialog(
onDismissRequest = { }, onDismissRequest = { },
@@ -337,7 +301,6 @@ fun NewProjectScreenPreview() {
}, },
onScanQrCode = {}, onScanQrCode = {},
onImportFile = {}, onImportFile = {},
onChooseFromNextcloud = {},
onOkPressed = {}, onOkPressed = {},
onBack = {}, onBack = {},
onFieldsChanged = {} onFieldsChanged = {}
@@ -5,7 +5,6 @@ import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import net.helcel.cowspent.model.DBAccountProject
import net.helcel.cowspent.model.ProjectType import net.helcel.cowspent.model.ProjectType
class NewProjectViewModel : ViewModel() { class NewProjectViewModel : ViewModel() {
@@ -33,8 +32,6 @@ class NewProjectViewModel : ViewModel() {
var isAuthenticatedAccount by mutableStateOf(false) var isAuthenticatedAccount by mutableStateOf(false)
var showAuthWarningDialog by mutableStateOf(false) var showAuthWarningDialog by mutableStateOf(false)
var showNextcloudProjectDialog by mutableStateOf(false)
var nextcloudProjects by mutableStateOf<List<DBAccountProject>>(emptyList())
var isCreatingRemoteProject by mutableStateOf(false) var isCreatingRemoteProject by mutableStateOf(false)
var errorDialogMessage by mutableStateOf<String?>(null) var errorDialogMessage by mutableStateOf<String?>(null)
@@ -12,7 +12,6 @@ enum class ProjectType(val id: String) {
} }
} }
@JvmStatic
fun getTypeById(id: String?): ProjectType? { fun getTypeById(id: String?): ProjectType? {
return reverseMap[id] return reverseMap[id]
} }
@@ -1,12 +1,9 @@
package net.helcel.cowspent.persistence package net.helcel.cowspent.persistence
import android.content.ComponentName
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.content.ServiceConnection
import android.content.SharedPreferences import android.content.SharedPreferences
import android.net.ConnectivityManager import android.net.ConnectivityManager
import android.os.IBinder
import android.util.Log import android.util.Log
import androidx.annotation.VisibleForTesting import androidx.annotation.VisibleForTesting
import androidx.core.content.edit import androidx.core.content.edit
@@ -50,24 +47,6 @@ class CowspentServerSyncHelper private constructor(private val dbHelper: Cowspen
private val preferences: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(dbHelper.context) private val preferences: SharedPreferences = PreferenceManager.getDefaultSharedPreferences(dbHelper.context)
private var networkConnected = false private var networkConnected = false
private val certService = object : ServiceConnection {
override fun onServiceConnected(componentName: ComponentName, iBinder: IBinder) {
if (isSyncPossible) {
val lastId = PreferenceManager.getDefaultSharedPreferences(dbHelper.context).getLong("selected_project", 0)
if (lastId != 0L) {
val proj = dbHelper.getProject(lastId)
if (proj != null) {
appContext.sendBroadcast(Intent(MainConstants.BROADCAST_SYNC_PROJECT))
appContext.sendBroadcast(Intent(MainConstants.BROADCAST_NETWORK_AVAILABLE))
}
}
}
}
override fun onServiceDisconnected(p0: ComponentName?) {
}
}
private var syncActive = false private var syncActive = false
private var syncAccountProjectsActive = false private var syncAccountProjectsActive = false
@@ -79,11 +58,6 @@ class CowspentServerSyncHelper private constructor(private val dbHelper: Cowspen
updateNetworkStatus() updateNetworkStatus()
} }
@Throws(Throwable::class)
protected fun finalize() {
appContext.unbindService(certService)
}
val isSyncPossible: Boolean val isSyncPossible: Boolean
get() { get() {
updateNetworkStatus() updateNetworkStatus()
@@ -12,15 +12,10 @@ import net.helcel.cowspent.model.DBProject
import org.json.JSONArray import org.json.JSONArray
import org.json.JSONException import org.json.JSONException
import org.json.JSONObject import org.json.JSONObject
import org.xml.sax.SAXException
import java.io.ByteArrayInputStream
import java.io.IOException import java.io.IOException
import java.io.InputStream
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Date import java.util.Date
import java.util.Locale import java.util.Locale
import javax.xml.parsers.DocumentBuilderFactory
import javax.xml.parsers.ParserConfigurationException
/** /**
@@ -41,6 +36,10 @@ open class ServerResponse(
val lastModified: Long val lastModified: Long
get() = response.lastModified get() = response.lastModified
@get:Throws(JSONException::class)
val stringContent: String
get() = getResponseStringData()
@Throws(JSONException::class) @Throws(JSONException::class)
fun getResponseObjectData(): JSONObject { fun getResponseObjectData(): JSONObject {
val rawData = JSONObject(content) val rawData = JSONObject(content)
@@ -125,10 +124,6 @@ open class ServerResponse(
private val isJsonMember: Boolean private val isJsonMember: Boolean
) : ServerResponse(response, isOcsResponse) { ) : ServerResponse(response, isOcsResponse) {
@get:Throws(JSONException::class)
val stringContent: String
get() = getResponseStringData()
@get:Throws(JSONException::class) @get:Throws(JSONException::class)
val remoteMemberId: Long val remoteMemberId: Long
get() = if (isJsonMember) get() = if (isJsonMember)
@@ -142,10 +137,6 @@ open class ServerResponse(
isOcsResponse: Boolean isOcsResponse: Boolean
) : ServerResponse(response, isOcsResponse) { ) : ServerResponse(response, isOcsResponse) {
@get:Throws(JSONException::class)
val stringContent: String
get() = getResponseStringData()
@get:Throws(JSONException::class) @get:Throws(JSONException::class)
val remoteCategoryId: Long val remoteCategoryId: Long
get() { get() {
@@ -162,32 +153,18 @@ open class ServerResponse(
class EditRemoteCategoryResponse( class EditRemoteCategoryResponse(
response: VersatileProjectSyncClient.ResponseData, response: VersatileProjectSyncClient.ResponseData,
isOcsResponse: Boolean isOcsResponse: Boolean
) : ServerResponse(response, isOcsResponse) { ) : ServerResponse(response, isOcsResponse)
@get:Throws(JSONException::class)
val stringContent: String
get() = getResponseStringData()
}
class DeleteRemoteCategoryResponse( class DeleteRemoteCategoryResponse(
response: VersatileProjectSyncClient.ResponseData, response: VersatileProjectSyncClient.ResponseData,
isOcsResponse: Boolean isOcsResponse: Boolean
) : ServerResponse(response, isOcsResponse) { ) : ServerResponse(response, isOcsResponse)
@get:Throws(JSONException::class)
val stringContent: String
get() = getResponseStringData()
}
class CreateRemotePaymentModeResponse( class CreateRemotePaymentModeResponse(
response: VersatileProjectSyncClient.ResponseData, response: VersatileProjectSyncClient.ResponseData,
isOcsResponse: Boolean isOcsResponse: Boolean
) : ServerResponse(response, isOcsResponse) { ) : ServerResponse(response, isOcsResponse) {
@get:Throws(JSONException::class)
val stringContent: String
get() = getResponseStringData()
@get:Throws(JSONException::class) @get:Throws(JSONException::class)
val remotePaymentModeId: Long val remotePaymentModeId: Long
get() { get() {
@@ -204,32 +181,18 @@ open class ServerResponse(
class EditRemotePaymentModeResponse( class EditRemotePaymentModeResponse(
response: VersatileProjectSyncClient.ResponseData, response: VersatileProjectSyncClient.ResponseData,
isOcsResponse: Boolean isOcsResponse: Boolean
) : ServerResponse(response, isOcsResponse) { ) : ServerResponse(response, isOcsResponse)
@get:Throws(JSONException::class)
val stringContent: String
get() = getResponseStringData()
}
class DeleteRemotePaymentModeResponse( class DeleteRemotePaymentModeResponse(
response: VersatileProjectSyncClient.ResponseData, response: VersatileProjectSyncClient.ResponseData,
isOcsResponse: Boolean isOcsResponse: Boolean
) : ServerResponse(response, isOcsResponse) { ) : ServerResponse(response, isOcsResponse)
@get:Throws(JSONException::class)
val stringContent: String
get() = getResponseStringData()
}
class CreateRemoteCurrencyResponse( class CreateRemoteCurrencyResponse(
response: VersatileProjectSyncClient.ResponseData, response: VersatileProjectSyncClient.ResponseData,
isOcsResponse: Boolean isOcsResponse: Boolean
) : ServerResponse(response, isOcsResponse) { ) : ServerResponse(response, isOcsResponse) {
@get:Throws(JSONException::class)
val stringContent: String
get() = getResponseStringData()
@get:Throws(JSONException::class) @get:Throws(JSONException::class)
val remoteCurrencyId: Long val remoteCurrencyId: Long
get() { get() {
@@ -246,32 +209,17 @@ open class ServerResponse(
class EditRemoteCurrencyResponse( class EditRemoteCurrencyResponse(
response: VersatileProjectSyncClient.ResponseData, response: VersatileProjectSyncClient.ResponseData,
isOcsResponse: Boolean isOcsResponse: Boolean
) : ServerResponse(response, isOcsResponse) { ) : ServerResponse(response, isOcsResponse)
@get:Throws(JSONException::class)
val stringContent: String
get() = getResponseStringData()
}
class DeleteRemoteCurrencyResponse( class DeleteRemoteCurrencyResponse(
response: VersatileProjectSyncClient.ResponseData, response: VersatileProjectSyncClient.ResponseData,
isOcsResponse: Boolean isOcsResponse: Boolean
) : ServerResponse(response, isOcsResponse) { ) : ServerResponse(response, isOcsResponse)
@get:Throws(JSONException::class)
val stringContent: String
get() = getResponseStringData()
}
class EditRemoteProjectResponse( class EditRemoteProjectResponse(
response: VersatileProjectSyncClient.ResponseData, response: VersatileProjectSyncClient.ResponseData,
isOcsResponse: Boolean isOcsResponse: Boolean
) : ServerResponse(response, isOcsResponse) { ) : ServerResponse(response, isOcsResponse)
@get:Throws(JSONException::class)
val stringContent: String
get() = getResponseStringData()
}
class EditRemoteMemberResponse( class EditRemoteMemberResponse(
response: VersatileProjectSyncClient.ResponseData, response: VersatileProjectSyncClient.ResponseData,
@@ -289,10 +237,6 @@ open class ServerResponse(
isOcsResponse: Boolean isOcsResponse: Boolean
) : ServerResponse(response, isOcsResponse) { ) : ServerResponse(response, isOcsResponse) {
@get:Throws(JSONException::class)
val stringContent: String
get() = getResponseStringData()
@get:Throws(JSONException::class) @get:Throws(JSONException::class)
val remoteBillId: Long val remoteBillId: Long
get() { get() {
@@ -311,10 +255,6 @@ open class ServerResponse(
isOcsResponse: Boolean isOcsResponse: Boolean
) : ServerResponse(response, isOcsResponse) { ) : ServerResponse(response, isOcsResponse) {
@get:Throws(JSONException::class)
val stringContent: String
get() = getResponseStringData()
@get:Throws(JSONException::class) @get:Throws(JSONException::class)
val remoteBillId: Long val remoteBillId: Long
get() { get() {
@@ -331,32 +271,17 @@ open class ServerResponse(
class DeleteRemoteBillResponse( class DeleteRemoteBillResponse(
response: VersatileProjectSyncClient.ResponseData, response: VersatileProjectSyncClient.ResponseData,
isOcsResponse: Boolean isOcsResponse: Boolean
) : ServerResponse(response, isOcsResponse) { ) : ServerResponse(response, isOcsResponse)
@get:Throws(JSONException::class)
val stringContent: String
get() = getResponseStringData()
}
class DeleteRemoteProjectResponse( class DeleteRemoteProjectResponse(
response: VersatileProjectSyncClient.ResponseData, response: VersatileProjectSyncClient.ResponseData,
isOcsResponse: Boolean isOcsResponse: Boolean
) : ServerResponse(response, isOcsResponse) { ) : ServerResponse(response, isOcsResponse)
@get:Throws(JSONException::class)
val stringContent: String
get() = getResponseStringData()
}
class CreateRemoteProjectResponse( class CreateRemoteProjectResponse(
response: VersatileProjectSyncClient.ResponseData, response: VersatileProjectSyncClient.ResponseData,
isOcsResponse: Boolean isOcsResponse: Boolean
) : ServerResponse(response, isOcsResponse) { ) : ServerResponse(response, isOcsResponse)
@get:Throws(JSONException::class)
val stringContent: String
get() = getResponseStringData()
}
class BillsResponse(response: VersatileProjectSyncClient.ResponseData, isOcsResponse: Boolean) : class BillsResponse(response: VersatileProjectSyncClient.ResponseData, isOcsResponse: Boolean) :
ServerResponse(response, isOcsResponse) { ServerResponse(response, isOcsResponse) {
@@ -457,17 +382,6 @@ open class ServerResponse(
get() = content get() = content
} }
@Throws(JSONException::class)
protected fun getPublicTokenFromJSON(json: JSONObject): String? {
if (json.has("code") && json.has("sharetoken")) {
val done = json.getInt("code")
val publicToken = json.getString("sharetoken")
if (done == 1) {
return publicToken
}
}
return null
}
@Throws(JSONException::class) @Throws(JSONException::class)
protected fun getNameFromJSON(json: JSONObject): String { protected fun getNameFromJSON(json: JSONObject): String {
@@ -937,6 +851,8 @@ open class ServerResponse(
remoteId = json.getString("id") remoteId = json.getString("id")
} }
if (!json.isNull("ncurl")) { if (!json.isNull("ncurl")) {
ncUrl = json.getString("ncurl")
} else if (!json.isNull("ncUrl")) {
ncUrl = json.getString("ncUrl") ncUrl = json.getString("ncUrl")
} }
val archivedTs: Long? = getArchivedTsFromJSON(json) val archivedTs: Long? = getArchivedTsFromJSON(json)
@@ -946,26 +862,6 @@ open class ServerResponse(
return DBAccountProject(0, remoteId, null, name, ncUrl, archivedTs) return DBAccountProject(0, remoteId, null, name, ncUrl, archivedTs)
} }
@Throws(IOException::class)
protected fun getColorFromContent(content: String): String? {
var result: String? = null
try {
val dbf = DocumentBuilderFactory.newInstance()
val db = dbf.newDocumentBuilder()
val stream: InputStream = ByteArrayInputStream(content.toByteArray())
val doc = db.parse(stream)
doc.documentElement.normalize()
// Locate the Tag Name
val nodeList = doc.getElementsByTagName("color")
if (nodeList.length > 0) {
result = nodeList.item(0).textContent
Log.i(TAG, "I GOT THE COLOR from server: $result")
}
} catch (_: ParserConfigurationException) {
} catch (_: SAXException) {
}
return result
}
protected fun getColorFromJsonContent(json: JSONObject): String? { protected fun getColorFromJsonContent(json: JSONObject): String? {
return try { return try {
@@ -202,8 +202,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>
@@ -202,8 +202,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>
@@ -202,8 +202,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>
@@ -202,8 +202,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>
@@ -202,8 +202,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>
@@ -194,8 +194,6 @@
<string name="todo_join">Bestehendem Projekt beitreten</string> <string name="todo_join">Bestehendem Projekt beitreten</string>
<string name="todo_create">Neues Projekt erstellen</string> <string name="todo_create">Neues Projekt erstellen</string>
<string name="import_tooltip">Aus Datei importieren</string> <string name="import_tooltip">Aus Datei importieren</string>
<string name="choose_account_project_dialog_title">Projekt auswählen</string>
<string name="choose_account_project_dialog_impossible">Keine Projekte auf diesem Konto gefunden.</string>
<string name="choose_project_management_action">Projekt</string> <string name="choose_project_management_action">Projekt</string>
<string name="project_added_success">Projekt erfolgreich hinzugefügt.</string> <string name="project_added_success">Projekt erfolgreich hinzugefügt.</string>
<string name="no_projects_text">Du hast noch keine Projekte.</string> <string name="no_projects_text">Du hast noch keine Projekte.</string>
@@ -202,8 +202,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>
@@ -195,8 +195,6 @@
<string name="todo_join">Unirse a un proyecto existente</string> <string name="todo_join">Unirse a un proyecto existente</string>
<string name="todo_create">Crear un proyecto nuevo</string> <string name="todo_create">Crear un proyecto nuevo</string>
<string name="import_tooltip">Importar desde un archivo</string> <string name="import_tooltip">Importar desde un archivo</string>
<string name="choose_account_project_dialog_title">Elegir un proyecto</string>
<string name="choose_account_project_dialog_impossible">No se encontraron proyectos en esta cuenta.</string>
<string name="choose_project_management_action">Proyecto</string> <string name="choose_project_management_action">Proyecto</string>
<string name="project_added_success">Proyecto añadido correctamente.</string> <string name="project_added_success">Proyecto añadido correctamente.</string>
<string name="no_projects_text">Aún no tienes proyectos.</string> <string name="no_projects_text">Aún no tienes proyectos.</string>
@@ -202,8 +202,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>
@@ -198,8 +198,6 @@
<string name="todo_join">Rejoindre un projet existant</string> <string name="todo_join">Rejoindre un projet existant</string>
<string name="todo_create">Créer un nouveau projet</string> <string name="todo_create">Créer un nouveau projet</string>
<string name="import_tooltip">Importer depuis un fichier</string> <string name="import_tooltip">Importer depuis un fichier</string>
<string name="choose_account_project_dialog_title">Choisir un projet</string>
<string name="choose_account_project_dialog_impossible">Aucun projet trouvé sur ce compte.</string>
<string name="choose_project_management_action">Projet</string> <string name="choose_project_management_action">Projet</string>
<string name="project_added_success">Le projet a été ajouté avec succès.</string> <string name="project_added_success">Le projet a été ajouté avec succès.</string>
<string name="no_projects_text">Vous n\'avez pas encore de projet.</string> <string name="no_projects_text">Vous n\'avez pas encore de projet.</string>
@@ -202,8 +202,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>
@@ -202,8 +202,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>
@@ -202,8 +202,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>
@@ -202,8 +202,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>
@@ -202,8 +202,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>
@@ -202,8 +202,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>
@@ -202,8 +202,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>
@@ -202,8 +202,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>
@@ -202,8 +202,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>
@@ -202,8 +202,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>
@@ -202,8 +202,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>
@@ -202,8 +202,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>
@@ -202,8 +202,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>
@@ -202,8 +202,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>
@@ -202,8 +202,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>
@@ -202,8 +202,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>
@@ -202,8 +202,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>
@@ -202,8 +202,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>
@@ -202,8 +202,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>
-2
View File
@@ -218,8 +218,6 @@
<string name="todo_join">Join existing project</string> <string name="todo_join">Join existing project</string>
<string name="todo_create">Create new project</string> <string name="todo_create">Create new project</string>
<string name="import_tooltip">Import from file</string> <string name="import_tooltip">Import from file</string>
<string name="choose_account_project_dialog_title">Choose project</string>
<string name="choose_account_project_dialog_impossible">No projects found on this account.</string>
<string name="choose_project_management_action">Project</string> <string name="choose_project_management_action">Project</string>
<string name="project_added_success">Project added successfully.</string> <string name="project_added_success">Project added successfully.</string>
<string name="no_projects_text">You have no projects yet.</string> <string name="no_projects_text">You have no projects yet.</string>