-
-
Notifications
You must be signed in to change notification settings - Fork 2.3k
/
DroidBackendFactory.kt
75 lines (69 loc) · 2.69 KB
/
DroidBackendFactory.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/*
* Copyright (c) 2020 David Allison <[email protected]>
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License as published by the Free Software
* Foundation; either version 3 of the License, or (at your option) any later
* version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.ichi2.libanki.backend
import androidx.annotation.VisibleForTesting
import com.ichi2.anki.AnkiDroidApp
import com.ichi2.anki.CrashReportService
import com.ichi2.libanki.Consts
import net.ankiweb.rsdroid.BackendFactory
import net.ankiweb.rsdroid.RustBackendFailedException
import net.ankiweb.rsdroid.RustCleanup
import timber.log.Timber
/** Responsible for selection of either the Rust or Java-based backend */
object DroidBackendFactory {
@JvmStatic
private var sBackendForTesting: DroidBackend? = null
/**
* Obtains an instance of a [DroidBackend].
* Each call to this method will generate a separate instance which can handle a new Anki collection
*/
@JvmStatic
@RustCleanup("Change back to a constant SYNC_VER")
fun getInstance(useBackend: Boolean): DroidBackend {
if (sBackendForTesting != null) {
return sBackendForTesting!!
}
var backendFactory: BackendFactory? = null
if (useBackend) {
try {
backendFactory = BackendFactory.createInstance()
} catch (e: RustBackendFailedException) {
Timber.w(e, "Rust backend failed to load - falling back to Java")
CrashReportService.sendExceptionReport(e, "DroidBackendFactory::getInstance")
}
}
val instance = getInstance(backendFactory)
// Update the Sync version if we can load the Rust
Consts.SYNC_VER = if (backendFactory == null) 9 else 10
return instance
}
@JvmStatic
private fun getInstance(backendFactory: BackendFactory?): DroidBackend {
if (backendFactory == null) {
return JavaDroidBackend()
}
return if (AnkiDroidApp.TESTING_USE_V16_BACKEND) {
RustDroidV16Backend(backendFactory)
} else {
RustDroidBackend(backendFactory)
}
}
@JvmStatic
@VisibleForTesting
fun setOverride(backend: DroidBackend?) {
sBackendForTesting = backend
}
}