Skip to content

Commit 263bf19

Browse files
committed
refactor: simplify HTTPS server setup and remove duplicate test utils
1 parent 154263a commit 263bf19

9 files changed

Lines changed: 42 additions & 171 deletions

File tree

AnkiDroid/src/androidTest/java/com/ichi2/testutils/common/FailOnUnhandledExceptionRule.kt

Lines changed: 0 additions & 70 deletions
This file was deleted.

AnkiDroid/src/main/java/com/ichi2/anki/pages/AnkiServer.kt

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,20 @@ open class AnkiServer(
2828
cacheDir: File? = null,
2929
port: Int = 0,
3030
) : NanoHTTPD(LOCALHOST, port) {
31-
private val isHttps = cacheDir != null
32-
private val sslContext = cacheDir?.let { SslUtil.getSSLContext(it) }
31+
private val sslContext =
32+
cacheDir?.let { cacheDir ->
33+
runCatching { SslUtil.getSSLContext(cacheDir) }
34+
.onFailure { Timber.w(it, "Failed to initialize HTTPS for AnkiServer") }
35+
.getOrNull()
36+
}
3337

3438
init {
35-
// Enable HTTPS if context was provided (Issue #15991)
36-
// This allows WebView to load cards without cleartext restrictions on modern Android
37-
if (isHttps && sslContext != null) {
38-
makeSecure(sslContext.serverSocketFactory, null)
39-
}
39+
// Enable HTTPS when a keystore was created successfully (Issue #15991)
40+
// This allows WebView to load cards without cleartext restrictions on modern Android.
41+
sslContext?.let { makeSecure(it.serverSocketFactory, null) }
4042
}
4143

42-
fun baseUrl(): String = "${if (isHttps) "https" else "http"}://$LOCALHOST:$listeningPort/"
44+
fun baseUrl(): String = "${if (sslContext != null) "https" else "http"}://$LOCALHOST:$listeningPort/"
4345

4446
// it's faster to serve local files without GZip. see 'page render' in logs
4547
// This also removes 'W/System: A resource failed to call end.'

AnkiDroid/src/main/java/com/ichi2/anki/pages/PageFragment.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ abstract class PageFragment(
100100
view: View,
101101
savedInstanceState: Bundle?,
102102
) {
103+
// Store the TLS keystore in the app cache directory: it is per-profile by design and can be
104+
// regenerated if the OS clears it.
103105
server = AnkiServer(this, requireContext().cacheDir).also { it.start() }
104106
webViewLayout = view.findViewById(R.id.webview_layout)
105107

AnkiDroid/src/main/java/com/ichi2/anki/previewer/PreviewerFragment.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,11 @@ import androidx.core.view.ViewCompat
2929
import androidx.core.view.doOnLayout
3030
import androidx.core.view.isVisible
3131
import androidx.fragment.app.viewModels
32+
import androidx.lifecycle.createSavedStateHandle
3233
import androidx.lifecycle.flowWithLifecycle
3334
import androidx.lifecycle.lifecycleScope
35+
import androidx.lifecycle.viewmodel.initializer
36+
import androidx.lifecycle.viewmodel.viewModelFactory
3437
import com.google.android.material.slider.Slider
3538
import com.ichi2.anki.DispatchKeyEventListener
3639
import com.ichi2.anki.Flag
@@ -59,7 +62,13 @@ class PreviewerFragment :
5962
BaseSnackbarBuilderProvider,
6063
DispatchKeyEventListener,
6164
BindingProcessor<MappableBinding, PreviewerAction> {
62-
override val viewModel: PreviewerViewModel by viewModels { previewerViewModelFactory(requireContext().cacheDir) }
65+
override val viewModel: PreviewerViewModel by viewModels {
66+
viewModelFactory {
67+
initializer {
68+
PreviewerViewModel(requireContext().cacheDir, createSavedStateHandle())
69+
}
70+
}
71+
}
6372
private val binding by viewBinding(FragmentPreviewerBinding::bind)
6473
override val webViewLayout: SafeWebViewLayout get() = binding.webViewLayout
6574

AnkiDroid/src/main/java/com/ichi2/anki/previewer/PreviewerViewModelFactory.kt

Lines changed: 0 additions & 30 deletions
This file was deleted.

AnkiDroid/src/main/java/com/ichi2/anki/previewer/TemplatePreviewerFragment.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ import android.os.Bundle
1919
import android.view.View
2020
import androidx.core.os.bundleOf
2121
import androidx.fragment.app.viewModels
22+
import androidx.lifecycle.createSavedStateHandle
2223
import androidx.lifecycle.lifecycleScope
24+
import androidx.lifecycle.viewmodel.initializer
25+
import androidx.lifecycle.viewmodel.viewModelFactory
2326
import com.ichi2.anki.R
2427
import com.ichi2.anki.databinding.FragmentTemplatePreviewerBinding
2528
import com.ichi2.anki.libanki.CardOrdinal
@@ -32,7 +35,13 @@ import kotlinx.coroutines.flow.onEach
3235
class TemplatePreviewerFragment :
3336
CardViewerFragment(R.layout.fragment_template_previewer),
3437
BaseSnackbarBuilderProvider {
35-
override val viewModel: TemplatePreviewerViewModel by viewModels { templatePreviewerViewModelFactory(requireContext().cacheDir) }
38+
override val viewModel: TemplatePreviewerViewModel by viewModels {
39+
viewModelFactory {
40+
initializer {
41+
TemplatePreviewerViewModel(requireContext().cacheDir, createSavedStateHandle())
42+
}
43+
}
44+
}
3645

3746
lateinit var binding: FragmentTemplatePreviewerBinding
3847

AnkiDroid/src/main/java/com/ichi2/anki/previewer/TemplatePreviewerViewModelFactory.kt

Lines changed: 0 additions & 30 deletions
This file was deleted.

AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/ReviewerFragment.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,12 @@ import androidx.fragment.app.FragmentManager
4545
import androidx.fragment.app.commit
4646
import androidx.fragment.app.viewModels
4747
import androidx.lifecycle.Lifecycle
48+
import androidx.lifecycle.createSavedStateHandle
4849
import androidx.lifecycle.flowWithLifecycle
4950
import androidx.lifecycle.lifecycleScope
5051
import androidx.lifecycle.repeatOnLifecycle
52+
import androidx.lifecycle.viewmodel.initializer
53+
import androidx.lifecycle.viewmodel.viewModelFactory
5154
import anki.scheduler.CardAnswer.Rating
5255
import com.google.android.material.snackbar.Snackbar
5356
import com.ichi2.anki.CollectionManager
@@ -114,7 +117,13 @@ class ReviewerFragment :
114117
DispatchKeyEventListener,
115118
TagsDialogListener,
116119
ShakeDetector.Listener {
117-
override val viewModel: ReviewerViewModel by viewModels { reviewerViewModelFactory(requireContext().cacheDir) }
120+
override val viewModel: ReviewerViewModel by viewModels {
121+
viewModelFactory {
122+
initializer {
123+
ReviewerViewModel(requireContext().cacheDir, createSavedStateHandle())
124+
}
125+
}
126+
}
118127
private val binding by viewBinding(FragmentReviewerBinding::bind)
119128

120129
override val webViewLayout: SafeWebViewLayout get() = binding.webViewLayout

AnkiDroid/src/main/java/com/ichi2/anki/ui/windows/reviewer/ReviewerViewModelFactory.kt

Lines changed: 0 additions & 30 deletions
This file was deleted.

0 commit comments

Comments
 (0)