11package org.thoughtcrime.securesms.preferences
22
3- import android.Manifest
4- import android.content.Intent
5- import android.net.Uri
6- import android.os.Build
7- import android.os.Bundle
8- import android.view.Gravity
9- import android.view.LayoutInflater
10- import android.view.View
11- import android.view.ViewGroup
12- import android.widget.FrameLayout
13- import android.widget.ProgressBar
14- import android.widget.TextView
15- import android.widget.Toast
16- import androidx.compose.runtime.getValue
17- import androidx.compose.runtime.mutableStateOf
18- import androidx.compose.runtime.setValue
19- import androidx.compose.ui.platform.ComposeView
20- import androidx.compose.ui.platform.ViewCompositionStrategy
21- import androidx.compose.ui.res.stringResource
22- import androidx.core.view.isInvisible
23- import androidx.preference.Preference
24- import com.squareup.phrase.Phrase
3+ import androidx.activity.viewModels
4+ import androidx.compose.runtime.Composable
255import dagger.hilt.android.AndroidEntryPoint
26- import network.loki.messenger.R
27- import org.session.libsession.utilities.StringSubstitutionConstants.APP_NAME_KEY
28- import org.session.libsignal.utilities.Log
29- import org.thoughtcrime.securesms.ScreenLockActionBarActivity
6+ import org.thoughtcrime.securesms.FullComposeScreenLockActivity
307import org.thoughtcrime.securesms.permissions.Permissions
31- import org.thoughtcrime.securesms.ui.AlertDialog
32- import org.thoughtcrime.securesms.ui.DialogButtonData
33- import org.thoughtcrime.securesms.ui.GetString
34- import org.thoughtcrime.securesms.ui.components.ExportLogsDialog
35- import org.thoughtcrime.securesms.ui.components.LogExporter
36- import org.thoughtcrime.securesms.ui.getSubbedCharSequence
37- import org.thoughtcrime.securesms.ui.getSubbedString
38- import org.thoughtcrime.securesms.ui.openUrl
39- import org.thoughtcrime.securesms.ui.setThemedContent
40- import javax.inject.Inject
8+ import org.thoughtcrime.securesms.preferences.compose.HelpSettingsScreen
9+ import org.thoughtcrime.securesms.preferences.compose.HelpSettingsViewModel
4110
4211@AndroidEntryPoint
43- class HelpSettingsActivity : ScreenLockActionBarActivity () {
12+ class HelpSettingsActivity : FullComposeScreenLockActivity () {
4413
45- override val applyDefaultWindowInsets: Boolean
46- get() = false
14+ @Composable
15+ override fun ComposeContent () {
16+ val viewModel: HelpSettingsViewModel by viewModels()
4717
48- override fun onCreate (savedInstanceState : Bundle ? , ready : Boolean ) {
49- super .onCreate(savedInstanceState, ready)
50- setContentView(R .layout.activity_fragment_wrapper)
51- supportFragmentManager.beginTransaction()
52- .replace(R .id.fragmentContainer, HelpSettingsFragment ())
53- .commit()
54- }
55- }
56-
57- @AndroidEntryPoint
58- class HelpSettingsFragment : CorrectedPreferenceFragment () {
59-
60- companion object {
61- private const val EXPORT_LOGS = " export_logs"
62- private const val TRANSLATE = " translate_session"
63- private const val FEEDBACK = " feedback"
64- private const val FAQ = " faq"
65- private const val SUPPORT = " support"
66- private const val CROWDIN_URL = " https://getsession.org/translate"
67- private const val FEEDBACK_URL = " https://getsession.org/survey"
68- private const val FAQ_URL = " https://getsession.org/faq"
69- private const val SUPPORT_URL = " https://sessionapp.zendesk.com/hc/en-us"
70- }
71-
72- private var composeView: ComposeView ? = null
73-
74- private var showExportLogDialog by mutableStateOf(false )
75-
76- @Inject
77- lateinit var exporter: LogExporter
78-
79- override fun onCreateView (
80- inflater : LayoutInflater ,
81- container : ViewGroup ? ,
82- savedInstanceState : Bundle ?
83- ): View {
84- // We will wrap the existing screen in a framelayout in order to add custom compose content
85- val preferenceView = super .onCreateView(inflater, container, savedInstanceState)
86-
87- val wrapper = FrameLayout (requireContext()).apply {
88- layoutParams = ViewGroup .LayoutParams (
89- ViewGroup .LayoutParams .MATCH_PARENT ,
90- ViewGroup .LayoutParams .MATCH_PARENT
91- )
92- }
93-
94- wrapper.addView(
95- preferenceView,
96- FrameLayout .LayoutParams (
97- FrameLayout .LayoutParams .MATCH_PARENT ,
98- FrameLayout .LayoutParams .MATCH_PARENT
99- )
100- )
101-
102- composeView = ComposeView (requireContext())
103- wrapper.addView(
104- composeView,
105- FrameLayout .LayoutParams (
106- FrameLayout .LayoutParams .MATCH_PARENT ,
107- FrameLayout .LayoutParams .WRAP_CONTENT ,
108- Gravity .TOP
109- )
18+ HelpSettingsScreen (
19+ viewModel = viewModel,
20+ onBackPressed = this ::finish
11021 )
111-
112- return wrapper
11322 }
11423
115- override fun onViewCreated (view : View , savedInstanceState : Bundle ? ) {
116- super .onViewCreated(view, savedInstanceState)
117-
118- // set up compose content
119- composeView?.apply {
120- setViewCompositionStrategy(
121- ViewCompositionStrategy .DisposeOnViewTreeLifecycleDestroyed
122- )
123- setThemedContent {
124- if (showExportLogDialog) {
125- ExportLogsDialog (
126- logExporter = exporter,
127- onDismissRequest = {
128- showExportLogDialog = false
129- }
130- )
131- }
132- }
133- }
134- }
135-
136- override fun onCreatePreferences (savedInstanceState : Bundle ? , rootKey : String? ) {
137- addPreferencesFromResource(R .xml.preferences_help)
138-
139- // String sub the summary text of the `export_logs` element in preferences_help.xml
140- val exportPref = preferenceScreen.findPreference<Preference >(EXPORT_LOGS )
141- exportPref?.summary = context?.getSubbedCharSequence(R .string.helpReportABugExportLogsDescription, APP_NAME_KEY to getString(R .string.app_name))
142-
143- // String sub the summary text of the `translate_session` element in preferences_help.xml
144- val translatePref = preferenceScreen.findPreference<Preference >(TRANSLATE )
145- translatePref?.title = context?.getSubbedCharSequence(R .string.helpHelpUsTranslateSession, APP_NAME_KEY to getString(R .string.app_name))
146- }
147-
148- override fun onPreferenceTreeClick (preference : Preference ): Boolean {
149- return when (preference.key) {
150- EXPORT_LOGS -> {
151- shareLogs()
152- true
153- }
154- TRANSLATE -> {
155- requireContext().openUrl(CROWDIN_URL )
156- true
157- }
158- FEEDBACK -> {
159- requireContext().openUrl(FEEDBACK_URL )
160- true
161- }
162- FAQ -> {
163- requireContext().openUrl(FAQ_URL )
164- true
165- }
166- SUPPORT -> {
167- requireContext().openUrl(SUPPORT_URL )
168- true
169- }
170- else -> super .onPreferenceTreeClick(preference)
171- }
172- }
173-
174- private fun updateExportButtonAndProgressBarUI (exportJobRunning : Boolean ) {
175- this .activity?.runOnUiThread(Runnable {
176- // Change export logs button text
177- val exportLogsButton = this .activity?.findViewById(R .id.export_logs_button) as TextView ?
178- if (exportLogsButton == null ) { Log .w(" Loki" , " Could not find export logs button view." ) }
179- exportLogsButton?.text = if (exportJobRunning) getString(R .string.cancel) else getString(R .string.helpReportABugExportLogs)
180-
181- // Show progress bar
182- val exportProgressBar = this .activity?.findViewById(R .id.export_progress_bar) as ProgressBar ?
183- exportProgressBar?.isInvisible = ! exportJobRunning
184- })
24+ override fun onRequestPermissionsResult (
25+ requestCode : Int ,
26+ permissions : Array <out String >,
27+ grantResults : IntArray
28+ ) {
29+ super .onRequestPermissionsResult(requestCode, permissions, grantResults)
30+ Permissions .onRequestPermissionsResult(this , requestCode, permissions, grantResults)
18531 }
32+ }
18633
187- private fun shareLogs () {
188- Permissions .with (this )
189- .request(Manifest .permission.WRITE_EXTERNAL_STORAGE )
190- .maxSdkVersion(Build .VERSION_CODES .P )
191- .withPermanentDenialDialog(requireContext().getSubbedString(R .string.permissionsStorageDeniedLegacy, APP_NAME_KEY to getString(R .string.app_name)))
192- .onAnyDenied {
193- val c = requireContext()
194- val txt = c.getSubbedString(R .string.permissionsStorageDeniedLegacy, APP_NAME_KEY to getString(R .string.app_name))
195- Toast .makeText(c, txt, Toast .LENGTH_LONG ).show()
196- }
197- .onAllGranted {
198- showExportLogDialog = true
199- }
200- .execute()
201- }
202- }
0 commit comments