Dan Ballard pushed to branch firefox-android-115.2.1-13.5-1 at The Tor Project / Applications / firefox-android
Commits:
- 
6727ad88
by clairehurst at 2024-06-14T00:07:06+00:00
2 changed files:
- fenix/app/src/main/java/org/mozilla/fenix/tor/TorLogsComposeFragment.kt
- fenix/app/src/main/java/org/mozilla/fenix/tor/TorLogsViewModel.kt
Changes:
| ... | ... | @@ -23,13 +23,19 @@ import androidx.compose.material.Icon | 
| 23 | 23 |  import androidx.compose.material.Scaffold
 | 
| 24 | 24 |  import androidx.compose.material.Text
 | 
| 25 | 25 |  import androidx.compose.runtime.Composable
 | 
| 26 | +import androidx.compose.runtime.DisposableEffect
 | |
| 27 | +import androidx.compose.runtime.LaunchedEffect
 | |
| 26 | 28 |  import androidx.compose.runtime.Stable
 | 
| 29 | +import androidx.compose.runtime.mutableStateOf
 | |
| 30 | +import androidx.compose.runtime.remember
 | |
| 27 | 31 |  import androidx.compose.ui.Modifier
 | 
| 28 | 32 |  import androidx.compose.ui.platform.ComposeView
 | 
| 33 | +import androidx.compose.ui.platform.LocalLifecycleOwner
 | |
| 29 | 34 |  import androidx.compose.ui.res.painterResource
 | 
| 30 | 35 |  import androidx.compose.ui.unit.dp
 | 
| 31 | 36 |  import androidx.fragment.app.Fragment
 | 
| 32 | 37 |  import androidx.fragment.app.viewModels
 | 
| 38 | +import androidx.lifecycle.Observer
 | |
| 33 | 39 |  import mozilla.components.ui.colors.PhotonColors
 | 
| 34 | 40 |  import org.mozilla.fenix.R
 | 
| 35 | 41 | |
| ... | ... | @@ -53,17 +59,37 @@ class TorLogsComposeFragment : Fragment() { | 
| 53 | 59 | |
| 54 | 60 |      @Composable
 | 
| 55 | 61 |      private fun TorLogs(paddingValues: PaddingValues) {
 | 
| 62 | +        val torLogsState = remember { mutableStateOf<List<TorLog>>(emptyList()) }
 | |
| 63 | +        val lifecycleOwner = LocalLifecycleOwner.current
 | |
| 64 | +        val scrollState = rememberScrollState()
 | |
| 65 | + | |
| 66 | +        DisposableEffect(viewModel.torLogs(), lifecycleOwner) {
 | |
| 67 | +            val observer = Observer<List<TorLog>> { logs ->
 | |
| 68 | +                torLogsState.value = logs
 | |
| 69 | +            }
 | |
| 70 | +            viewModel.torLogs().observe(lifecycleOwner, observer)
 | |
| 71 | +            onDispose {
 | |
| 72 | +                viewModel.torLogs().removeObserver(observer)
 | |
| 73 | +            }
 | |
| 74 | +        }
 | |
| 75 | + | |
| 76 | +        val torLogs = torLogsState.value
 | |
| 77 | + | |
| 78 | +        LaunchedEffect(torLogs) {
 | |
| 79 | +            scrollState.animateScrollTo(scrollState.maxValue)
 | |
| 80 | +        }
 | |
| 81 | + | |
| 56 | 82 |          SelectionContainer {
 | 
| 57 | 83 |              Column(
 | 
| 58 | 84 |                  // Column instead of LazyColumn so that you can select all the logs, and not just one "screen" at a time
 | 
| 59 | 85 |                  // The logs won't be too big so loading them all instead of just whats visible shouldn't be a big deal
 | 
| 60 | 86 |                  modifier = Modifier
 | 
| 61 | 87 |                      .fillMaxSize()
 | 
| 62 | -                    .verticalScroll(state = rememberScrollState(), reverseScrolling = true)
 | |
| 88 | +                    .verticalScroll(scrollState)
 | |
| 63 | 89 |                      .padding(paddingValues)
 | 
| 64 | 90 |                      .background(PhotonColors.Ink50), // Standard background color
 | 
| 65 | 91 |              ) {
 | 
| 66 | -                for (log in viewModel.torLogs) {
 | |
| 92 | +                for (log in torLogs) {
 | |
| 67 | 93 |                      LogRow(log = log)
 | 
| 68 | 94 |                  }
 | 
| 69 | 95 |              }
 | 
| ... | ... | @@ -12,6 +12,8 @@ import android.os.Build | 
| 12 | 12 |  import android.widget.Toast
 | 
| 13 | 13 |  import androidx.compose.runtime.Stable
 | 
| 14 | 14 |  import androidx.lifecycle.AndroidViewModel
 | 
| 15 | +import androidx.lifecycle.LiveData
 | |
| 16 | +import androidx.lifecycle.MutableLiveData
 | |
| 15 | 17 |  import org.mozilla.fenix.R
 | 
| 16 | 18 |  import org.mozilla.fenix.ext.components
 | 
| 17 | 19 |  import java.sql.Timestamp
 | 
| ... | ... | @@ -21,12 +23,18 @@ class TorLogsViewModel(application: Application) : AndroidViewModel(application) | 
| 21 | 23 |      private val clipboardManager =
 | 
| 22 | 24 |          application.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
 | 
| 23 | 25 | |
| 24 | -    val torLogs: MutableList<TorLog> = mutableListOf(
 | |
| 25 | -        TorLog(
 | |
| 26 | -            "---------------" + application.getString(R.string.tor_initializing_log) + "---------------",
 | |
| 27 | -        ),
 | |
| 26 | +    private val _torLogs: MutableLiveData<List<TorLog>> = MutableLiveData(
 | |
| 27 | +        mutableListOf(TorLog("---------------" + application.getString(R.string.tor_initializing_log) + "---------------")),
 | |
| 28 | 28 |      )
 | 
| 29 | 29 | |
| 30 | +    fun torLogs(): LiveData<List<TorLog>> {
 | |
| 31 | +        return _torLogs
 | |
| 32 | +    }
 | |
| 33 | + | |
| 34 | +    private fun addLog(log: TorLog) {
 | |
| 35 | +        _torLogs.value = _torLogs.value?.plus(log) ?: return
 | |
| 36 | +    }
 | |
| 37 | + | |
| 30 | 38 |      init {
 | 
| 31 | 39 |          setupClipboardListener()
 | 
| 32 | 40 |          torController.registerTorLogListener(this)
 | 
| ... | ... | @@ -34,14 +42,16 @@ class TorLogsViewModel(application: Application) : AndroidViewModel(application) | 
| 34 | 42 |              .filter { !(it.second!!.startsWith("Circuit") && it.first == "ON") }
 | 
| 35 | 43 |              // Keep synchronized with format in onTorStatusUpdate
 | 
| 36 | 44 |              .flatMap { listOf(TorLog("[${it.first}] ${it.second}")) }
 | 
| 37 | -        torLogs.addAll(currentEntries)
 | |
| 45 | +        for (log in currentEntries) {
 | |
| 46 | +            addLog(log)
 | |
| 47 | +        }
 | |
| 38 | 48 |      }
 | 
| 39 | 49 | |
| 40 | 50 |      override fun onLog(type: String?, message: String?) {
 | 
| 41 | 51 |          if (message == null || type == null) return
 | 
| 42 | 52 |          if (type == "ON" && type.startsWith("Circuit")) return
 | 
| 43 | 53 | |
| 44 | -        torLogs.add(TorLog("[$type] $message"))
 | |
| 54 | +        addLog(TorLog("[$type] $message"))
 | |
| 45 | 55 |      }
 | 
| 46 | 56 | |
| 47 | 57 |      override fun onCleared() {
 | 
| ... | ... | @@ -74,7 +84,8 @@ class TorLogsViewModel(application: Application) : AndroidViewModel(application) | 
| 74 | 84 | |
| 75 | 85 |      private fun getAllTorLogs(): String {
 | 
| 76 | 86 |          var ret = ""
 | 
| 77 | -        for (log in torLogs) {
 | |
| 87 | +        for (log in torLogs().value
 | |
| 88 | +            ?: return getApplication<Application>().getString(R.string.default_error_msg)) {
 | |
| 78 | 89 |              ret += log.text + '\n'
 | 
| 79 | 90 |          }
 | 
| 80 | 91 |          return ret
 |