Move logout and report bug to Setting screen
This commit is contained in:
parent
0568ea7c28
commit
37daf12cd0
36 changed files with 429 additions and 175 deletions
|
|
@ -4,7 +4,6 @@ package io.element.android.x.features.rageshake.bugreport
|
|||
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.imePadding
|
||||
|
|
@ -14,7 +13,6 @@ import androidx.compose.foundation.rememberScrollState
|
|||
import androidx.compose.foundation.text.KeyboardOptions
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.material3.Button
|
||||
import androidx.compose.material3.Checkbox
|
||||
import androidx.compose.material3.CircularProgressIndicator
|
||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
|
|
|
|||
|
|
@ -9,10 +9,10 @@ import androidx.datastore.preferences.core.stringPreferencesKey
|
|||
import androidx.datastore.preferences.preferencesDataStore
|
||||
import io.element.android.x.core.bool.orFalse
|
||||
import io.element.android.x.di.ApplicationContext
|
||||
import javax.inject.Inject
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.map
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import javax.inject.Inject
|
||||
|
||||
private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "elementx_crash")
|
||||
|
||||
|
|
|
|||
|
|
@ -3,9 +3,9 @@ package io.element.android.x.features.rageshake.crash
|
|||
import android.content.Context
|
||||
import android.os.Build
|
||||
import io.element.android.x.core.data.tryOrNull
|
||||
import timber.log.Timber
|
||||
import java.io.PrintWriter
|
||||
import java.io.StringWriter
|
||||
import timber.log.Timber
|
||||
|
||||
class VectorUncaughtExceptionHandler(
|
||||
context: Context
|
||||
|
|
|
|||
|
|
@ -3,17 +3,17 @@ package io.element.android.x.features.rageshake.logs
|
|||
import android.content.Context
|
||||
import android.util.Log
|
||||
import io.element.android.x.core.data.tryOrNull
|
||||
import kotlinx.coroutines.DelicateCoroutinesApi
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.launch
|
||||
import timber.log.Timber
|
||||
import java.io.File
|
||||
import java.io.PrintWriter
|
||||
import java.io.StringWriter
|
||||
import java.util.logging.FileHandler
|
||||
import java.util.logging.Level
|
||||
import java.util.logging.Logger
|
||||
import kotlinx.coroutines.DelicateCoroutinesApi
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.GlobalScope
|
||||
import kotlinx.coroutines.launch
|
||||
import timber.log.Timber
|
||||
|
||||
/**
|
||||
* Will be planted in Timber.
|
||||
|
|
|
|||
|
|
@ -1,7 +1,11 @@
|
|||
package io.element.android.x.features.rageshake.preferences
|
||||
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.material.icons.Icons
|
||||
import androidx.compose.material.icons.filled.BugReport
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import com.airbnb.mvrx.compose.collectAsState
|
||||
|
|
@ -10,44 +14,58 @@ import io.element.android.x.designsystem.components.preferences.PreferenceCatego
|
|||
import io.element.android.x.designsystem.components.preferences.PreferenceSlide
|
||||
import io.element.android.x.designsystem.components.preferences.PreferenceSwitch
|
||||
import io.element.android.x.designsystem.components.preferences.PreferenceText
|
||||
import io.element.android.x.element.resources.R as ElementR
|
||||
import io.element.android.x.features.rageshake.detection.RageshakeDetectionViewModel
|
||||
import io.element.android.x.features.rageshake.detection.RageshakeDetectionViewState
|
||||
import io.element.android.x.element.resources.R as ElementR
|
||||
|
||||
@Composable
|
||||
fun RageshakePreferenceCategory() {
|
||||
RageshakePreferenceContent()
|
||||
fun RageshakePreferences(
|
||||
onOpenRageShake: () -> Unit = {},
|
||||
) {
|
||||
RageshakePreferencesContent(
|
||||
onOpenRageShake = onOpenRageShake,
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun RageshakePreferenceContent(
|
||||
viewModel: RageshakeDetectionViewModel = mavericksViewModel()
|
||||
fun RageshakePreferencesContent(
|
||||
modifier: Modifier = Modifier,
|
||||
viewModel: RageshakeDetectionViewModel = mavericksViewModel(),
|
||||
onOpenRageShake: () -> Unit = {},
|
||||
) {
|
||||
val state: RageshakeDetectionViewState by viewModel.collectAsState()
|
||||
PreferenceCategory(title = stringResource(id = ElementR.string.settings_rageshake)) {
|
||||
if (state.isSupported) {
|
||||
PreferenceSwitch(
|
||||
title = stringResource(id = ElementR.string.send_bug_report_rage_shake),
|
||||
isChecked = state.isEnabled,
|
||||
onCheckedChange = viewModel::onEnableClicked
|
||||
Column(modifier = modifier) {
|
||||
PreferenceCategory(title = stringResource(id = ElementR.string.send_bug_report)) {
|
||||
PreferenceText(
|
||||
title = stringResource(id = ElementR.string.send_bug_report),
|
||||
icon = Icons.Default.BugReport,
|
||||
onClick = onOpenRageShake
|
||||
)
|
||||
if (state.isEnabled) {
|
||||
}
|
||||
PreferenceCategory(title = stringResource(id = ElementR.string.settings_rageshake)) {
|
||||
if (state.isSupported) {
|
||||
PreferenceSwitch(
|
||||
title = stringResource(id = ElementR.string.send_bug_report_rage_shake),
|
||||
isChecked = state.isEnabled,
|
||||
onCheckedChange = viewModel::onEnableClicked
|
||||
)
|
||||
PreferenceSlide(
|
||||
title = stringResource(id = ElementR.string.settings_rageshake_detection_threshold),
|
||||
// summary = stringResource(id = ElementR.string.settings_rageshake_detection_threshold_summary),
|
||||
value = state.sensitivity,
|
||||
enabled = state.isEnabled,
|
||||
steps = 3 /* 5 possible values - steps are in ]0, 1[ */,
|
||||
onValueChange = viewModel::onSensitivityChange
|
||||
)
|
||||
} else {
|
||||
PreferenceText(title = "Rageshaking is not supported by your device")
|
||||
}
|
||||
} else {
|
||||
PreferenceText(title = "Rageshaking is not supported by your device")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
@Preview
|
||||
fun RageshakePreferenceCategoryPreview() {
|
||||
RageshakePreferenceCategory()
|
||||
fun RageshakePreferencePreview() {
|
||||
RageshakePreferences()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -41,7 +41,8 @@ class RageShake @Inject constructor(
|
|||
}
|
||||
|
||||
/**
|
||||
* sensitivity will be {0, O.25, 0.5, 0.75, 1} and converted to [ShakeDetector.SENSITIVITY_LIGHT (=11), ShakeDetector.SENSITIVITY_HARD (=15)]
|
||||
* sensitivity will be {0, O.25, 0.5, 0.75, 1} and converted to
|
||||
* [ShakeDetector.SENSITIVITY_LIGHT (=11), ShakeDetector.SENSITIVITY_HARD (=15)].
|
||||
*/
|
||||
fun setSensitivity(sensitivity: Float) {
|
||||
shakeDetector?.setSensitivity(
|
||||
|
|
|
|||
|
|
@ -9,9 +9,9 @@ import androidx.datastore.preferences.core.floatPreferencesKey
|
|||
import androidx.datastore.preferences.preferencesDataStore
|
||||
import io.element.android.x.core.bool.orTrue
|
||||
import io.element.android.x.di.ApplicationContext
|
||||
import javax.inject.Inject
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.map
|
||||
import javax.inject.Inject
|
||||
|
||||
private val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "elementx_rageshake")
|
||||
|
||||
|
|
|
|||
|
|
@ -10,6 +10,12 @@ import io.element.android.x.features.rageshake.R
|
|||
import io.element.android.x.features.rageshake.crash.CrashDataStore
|
||||
import io.element.android.x.features.rageshake.logs.VectorFileLogger
|
||||
import io.element.android.x.features.rageshake.screenshot.ScreenshotHolder
|
||||
import java.io.File
|
||||
import java.io.IOException
|
||||
import java.io.OutputStreamWriter
|
||||
import java.net.HttpURLConnection
|
||||
import java.util.Locale
|
||||
import javax.inject.Inject
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.flow.first
|
||||
|
|
@ -24,12 +30,6 @@ import okhttp3.Response
|
|||
import org.json.JSONException
|
||||
import org.json.JSONObject
|
||||
import timber.log.Timber
|
||||
import java.io.File
|
||||
import java.io.IOException
|
||||
import java.io.OutputStreamWriter
|
||||
import java.net.HttpURLConnection
|
||||
import java.util.Locale
|
||||
import javax.inject.Inject
|
||||
|
||||
/**
|
||||
* BugReporter creates and sends the bug reports.
|
||||
|
|
@ -121,6 +121,7 @@ class BugReporter @Inject constructor(
|
|||
/**
|
||||
* Send a bug report.
|
||||
*
|
||||
* @param coroutineScope The coroutine scope
|
||||
* @param reportType The report type (bug, suggestion, feedback)
|
||||
* @param withDevicesLogs true to include the device log
|
||||
* @param withCrashLogs true to include the crash logs
|
||||
|
|
@ -241,14 +242,14 @@ class BugReporter @Inject constructor(
|
|||
.addFormDataPart("device", Build.MODEL.trim())
|
||||
// .addFormDataPart("verbose_log", vectorPreferences.labAllowedExtendedLogging().toOnOff())
|
||||
.addFormDataPart("multi_window", inMultiWindowMode.toOnOff())
|
||||
//.addFormDataPart(
|
||||
// .addFormDataPart(
|
||||
// "os", Build.VERSION.RELEASE + " (API " + sdkIntProvider.get() + ") " +
|
||||
// Build.VERSION.INCREMENTAL + "-" + Build.VERSION.CODENAME
|
||||
//)
|
||||
// )
|
||||
.addFormDataPart("locale", Locale.getDefault().toString())
|
||||
//.addFormDataPart("app_language", vectorLocale.applicationLocale.toString())
|
||||
//.addFormDataPart("default_app_language", systemLocaleProvider.getSystemLocale().toString())
|
||||
//.addFormDataPart("theme", ThemeUtils.getApplicationTheme(context))
|
||||
// .addFormDataPart("app_language", vectorLocale.applicationLocale.toString())
|
||||
// .addFormDataPart("default_app_language", systemLocaleProvider.getSystemLocale().toString())
|
||||
// .addFormDataPart("theme", ThemeUtils.getApplicationTheme(context))
|
||||
.addFormDataPart("server_version", serverVersion)
|
||||
.apply {
|
||||
customFields?.forEach { (name, value) ->
|
||||
|
|
@ -442,19 +443,19 @@ class BugReporter @Inject constructor(
|
|||
}
|
||||
*/
|
||||
|
||||
//private fun logOtherInfo() {
|
||||
// private fun logOtherInfo() {
|
||||
// Timber.i("SyncThread state: " + activeSessionHolder.getSafeActiveSession()?.syncService()?.getSyncState())
|
||||
//}
|
||||
// }
|
||||
|
||||
//private fun logDbInfo() {
|
||||
// private fun logDbInfo() {
|
||||
// val dbInfo = matrix.debugService().getDbUsageInfo()
|
||||
// Timber.i(dbInfo)
|
||||
//}
|
||||
// }
|
||||
|
||||
//private fun logProcessInfo() {
|
||||
// private fun logProcessInfo() {
|
||||
// val pInfo = processInfo.getInfo()
|
||||
// Timber.i(pInfo)
|
||||
//}
|
||||
// }
|
||||
|
||||
private fun rageShakeAppNameForReport(reportType: ReportType): String {
|
||||
// As per https://github.com/matrix-org/rageshake
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue