From 16a5ce5ee37fcf04fb6f80860a5151c55ce4ad73 Mon Sep 17 00:00:00 2001 From: Arthur Milchior Date: Sun, 4 Sep 2022 02:22:55 +0200 Subject: [PATCH 1/2] NF: Simplify HashUtil * Move out of object. * transform as an expression * uses coerceAtLeast as suggested by IDE * Generalize some value it returns to Kotlin interface instead of specific kind of set/map --- .../com/ichi2/anki/AbstractFlashcardViewer.kt | 2 +- .../src/main/java/com/ichi2/anki/CardUtils.kt | 2 +- .../main/java/com/ichi2/anki/NoteEditor.kt | 8 +++--- .../dialogs/customstudy/CustomStudyDialog.kt | 6 ++--- .../anki/noteeditor/CustomToolbarButton.kt | 2 +- .../ichi2/anki/reviewer/ActionButtonStatus.kt | 2 +- .../anki/reviewer/ReviewerCustomFonts.kt | 2 +- .../servicelayer/PreferenceUpgradeService.kt | 2 +- .../main/java/com/ichi2/libanki/Collection.kt | 20 +++++++------- .../src/main/java/com/ichi2/libanki/Decks.kt | 8 +++--- .../src/main/java/com/ichi2/libanki/Finder.kt | 2 +- .../src/main/java/com/ichi2/libanki/Media.kt | 2 +- .../src/main/java/com/ichi2/libanki/Model.kt | 4 +-- .../src/main/java/com/ichi2/libanki/Models.kt | 6 ++--- .../src/main/java/com/ichi2/libanki/Utils.kt | 4 +-- .../ichi2/libanki/importer/Anki2Importer.kt | 15 ++++++----- .../libanki/importer/AnkiPackageImporter.kt | 2 +- .../java/com/ichi2/libanki/sched/Sched.kt | 7 ++++- .../java/com/ichi2/libanki/sched/SchedV2.kt | 7 ++--- .../ichi2/libanki/stats/AdvancedStatistics.kt | 2 +- .../java/com/ichi2/libanki/sync/FullSyncer.kt | 4 +-- .../java/com/ichi2/libanki/sync/HttpSyncer.kt | 2 +- .../ichi2/libanki/sync/RemoteMediaServer.kt | 2 +- .../com/ichi2/libanki/sync/RemoteServer.kt | 2 +- .../java/com/ichi2/libanki/sync/Syncer.kt | 2 +- .../main/java/com/ichi2/themes/HtmlColors.kt | 2 +- .../ichi2/ui/AppCompatPreferenceActivity.kt | 4 +-- .../src/main/java/com/ichi2/utils/HashUtil.kt | 26 +++++-------------- .../android/parsing/TopLevelParser.kt | 2 +- .../PreferenceUpgradeServiceTest.kt | 6 ++--- 30 files changed, 77 insertions(+), 80 deletions(-) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/AbstractFlashcardViewer.kt b/AnkiDroid/src/main/java/com/ichi2/anki/AbstractFlashcardViewer.kt index 7c922a432077..569a9775a4db 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/AbstractFlashcardViewer.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/AbstractFlashcardViewer.kt @@ -99,7 +99,7 @@ import com.ichi2.utils.ClipboardUtil.getText import com.ichi2.utils.Computation import com.ichi2.utils.HandlerUtils.executeFunctionWithDelay import com.ichi2.utils.HandlerUtils.newHandler -import com.ichi2.utils.HashUtil.HashSetInit +import com.ichi2.utils.HashSetInit import com.ichi2.utils.KotlinCleanup import com.ichi2.utils.WebViewDebugging.initializeDebugging import com.ichi2.utils.iconAttr diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/CardUtils.kt b/AnkiDroid/src/main/java/com/ichi2/anki/CardUtils.kt index 68411f856e01..4398203f45d3 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/CardUtils.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/CardUtils.kt @@ -4,7 +4,7 @@ package com.ichi2.anki import com.ichi2.anki.servicelayer.NoteService.isMarked import com.ichi2.libanki.Card import com.ichi2.libanki.Note -import com.ichi2.utils.HashUtil.HashSetInit +import com.ichi2.utils.HashSetInit import java.util.* /** diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/NoteEditor.kt b/AnkiDroid/src/main/java/com/ichi2/anki/NoteEditor.kt index 869617c92c03..91a7daa17a97 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/NoteEditor.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/NoteEditor.kt @@ -142,7 +142,7 @@ class NoteEditor : AnkiActivity(), DeckSelectionListener, SubtitleListener, Tags private var mAllModelIds: ArrayList? = null @KotlinCleanup("this ideally should be Int, Int?") private var mModelChangeFieldMap: MutableMap? = null - private var mModelChangeCardMap: HashMap? = null + private var mModelChangeCardMap: MutableMap? = null private val mCustomViewIds = ArrayList() /* indicates if a new note is added or a card is edited */ @@ -1735,7 +1735,7 @@ class NoteEditor : AnkiActivity(), DeckSelectionListener, SubtitleListener, Tags private val toolbarButtons: ArrayList get() { val set = AnkiDroidApp.getSharedPrefs(this) - .getStringSet(PREF_NOTE_EDITOR_CUSTOM_BUTTONS, HashUtil.HashSetInit(0)) + .getStringSet(PREF_NOTE_EDITOR_CUSTOM_BUTTONS, HashSetInit(0)) return CustomToolbarButton.fromStringSet(set!!) } @@ -1989,13 +1989,13 @@ class NoteEditor : AnkiActivity(), DeckSelectionListener, SubtitleListener, Tags } // Initialize mapping between fields of old model -> new model val itemsLength = mEditorNote!!.items().size - mModelChangeFieldMap = HashUtil.HashMapInit(itemsLength) + mModelChangeFieldMap = HashMapInit(itemsLength) for (i in 0 until itemsLength) { mModelChangeFieldMap!![i] = i } // Initialize mapping between cards new model -> old model val templatesLength = tmpls.length() - mModelChangeCardMap = HashUtil.HashMapInit(templatesLength) + mModelChangeCardMap = HashMapInit(templatesLength) for (i in 0 until templatesLength) { if (i < mEditorNote!!.numberOfCards()) { mModelChangeCardMap!![i] = i diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/customstudy/CustomStudyDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/customstudy/CustomStudyDialog.kt index e96d1a36fbdc..101e80450813 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/customstudy/CustomStudyDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/customstudy/CustomStudyDialog.kt @@ -51,7 +51,7 @@ import com.ichi2.libanki.Consts.DYN_PRIORITY import com.ichi2.libanki.Deck import com.ichi2.libanki.DeckId import com.ichi2.libanki.backend.exception.DeckRenameException -import com.ichi2.utils.HashUtil.HashMapInit +import com.ichi2.utils.HashMapInit import com.ichi2.utils.JSONArray import com.ichi2.utils.JSONObject import com.ichi2.utils.KotlinCleanup @@ -157,7 +157,7 @@ class CustomStudyDialog(private val collection: Collection, private val customSt } @KotlinCleanup("make this use enum instead of Int") - fun getValuesFromKeys(map: HashMap, keys: IntArray): Array { + fun getValuesFromKeys(map: Map, keys: IntArray): Array { val values = arrayOfNulls(keys.size) for (i in keys.indices) { values[i] = map[keys[i]] @@ -292,7 +292,7 @@ class CustomStudyDialog(private val collection: Collection, private val customSt return dialog } - private val keyValueMap: HashMap + private val keyValueMap: Map get() { val res = resources val keyValueMap = HashMapInit(10) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/CustomToolbarButton.kt b/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/CustomToolbarButton.kt index dc302b97ada0..0654ad05a9fc 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/CustomToolbarButton.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/CustomToolbarButton.kt @@ -18,7 +18,7 @@ package com.ichi2.anki.noteeditor import android.text.TextUtils import com.ichi2.anki.noteeditor.Toolbar.TextWrapper import com.ichi2.libanki.Consts -import com.ichi2.utils.HashUtil.HashSetInit +import com.ichi2.utils.HashSetInit import timber.log.Timber import java.util.* diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/ActionButtonStatus.kt b/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/ActionButtonStatus.kt index ef341b7142a6..5d7c94085a29 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/ActionButtonStatus.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/ActionButtonStatus.kt @@ -22,7 +22,7 @@ import android.view.MenuItem import androidx.annotation.IdRes import com.ichi2.anki.R import com.ichi2.themes.Themes -import com.ichi2.utils.HashUtil.HashMapInit +import com.ichi2.utils.HashMapInit import timber.log.Timber // loads of unboxing issues, which are safe diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/ReviewerCustomFonts.kt b/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/ReviewerCustomFonts.kt index 99a895c67979..6c5484f70b89 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/ReviewerCustomFonts.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/ReviewerCustomFonts.kt @@ -21,7 +21,7 @@ import android.text.TextUtils import com.ichi2.anki.AnkiDroidApp import com.ichi2.anki.AnkiFont import com.ichi2.libanki.Utils -import com.ichi2.utils.HashUtil.HashMapInit +import com.ichi2.utils.HashMapInit class ReviewerCustomFonts(context: Context) { private val mCustomStyle: String diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/servicelayer/PreferenceUpgradeService.kt b/AnkiDroid/src/main/java/com/ichi2/anki/servicelayer/PreferenceUpgradeService.kt index ade9206b6ecc..e926bf97ddd8 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/servicelayer/PreferenceUpgradeService.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/servicelayer/PreferenceUpgradeService.kt @@ -33,7 +33,7 @@ import com.ichi2.anki.reviewer.MappableBinding import com.ichi2.anki.web.CustomSyncServer import com.ichi2.libanki.Consts import com.ichi2.themes.Themes -import com.ichi2.utils.HashUtil.HashSetInit +import com.ichi2.utils.HashSetInit import timber.log.Timber private typealias VersionIdentifier = Int diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/Collection.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/Collection.kt index 93e44a2b3750..a2438dd9bb74 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/Collection.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/Collection.kt @@ -57,6 +57,8 @@ import com.ichi2.libanki.utils.Time import com.ichi2.libanki.utils.TimeManager import com.ichi2.upgrade.Upgrade import com.ichi2.utils.* +import com.ichi2.utils.HashMapInit +import com.ichi2.utils.HashSetInit import net.ankiweb.rsdroid.Backend import net.ankiweb.rsdroid.RustCleanup import org.jetbrains.annotations.Contract @@ -768,11 +770,11 @@ open class Collection( ): ArrayList? where T : ProgressSender?, T : CancelListener? { val nbCount = noteCount() // For each note, indicates ords of cards it contains - val have = HashUtil.HashMapInit>(nbCount) + val have = HashMapInit>(nbCount) // For each note, the deck containing all of its cards, or 0 if siblings in multiple deck - val dids = HashUtil.HashMapInit(nbCount) + val dids = HashMapInit(nbCount) // For each note, an arbitrary due of one of its due card processed, if any exists - val dues = HashUtil.HashMapInit(nbCount) + val dues = HashMapInit(nbCount) var nodes: List? = null if (model.getInt("type") != Consts.MODEL_CLOZE) { nodes = model.parsedNodes() @@ -1078,7 +1080,7 @@ open class Collection( tags: String, flist: Array, flags: Int - ): HashMap { + ): Map { return _renderQA(cid, model, did, ord, tags, flist, flags, false, null, null) } @@ -1094,14 +1096,14 @@ open class Collection( browser: Boolean, qfmtParam: String?, afmtParam: String? - ): HashMap { + ): Map { // data is [cid, nid, mid, did, ord, tags, flds, cardFlags] // unpack fields and create dict var qfmt = qfmtParam var afmt = afmtParam val fmap = Models.fieldMap(model) val maps: Set>> = fmap.entries - val fields: MutableMap = HashUtil.HashMapInit(maps.size + 8) + val fields: MutableMap = HashMapInit(maps.size + 8) for ((key, value) in maps) { fields[key] = flist[value.first] } @@ -1120,7 +1122,7 @@ open class Collection( fields["Card"] = template.getString("name") fields[String.format(Locale.US, "c%d", cardNum)] = "1" // render q & a - val d = HashUtil.HashMapInit(2) + val d = HashMapInit(2) d["id"] = cid.toString() qfmt = if (qfmt.isNullOrEmpty()) template.getString("qfmt") else qfmt afmt = if (afmt.isNullOrEmpty()) template.getString("afmt") else afmt @@ -1390,7 +1392,7 @@ open class Collection( } else { c.did } - val qa: HashMap = if (browser) { + val qa: Map = if (browser) { val bqfmt = t.getString("bqfmt") val bafmt = t.getString("bafmt") _renderQA( @@ -1694,7 +1696,7 @@ open class Collection( // obtain a list of all valid dconf IDs val allConf = decks.allConf() - val configIds = HashUtil.HashSetInit(allConf.size) + val configIds = HashSetInit(allConf.size) for (conf in allConf) { configIds.add(conf.getLong("id")) } diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/Decks.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/Decks.kt index 1147277fa152..16d98f5c9115 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/Decks.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/Decks.kt @@ -32,7 +32,7 @@ import com.ichi2.libanki.backend.exception.DeckRenameException import com.ichi2.libanki.utils.TimeManager.time import com.ichi2.utils.* import com.ichi2.utils.CollectionUtils.addAll -import com.ichi2.utils.HashUtil.HashMapInit +import com.ichi2.utils.HashMapInit import net.ankiweb.rsdroid.RustCleanup import org.intellij.lang.annotations.Language import timber.log.Timber @@ -51,9 +51,9 @@ class Decks(private val col: Collection) : DeckManager() { @get:RustCleanup("This exists in Rust as DecksDictProxy, but its usage is warned against") @KotlinCleanup("lateinit") @get:VisibleForTesting - var decks: HashMap? = null + var decks: MutableMap? = null private set - private var mDconf: HashMap? = null + private var mDconf: MutableMap? = null // Never access mNameMap directly. Uses byName @KotlinCleanup("lateinit (it's set in load)") @@ -66,7 +66,7 @@ class Decks(private val col: Collection) : DeckManager() { */ @KotlinCleanup("nullability") private class NameMap private constructor(size: Int) { - private val mNameMap: HashMap + private val mNameMap: MutableMap /** * @param name A name of deck to get diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/Finder.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/Finder.kt index 9bed9e74b04b..20e75e69ea35 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/Finder.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/Finder.kt @@ -25,7 +25,7 @@ import androidx.annotation.CheckResult import com.ichi2.libanki.SortOrder.* import com.ichi2.libanki.stats.Stats import com.ichi2.libanki.utils.TimeManager.time -import com.ichi2.utils.HashUtil.HashMapInit +import com.ichi2.utils.HashMapInit import com.ichi2.utils.JSONObject import com.ichi2.utils.KotlinCleanup import net.ankiweb.rsdroid.RustCleanup diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/Media.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/Media.kt index 17108676eb2f..dee3268d97a1 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/Media.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/Media.kt @@ -25,7 +25,7 @@ import com.ichi2.anki.CrashReportService import com.ichi2.libanki.exception.EmptyMediaException import com.ichi2.libanki.template.TemplateFilters import com.ichi2.utils.* -import com.ichi2.utils.HashUtil.HashMapInit +import com.ichi2.utils.HashMapInit import timber.log.Timber import java.io.* import java.util.* diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/Model.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/Model.kt index 99b2e240f9f8..01dde9e1b94d 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/Model.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/Model.kt @@ -20,7 +20,7 @@ import android.text.TextUtils import androidx.annotation.CheckResult import com.ichi2.libanki.template.ParsedNode import com.ichi2.libanki.template.TemplateError -import com.ichi2.utils.HashUtil +import com.ichi2.utils.HashSetInit import com.ichi2.utils.JSONObject import com.ichi2.utils.KotlinCleanup import timber.log.Timber @@ -89,7 +89,7 @@ class Model : JSONObject { @KotlinCleanup("filter") fun nonEmptyFields(sfld: Array): Set { val fieldNames = fieldsNames - val nonemptyFields: MutableSet = HashUtil.HashSetInit(sfld.size) + val nonemptyFields: MutableSet = HashSetInit(sfld.size) for (i in sfld.indices) { if (!TextUtils.isEmpty(sfld[i].trim { it <= ' ' })) { nonemptyFields.add(fieldNames[i]) diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/Models.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/Models.kt index 7809e47f0ea4..42efddf015eb 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/Models.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/Models.kt @@ -25,7 +25,7 @@ import com.ichi2.anki.exception.ConfirmModSchemaException import com.ichi2.libanki.template.ParsedNode import com.ichi2.libanki.template.TemplateError import com.ichi2.libanki.utils.TimeManager.time -import com.ichi2.utils.HashUtil.HashMapInit +import com.ichi2.utils.HashMapInit import com.ichi2.utils.JSONArray import com.ichi2.utils.JSONObject import com.ichi2.utils.KotlinCleanup @@ -791,9 +791,9 @@ class Models(col: Collection) : ModelManager(col) { mChanged = true } - val templateNames: HashMap> + val templateNames: Map> get() { - val result = HashMapInit>( + val result = HashMapInit>( mModels!!.size ) for (m in mModels!!.values) { diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/Utils.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/Utils.kt index 9ac57a414f10..84805bb2c3b4 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/Utils.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/Utils.kt @@ -35,8 +35,8 @@ import com.ichi2.anki.CollectionHelper import com.ichi2.anki.R import com.ichi2.compat.CompatHelper.Companion.compat import com.ichi2.libanki.Consts.FIELD_SEPARATOR -import com.ichi2.utils.HashUtil.HashMapInit -import com.ichi2.utils.HashUtil.HashSetInit +import com.ichi2.utils.HashMapInit +import com.ichi2.utils.HashSetInit import com.ichi2.utils.ImportUtils.isValidPackageName import com.ichi2.utils.JSONArray import com.ichi2.utils.JSONException diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/importer/Anki2Importer.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/importer/Anki2Importer.kt index 6572d7fd6bc8..d1b03a5681ae 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/importer/Anki2Importer.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/importer/Anki2Importer.kt @@ -34,7 +34,8 @@ import com.ichi2.libanki.Consts.QUEUE_TYPE_NEW import com.ichi2.libanki.Consts.QUEUE_TYPE_REV import com.ichi2.libanki.Storage.collection import com.ichi2.libanki.utils.TimeManager -import com.ichi2.utils.HashUtil +import com.ichi2.utils.HashMapInit +import com.ichi2.utils.HashSetInit import com.ichi2.utils.KotlinCleanup import timber.log.Timber import java.io.BufferedInputStream @@ -100,7 +101,7 @@ open class Anki2Importer(col: Collection?, file: String) : Importer(col!!, file) } private fun _import() { - mDecks = HashUtil.HashMapInit(src.decks.count()) + mDecks = HashMapInit(src.decks.count()) try { // Use transactions for performance and rollbacks in case of error dst.db.database.beginTransaction() @@ -170,8 +171,8 @@ open class Anki2Importer(col: Collection?, file: String) : Importer(col!!, file) private fun _importNotes() { val noteCount = dst.noteCount() // build guid -> (id,mod,mid) hash & map of existing note ids - mNotes = HashUtil.HashMapInit(noteCount) - val existing: MutableSet = HashUtil.HashSetInit(noteCount) + mNotes = HashMapInit(noteCount) + val existing: MutableSet = HashSetInit(noteCount) dst.db.query("select id, guid, mod, mid from notes").use { cur -> while (cur.moveToNext()) { val id = cur.getLong(0) @@ -367,7 +368,7 @@ open class Anki2Importer(col: Collection?, file: String) : Importer(col!!, file) */ /** Prepare index of schema hashes. */ private fun _prepareModels() { - mModelMap = HashUtil.HashMapInit(src.models.count()) + mModelMap = HashMapInit(src.models.count()) } /** Return local id for remote MID. */ @@ -486,8 +487,8 @@ open class Anki2Importer(col: Collection?, file: String) : Importer(col!!, file) * Java: guid -> ord -> cid */ val nbCard = dst.cardCount() - val cardsByGuid: MutableMap> = HashUtil.HashMapInit(nbCard) - val existing: MutableSet = HashUtil.HashSetInit(nbCard) + val cardsByGuid: MutableMap> = HashMapInit(nbCard) + val existing: MutableSet = HashSetInit(nbCard) dst.db.query( "select f.guid, c.ord, c.id from cards c, notes f " + "where c.nid = f.id" diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/importer/AnkiPackageImporter.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/importer/AnkiPackageImporter.kt index 257879a702a2..e895ec717963 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/importer/AnkiPackageImporter.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/importer/AnkiPackageImporter.kt @@ -27,7 +27,7 @@ import com.ichi2.anki.exception.ImportExportException import com.ichi2.libanki.Collection import com.ichi2.libanki.Storage import com.ichi2.libanki.Utils -import com.ichi2.utils.HashUtil.HashMapInit +import com.ichi2.utils.HashMapInit import com.ichi2.utils.KotlinCleanup import org.apache.commons.compress.archivers.zip.ZipFile import timber.log.Timber diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/sched/Sched.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/sched/Sched.kt index b7dcd170acf7..37f5ad5edf46 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/sched/Sched.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/sched/Sched.kt @@ -34,6 +34,11 @@ import com.ichi2.libanki.sched.Counts.Queue import com.ichi2.libanki.sched.Counts.Queue.* import com.ichi2.libanki.stats.Stats.Companion.SECONDS_PER_DAY import com.ichi2.utils.* +import com.ichi2.utils.Assert.that +import com.ichi2.utils.HashMapInit +import com.ichi2.utils.JSONException +import com.ichi2.utils.JSONObject +import com.ichi2.utils.KotlinCleanup import com.ichi2.utils.SyncStatus.Companion.ignoreDatabaseModification import timber.log.Timber import java.util.* @@ -154,7 +159,7 @@ class Sched(col: Collection) : SchedV2(col) { col.decks.checkIntegrity() val allDecksSorted = col.decks.allSorted() @KotlinCleanup("input should be non-null") - val lims = HashUtil.HashMapInit>(allDecksSorted.size) + val lims = HashMapInit>(allDecksSorted.size) val deckNodes = ArrayList(allDecksSorted.size) for (deck in allDecksSorted) { if (isCancelled(collectionTask)) { diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/sched/SchedV2.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/sched/SchedV2.kt index 0026fe259a79..0f568b260f87 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/sched/SchedV2.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/sched/SchedV2.kt @@ -43,6 +43,7 @@ import com.ichi2.libanki.stats.Stats import com.ichi2.libanki.utils.Time import com.ichi2.libanki.utils.TimeManager import com.ichi2.utils.* +import com.ichi2.utils.HashMapInit import net.ankiweb.rsdroid.BackendFactory import net.ankiweb.rsdroid.RustCleanup import timber.log.Timber @@ -400,7 +401,7 @@ open class SchedV2(col: Collection) : AbstractSched(col) { cancelListener: CancelListener? = null ): Int { var tot = 0 - val pcounts = HashUtil.HashMapInit(col.decks.count()) + val pcounts = HashMapInit(col.decks.count()) // for each of the active decks for (did in col.decks.active()) { if (isCancelled(cancelListener)) return -1 @@ -453,7 +454,7 @@ open class SchedV2(col: Collection) : AbstractSched(col) { _checkDay() col.decks.checkIntegrity() val allDecksSorted = col.decks.allSorted() - val lims = HashUtil.HashMapInit>(allDecksSorted.size) + val lims = HashMapInit>(allDecksSorted.size) val deckNodes = ArrayList(allDecksSorted.size) val childMap = col.decks.childMap() for (deck in allDecksSorted) { @@ -2382,7 +2383,7 @@ end) """ return } // determine nid ordering - val due = HashUtil.HashMapInit(nids.size) + val due = HashMapInit(nids.size) if (shuffle) { Collections.shuffle(nids) } diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/stats/AdvancedStatistics.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/stats/AdvancedStatistics.kt index 9de017cdbc09..60aa33e10eb3 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/stats/AdvancedStatistics.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/stats/AdvancedStatistics.kt @@ -29,7 +29,7 @@ import com.ichi2.libanki.DeckManager import com.ichi2.libanki.stats.Stats.AxisType import com.ichi2.libanki.utils.Time import com.ichi2.libanki.utils.TimeManager.time -import com.ichi2.utils.HashUtil.HashMapInit +import com.ichi2.utils.HashMapInit import timber.log.Timber import java.util.* diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/sync/FullSyncer.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/sync/FullSyncer.kt index c06b4979ef49..ee7882d8448f 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/sync/FullSyncer.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/sync/FullSyncer.kt @@ -30,7 +30,7 @@ import com.ichi2.libanki.sync.Syncer.ConnectionResultType import com.ichi2.libanki.sync.Syncer.ConnectionResultType.ARBITRARY_STRING import com.ichi2.libanki.sync.Syncer.ConnectionResultType.OVERWRITE_ERROR import com.ichi2.libanki.sync.Syncer.ConnectionResultType.SUCCESS -import com.ichi2.utils.HashUtil +import com.ichi2.utils.HashMapInit import com.ichi2.utils.KotlinCleanup import com.ichi2.utils.VersionUtils.pkgVersionName import okhttp3.Response @@ -49,7 +49,7 @@ class FullSyncer(col: Collection?, hkey: String?, con: Connection, hostNum: Host private val mCon: Connection init { - postVars = HashUtil.HashMapInit(2) + postVars = HashMapInit(2) postVars["k"] = hkey postVars["v"] = String.format(Locale.US, "ankidroid,%s,%s", pkgVersionName, Utils.platDesc()) @KotlinCleanup("move to constructor") diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/sync/HttpSyncer.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/sync/HttpSyncer.kt index 00c036a6d62b..ef3dbdf687e7 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/sync/HttpSyncer.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/sync/HttpSyncer.kt @@ -27,7 +27,7 @@ import com.ichi2.anki.web.CustomSyncServer import com.ichi2.anki.web.HttpFetcher import com.ichi2.async.Connection import com.ichi2.libanki.Utils -import com.ichi2.utils.HashUtil.HashMapInit +import com.ichi2.utils.HashMapInit import com.ichi2.utils.KotlinCleanup import okhttp3.HttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/sync/RemoteMediaServer.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/sync/RemoteMediaServer.kt index a0695a168838..aeba640a0074 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/sync/RemoteMediaServer.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/sync/RemoteMediaServer.kt @@ -23,7 +23,7 @@ import com.ichi2.anki.web.CustomSyncServer import com.ichi2.async.Connection import com.ichi2.libanki.Collection import com.ichi2.libanki.Utils -import com.ichi2.utils.HashUtil.HashMapInit +import com.ichi2.utils.HashMapInit import com.ichi2.utils.JSONArray import com.ichi2.utils.JSONObject import com.ichi2.utils.VersionUtils.pkgVersionName diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/sync/RemoteServer.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/sync/RemoteServer.kt index c9f85076ab80..9714d15e5aa7 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/sync/RemoteServer.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/sync/RemoteServer.kt @@ -21,7 +21,7 @@ import com.ichi2.anki.exception.UnknownHttpResponseException import com.ichi2.async.Connection import com.ichi2.libanki.Consts import com.ichi2.libanki.Utils -import com.ichi2.utils.HashUtil.HashMapInit +import com.ichi2.utils.HashMapInit import com.ichi2.utils.JSONException import com.ichi2.utils.JSONObject import com.ichi2.utils.VersionUtils.pkgVersionName diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/sync/Syncer.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/sync/Syncer.kt index ecbb3dd8e9a0..61cf566968b8 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/sync/Syncer.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/sync/Syncer.kt @@ -32,7 +32,7 @@ import com.ichi2.libanki.Collection import com.ichi2.libanki.sched.AbstractDeckTreeNode import com.ichi2.libanki.sync.Syncer.ConnectionResultType.* import com.ichi2.libanki.utils.TimeManager.time -import com.ichi2.utils.HashUtil.HashMapInit +import com.ichi2.utils.HashMapInit import com.ichi2.utils.JSONArray import com.ichi2.utils.JSONException import com.ichi2.utils.JSONObject diff --git a/AnkiDroid/src/main/java/com/ichi2/themes/HtmlColors.kt b/AnkiDroid/src/main/java/com/ichi2/themes/HtmlColors.kt index 89a728532814..eae3cbefe6a1 100644 --- a/AnkiDroid/src/main/java/com/ichi2/themes/HtmlColors.kt +++ b/AnkiDroid/src/main/java/com/ichi2/themes/HtmlColors.kt @@ -16,7 +16,7 @@ package com.ichi2.themes -import com.ichi2.utils.HashUtil.HashMapInit +import com.ichi2.utils.HashMapInit import com.ichi2.utils.KotlinCleanup import timber.log.Timber import java.util.* diff --git a/AnkiDroid/src/main/java/com/ichi2/ui/AppCompatPreferenceActivity.kt b/AnkiDroid/src/main/java/com/ichi2/ui/AppCompatPreferenceActivity.kt index 5a5d09f63530..3dd91b9b4adf 100644 --- a/AnkiDroid/src/main/java/com/ichi2/ui/AppCompatPreferenceActivity.kt +++ b/AnkiDroid/src/main/java/com/ichi2/ui/AppCompatPreferenceActivity.kt @@ -31,7 +31,7 @@ import com.ichi2.anki.AnkiDroidApp import com.ichi2.anki.CollectionHelper import com.ichi2.anki.receiver.SdCardReceiver import com.ichi2.libanki.Collection -import com.ichi2.utils.HashUtil +import com.ichi2.utils.HashMapInit import com.ichi2.utils.KotlinCleanup import timber.log.Timber import java.util.* @@ -56,7 +56,7 @@ abstract class AppCompatPreferenceActivity = HashUtil.HashMapInit(30) // At most as many as in cacheValues + val mValues: MutableMap = HashMapInit(30) // At most as many as in cacheValues val mSummaries: MutableMap = HashMap() protected val listeners: MutableList = LinkedList() diff --git a/AnkiDroid/src/main/java/com/ichi2/utils/HashUtil.kt b/AnkiDroid/src/main/java/com/ichi2/utils/HashUtil.kt index 7bacc9475529..db1a99133b25 100644 --- a/AnkiDroid/src/main/java/com/ichi2/utils/HashUtil.kt +++ b/AnkiDroid/src/main/java/com/ichi2/utils/HashUtil.kt @@ -15,24 +15,12 @@ ****************************************************************************************/ package com.ichi2.utils -import java.util.HashMap -import java.util.HashSet +/** + * @param size Number of elements expected in the hash structure + * @return Initial capacity for the hash structure. Copied from HashMap code + */ +private fun capacity(size: Int) = ((size / .75f).toInt() + 1).coerceAtLeast(16) -object HashUtil { - /** - * @param size Number of elements expected in the hash structure - * @return Initial capacity for the hash structure. Copied from HashMap code - */ - private fun capacity(size: Int): Int { - return Math.max((size / .75f).toInt() + 1, 16) - } +fun HashSetInit(size: Int) = HashSet(capacity(size)) - fun HashSetInit(size: Int): HashSet { - return HashSet(capacity(size)) - } - - @KotlinCleanup("return mutableMap") - fun HashMapInit(size: Int): HashMap { - return HashMap(capacity(size)) - } -} +fun HashMapInit(size: Int) = HashMap(capacity(size)) diff --git a/AnkiDroid/src/main/java/com/wildplot/android/parsing/TopLevelParser.kt b/AnkiDroid/src/main/java/com/wildplot/android/parsing/TopLevelParser.kt index 62a319f15044..a5afa3e4f9af 100644 --- a/AnkiDroid/src/main/java/com/wildplot/android/parsing/TopLevelParser.kt +++ b/AnkiDroid/src/main/java/com/wildplot/android/parsing/TopLevelParser.kt @@ -15,7 +15,7 @@ ****************************************************************************************/ package com.wildplot.android.parsing -import com.ichi2.utils.HashUtil.HashMapInit +import com.ichi2.utils.HashMapInit import com.wildplot.android.rendering.interfaces.Function2D import com.wildplot.android.rendering.interfaces.Function3D import java.util.regex.Pattern diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/servicemodel/PreferenceUpgradeServiceTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/servicemodel/PreferenceUpgradeServiceTest.kt index 97b928a163ef..6514be76b36a 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/servicemodel/PreferenceUpgradeServiceTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/servicemodel/PreferenceUpgradeServiceTest.kt @@ -29,7 +29,7 @@ import com.ichi2.anki.servicelayer.RemovedPreferences import com.ichi2.anki.web.CustomSyncServer import com.ichi2.libanki.Consts import com.ichi2.testutils.EmptyApplication -import com.ichi2.utils.HashUtil +import com.ichi2.utils.HashSetInit import org.hamcrest.CoreMatchers.equalTo import org.hamcrest.MatcherAssert.assertThat import org.hamcrest.Matchers.lessThan @@ -122,7 +122,7 @@ class PreferenceUpgradeServiceTest : RobolectricTest() { @Test fun note_editor_toolbar_button_text() { // add two example toolbar buttons - val buttons = HashUtil.HashSetInit(2) + val buttons = HashSetInit(2) var values = arrayOf(0, "

", "

") buttons.add(TextUtils.join(Consts.FIELD_SEPARATOR, values)) @@ -137,7 +137,7 @@ class PreferenceUpgradeServiceTest : RobolectricTest() { // now update it and check it PreferenceUpgrade.UpdateNoteEditorToolbarPrefs().performUpgrade(mPrefs) - val set = mPrefs.getStringSet("note_editor_custom_buttons", HashUtil.HashSetInit(0)) as Set + val set = mPrefs.getStringSet("note_editor_custom_buttons", HashSetInit(0)) as Set val toolbarButtons = CustomToolbarButton.fromStringSet(set) assertEquals("Set size", 2, set.size) From 1ea8e244c74b5b97686e5a05bc807d1838c6f825 Mon Sep 17 00:00:00 2001 From: Arthur Milchior Date: Sun, 4 Sep 2022 04:02:43 +0200 Subject: [PATCH 2/2] NF: remove HashUtil when possible The function generate set and map from collections already deals with doing proper size allocation. --- .../src/main/java/com/ichi2/anki/CardUtils.kt | 9 +----- .../main/java/com/ichi2/anki/NoteEditor.kt | 2 +- .../dialogs/customstudy/CustomStudyDialog.kt | 25 +++++++-------- .../anki/noteeditor/CustomToolbarButton.kt | 14 ++------ .../anki/reviewer/ReviewerCustomFonts.kt | 18 +++-------- .../servicelayer/PreferenceUpgradeService.kt | 3 +- .../main/java/com/ichi2/libanki/Collection.kt | 12 ++----- .../src/main/java/com/ichi2/libanki/Decks.kt | 21 ++++-------- .../src/main/java/com/ichi2/libanki/Finder.kt | 16 +++------- .../src/main/java/com/ichi2/libanki/Model.kt | 9 +----- .../src/main/java/com/ichi2/libanki/Models.kt | 32 +++---------------- .../src/main/java/com/ichi2/libanki/Utils.kt | 17 ++-------- .../libanki/importer/AnkiPackageImporter.kt | 4 +-- .../java/com/ichi2/libanki/sched/SchedV2.kt | 5 +-- .../java/com/ichi2/libanki/sync/FullSyncer.kt | 8 ++--- .../java/com/ichi2/libanki/sync/HttpSyncer.kt | 3 +- .../ichi2/libanki/sync/RemoteMediaServer.kt | 11 +++---- .../com/ichi2/libanki/sync/RemoteServer.kt | 10 +++--- .../android/parsing/TopLevelParser.kt | 12 +++---- .../PreferenceUpgradeServiceTest.kt | 14 +++----- 20 files changed, 69 insertions(+), 176 deletions(-) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/CardUtils.kt b/AnkiDroid/src/main/java/com/ichi2/anki/CardUtils.kt index 4398203f45d3..924fb929d7d0 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/CardUtils.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/CardUtils.kt @@ -4,7 +4,6 @@ package com.ichi2.anki import com.ichi2.anki.servicelayer.NoteService.isMarked import com.ichi2.libanki.Card import com.ichi2.libanki.Note -import com.ichi2.utils.HashSetInit import java.util.* /** @@ -14,13 +13,7 @@ object CardUtils { /** * @return List of corresponding notes without duplicates, even if the input list has multiple cards of the same note. */ - fun getNotes(cards: Collection): Set { - val notes: MutableSet = HashSetInit(cards.size) - for (card in cards) { - notes.add(card.note()) - } - return notes - } + fun getNotes(cards: Collection) = cards.map { it.note() }.toSet() /** * @return All cards of all notes diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/NoteEditor.kt b/AnkiDroid/src/main/java/com/ichi2/anki/NoteEditor.kt index 91a7daa17a97..39c334bbdb88 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/NoteEditor.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/NoteEditor.kt @@ -1735,7 +1735,7 @@ class NoteEditor : AnkiActivity(), DeckSelectionListener, SubtitleListener, Tags private val toolbarButtons: ArrayList get() { val set = AnkiDroidApp.getSharedPrefs(this) - .getStringSet(PREF_NOTE_EDITOR_CUSTOM_BUTTONS, HashSetInit(0)) + .getStringSet(PREF_NOTE_EDITOR_CUSTOM_BUTTONS, setOf()) return CustomToolbarButton.fromStringSet(set!!) } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/customstudy/CustomStudyDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/customstudy/CustomStudyDialog.kt index 101e80450813..d5a5b28ebccd 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/customstudy/CustomStudyDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/customstudy/CustomStudyDialog.kt @@ -51,7 +51,6 @@ import com.ichi2.libanki.Consts.DYN_PRIORITY import com.ichi2.libanki.Deck import com.ichi2.libanki.DeckId import com.ichi2.libanki.backend.exception.DeckRenameException -import com.ichi2.utils.HashMapInit import com.ichi2.utils.JSONArray import com.ichi2.utils.JSONObject import com.ichi2.utils.KotlinCleanup @@ -295,18 +294,18 @@ class CustomStudyDialog(private val collection: Collection, private val customSt private val keyValueMap: Map get() { val res = resources - val keyValueMap = HashMapInit(10) - keyValueMap[STANDARD.value] = res.getString(R.string.custom_study) - keyValueMap[STUDY_NEW.value] = res.getString(R.string.custom_study_increase_new_limit) - keyValueMap[STUDY_REV.value] = res.getString(R.string.custom_study_increase_review_limit) - keyValueMap[STUDY_FORGOT.value] = res.getString(R.string.custom_study_review_forgotten) - keyValueMap[STUDY_AHEAD.value] = res.getString(R.string.custom_study_review_ahead) - keyValueMap[STUDY_RANDOM.value] = res.getString(R.string.custom_study_random_selection) - keyValueMap[STUDY_PREVIEW.value] = res.getString(R.string.custom_study_preview_new) - keyValueMap[STUDY_TAGS.value] = res.getString(R.string.custom_study_limit_tags) - keyValueMap[DECK_OPTIONS.value] = res.getString(R.string.menu__deck_options) - keyValueMap[MORE_OPTIONS.value] = res.getString(R.string.more_options) - return keyValueMap + return mapOf( + STANDARD.value to res.getString(R.string.custom_study), + STUDY_NEW.value to res.getString(R.string.custom_study_increase_new_limit), + STUDY_REV.value to res.getString(R.string.custom_study_increase_review_limit), + STUDY_FORGOT.value to res.getString(R.string.custom_study_review_forgotten), + STUDY_AHEAD.value to res.getString(R.string.custom_study_review_ahead), + STUDY_RANDOM.value to res.getString(R.string.custom_study_random_selection), + STUDY_PREVIEW.value to res.getString(R.string.custom_study_preview_new), + STUDY_TAGS.value to res.getString(R.string.custom_study_limit_tags), + DECK_OPTIONS.value to res.getString(R.string.menu__deck_options), + MORE_OPTIONS.value to res.getString(R.string.more_options) + ) } /** diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/CustomToolbarButton.kt b/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/CustomToolbarButton.kt index 0654ad05a9fc..9ca357209acd 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/CustomToolbarButton.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/noteeditor/CustomToolbarButton.kt @@ -18,7 +18,6 @@ package com.ichi2.anki.noteeditor import android.text.TextUtils import com.ichi2.anki.noteeditor.Toolbar.TextWrapper import com.ichi2.libanki.Consts -import com.ichi2.utils.HashSetInit import timber.log.Timber import java.util.* @@ -63,16 +62,7 @@ class CustomToolbarButton(var index: Int, var buttonText: ButtonText, val prefix return buttons } - fun toStringSet(buttons: ArrayList): Set { - val ret = HashSetInit(buttons.size) - for (b in buttons) { - val values = arrayOf(b.index.toString(), b.buttonText, b.prefix, b.suffix) - for (i in values.indices) { - values[i] = values[i].replace(Consts.FIELD_SEPARATOR, "") - } - ret.add(TextUtils.join(Consts.FIELD_SEPARATOR, values)) - } - return ret - } + fun toStringSet(buttons: ArrayList) = + buttons.map { b -> TextUtils.join(Consts.FIELD_SEPARATOR, listOf(b.index.toString(), b.buttonText, b.prefix, b.suffix).map { it.replace(Consts.FIELD_SEPARATOR, "") }) }.toSet() } } diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/ReviewerCustomFonts.kt b/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/ReviewerCustomFonts.kt index 6c5484f70b89..97ef4468ac56 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/ReviewerCustomFonts.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/reviewer/ReviewerCustomFonts.kt @@ -21,7 +21,6 @@ import android.text.TextUtils import com.ichi2.anki.AnkiDroidApp import com.ichi2.anki.AnkiFont import com.ichi2.libanki.Utils -import com.ichi2.utils.HashMapInit class ReviewerCustomFonts(context: Context) { private val mCustomStyle: String @@ -37,7 +36,7 @@ class ReviewerCustomFonts(context: Context) { * * @return the default font style, or the empty string if no default font is set */ - private fun getDefaultFontStyle(context: Context, customFontsMap: Map): String? { + private fun getDefaultFontStyle(context: Context, customFontsMap: Map): String? { if (mDefaultFontStyle == null) { val preferences = AnkiDroidApp.getSharedPrefs(context) val defaultFont = customFontsMap[preferences.getString("defaultFont", null)] @@ -56,7 +55,7 @@ class ReviewerCustomFonts(context: Context) { * * @return the override font style, or the empty string if no override font is set */ - private fun getOverrideFontStyle(context: Context, customFontsMap: Map): String? { + private fun getOverrideFontStyle(context: Context, customFontsMap: Map): String? { if (mOverrideFontStyle == null) { val preferences = AnkiDroidApp.getSharedPrefs(context) val defaultFont = customFontsMap[preferences.getString("defaultFont", null)] @@ -76,7 +75,7 @@ class ReviewerCustomFonts(context: Context) { * * @return the font style, or the empty string if none applies */ - private fun getDominantFontStyle(context: Context, customFontsMap: Map): String? { + private fun getDominantFontStyle(context: Context, customFontsMap: Map): String? { if (mDominantFontStyle == null) { mDominantFontStyle = getOverrideFontStyle(context, customFontsMap) if (TextUtils.isEmpty(mDominantFontStyle)) { @@ -104,7 +103,7 @@ class ReviewerCustomFonts(context: Context) { *

* Each font is mapped to the font family by the same name as the name of the font without the extension. */ - private fun getCustomFontsStyle(customFontsMap: Map): String { + private fun getCustomFontsStyle(customFontsMap: Map): String { val builder = StringBuilder() for (font in customFontsMap.values) { builder.append(font.declaration) @@ -118,14 +117,7 @@ class ReviewerCustomFonts(context: Context) { *

* The list of constructed lazily the first time is needed. */ - private fun getCustomFontsMap(context: Context): Map { - val fonts = Utils.getCustomFonts(context) - val customFontsMap: MutableMap = HashMapInit(fonts.size) - for (f in fonts) { - customFontsMap[f.name] = f - } - return customFontsMap - } + private fun getCustomFontsMap(context: Context): Map = Utils.getCustomFonts(context).associateBy { it.name } } init { diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/servicelayer/PreferenceUpgradeService.kt b/AnkiDroid/src/main/java/com/ichi2/anki/servicelayer/PreferenceUpgradeService.kt index e926bf97ddd8..658e591a17f5 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/servicelayer/PreferenceUpgradeService.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/servicelayer/PreferenceUpgradeService.kt @@ -33,7 +33,6 @@ import com.ichi2.anki.reviewer.MappableBinding import com.ichi2.anki.web.CustomSyncServer import com.ichi2.libanki.Consts import com.ichi2.themes.Themes -import com.ichi2.utils.HashSetInit import timber.log.Timber private typealias VersionIdentifier = Int @@ -215,7 +214,7 @@ object PreferenceUpgradeService { private fun getNewToolbarButtons(preferences: SharedPreferences): ArrayList { // get old toolbar prefs - val set = preferences.getStringSet("note_editor_custom_buttons", HashSetInit(0)) as Set + val set = preferences.getStringSet("note_editor_custom_buttons", setOf()) as Set // new list with buttons size val buttons = ArrayList(set.size) diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/Collection.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/Collection.kt index a2438dd9bb74..9c83c40543cf 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/Collection.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/Collection.kt @@ -58,7 +58,6 @@ import com.ichi2.libanki.utils.TimeManager import com.ichi2.upgrade.Upgrade import com.ichi2.utils.* import com.ichi2.utils.HashMapInit -import com.ichi2.utils.HashSetInit import net.ankiweb.rsdroid.Backend import net.ankiweb.rsdroid.RustCleanup import org.jetbrains.annotations.Contract @@ -1102,11 +1101,7 @@ open class Collection( var qfmt = qfmtParam var afmt = afmtParam val fmap = Models.fieldMap(model) - val maps: Set>> = fmap.entries - val fields: MutableMap = HashMapInit(maps.size + 8) - for ((key, value) in maps) { - fields[key] = flist[value.first] - } + val fields: MutableMap = fmap.mapValues { flist[it.value.first] }.toMutableMap() val cardNum = ord + 1 fields["Tags"] = tags.trim { it <= ' ' } fields["Type"] = model.getString("name") @@ -1696,10 +1691,7 @@ open class Collection( // obtain a list of all valid dconf IDs val allConf = decks.allConf() - val configIds = HashSetInit(allConf.size) - for (conf in allConf) { - configIds.add(conf.getLong("id")) - } + val configIds = allConf.map { conf -> conf.getLong("id") }.toSet() notifyProgress.run() @KotlinCleanup("use count { }") var changed = 0 diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/Decks.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/Decks.kt index 16d98f5c9115..821a8fa0103c 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/Decks.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/Decks.kt @@ -39,6 +39,7 @@ import timber.log.Timber import java.text.Normalizer import java.util.* import java.util.regex.Pattern +import kotlin.collections.HashMap // fixmes: // - make sure users can't set grad interval < 1 @@ -150,24 +151,14 @@ class Decks(private val col: Collection) : DeckManager() { override fun load(@Language("JSON") decks: String, dconf: String) { val decksarray = JSONObject(decks) var ids = decksarray.names() - this.decks = HashMapInit(decksarray.length()) - if (ids != null) { - for (id in ids.stringIterable()) { - val o = Deck(decksarray.getJSONObject(id)) - val longId = id.toLong() - this.decks!!.put(longId, o) - } - } + this.decks = + ids?.stringIterable()?.associate { id -> id.toLong() to Deck(decksarray.getJSONObject(id)) } + ?.toMutableMap() + ?: HashMap() mNameMap = NameMap.constructor(this.decks!!.values) val confarray = JSONObject(dconf) ids = confarray.names() - mDconf = HashMapInit(confarray.length()) - if (ids != null) { - for (id in ids.stringIterable()) { - mDconf!![id.toLong()] = - DeckConfig(confarray.getJSONObject(id), DeckConfig.Source.DECK_CONFIG) - } - } + mDconf = ids?.stringIterable()?.associate { id -> id.toLong() to DeckConfig(confarray.getJSONObject(id), DeckConfig.Source.DECK_CONFIG) }?.toMutableMap() ?: HashMap() mChanged = false } diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/Finder.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/Finder.kt index 20e75e69ea35..75abaeacd73c 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/Finder.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/Finder.kt @@ -662,17 +662,11 @@ class Finder(private val col: Collection) { val pattern = Pattern.compile("\\Q$javaVal\\E", Pattern.CASE_INSENSITIVE or Pattern.DOTALL) // find models that have that field - val mods: MutableMap> = HashMapInit(col.models.count()) - for (m in col.models.all()) { - val flds = m.getJSONArray("flds") - for (f in flds.jsonObjectIterable()) { - var fieldName = f.getString("name") - fieldName = Normalizer.normalize(fieldName, Normalizer.Form.NFC) - if (fieldName.equals(field, ignoreCase = true)) { - mods[m.getLong("id")] = arrayOf(m, f.getInt("ord")) - } - } - } + val mods: Map> = col.models.all().flatMap { m -> + m.getJSONArray("flds").jsonObjectIterable() + .filter { f -> Normalizer.normalize(f.getString("name"), Normalizer.Form.NFC).equals(field, ignoreCase = true) }.map { f -> m.getLong("id") to arrayOf(m, f.getInt("ord")) } + }.toMap() + if (mods.isEmpty()) { // nothing has that field return null diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/Model.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/Model.kt index 01dde9e1b94d..001da389d06c 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/Model.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/Model.kt @@ -20,7 +20,6 @@ import android.text.TextUtils import androidx.annotation.CheckResult import com.ichi2.libanki.template.ParsedNode import com.ichi2.libanki.template.TemplateError -import com.ichi2.utils.HashSetInit import com.ichi2.utils.JSONObject import com.ichi2.utils.KotlinCleanup import timber.log.Timber @@ -89,13 +88,7 @@ class Model : JSONObject { @KotlinCleanup("filter") fun nonEmptyFields(sfld: Array): Set { val fieldNames = fieldsNames - val nonemptyFields: MutableSet = HashSetInit(sfld.size) - for (i in sfld.indices) { - if (!TextUtils.isEmpty(sfld[i].trim { it <= ' ' })) { - nonemptyFields.add(fieldNames[i]) - } - } - return nonemptyFields + return sfld.indices.filter { i -> !TextUtils.isEmpty(sfld[i].trim { it <= ' ' }) }.map { i -> fieldNames[i] }.toSet() } /** diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/Models.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/Models.kt index 42efddf015eb..5d52e2fb8cae 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/Models.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/Models.kt @@ -25,7 +25,6 @@ import com.ichi2.anki.exception.ConfirmModSchemaException import com.ichi2.libanki.template.ParsedNode import com.ichi2.libanki.template.TemplateError import com.ichi2.libanki.utils.TimeManager.time -import com.ichi2.utils.HashMapInit import com.ichi2.utils.JSONArray import com.ichi2.utils.JSONObject import com.ichi2.utils.KotlinCleanup @@ -608,10 +607,7 @@ class Models(col: Collection) : ModelManager(col) { val mid = newModel.getLong("id") val sflds = col.db.queryString("select flds from notes where id = ?", nid) val flds = Utils.splitFields(sflds) - val newflds: MutableMap = HashMapInit(map.size) - for ((key, value) in map) { - newflds[value] = flds[key] - } + val newflds: Map = map.entries.associate { it.value to flds[it.key] } val flds2: MutableList = ArrayList(nfields) for (c in 0 until nfields) { @KotlinCleanup("getKeyOrDefault") @@ -792,20 +788,8 @@ class Models(col: Collection) : ModelManager(col) { } val templateNames: Map> - get() { - val result = HashMapInit>( - mModels!!.size - ) - for (m in mModels!!.values) { - val templates = m.getJSONArray("tmpls") - val names = HashMapInit(templates.length()) - for (t in templates.jsonObjectIterable()) { - names[t.getInt("ord")] = t.getString("name") - } - result[m.getLong("id")] = names - } - return result - } + get() = + mModels!!.values.associate { m -> m.getLong("id") to m.getJSONArray("tmpls").jsonObjectIterable().associate { t -> t.getInt("ord") to t.getString("name") } } override fun getModels(): HashMap { return mModels!! @@ -882,15 +866,7 @@ class Models(col: Collection) : ModelManager(col) { } /** "Mapping of field name -> (ord, field). */ - fun fieldMap(m: Model): Map> { - val flds = m.getJSONArray("flds") - // TreeMap map = new TreeMap(); - val result: MutableMap> = HashMapInit(flds.length()) - for (f in flds.jsonObjectIterable()) { - result[f.getString("name")] = Pair(f.getInt("ord"), f) - } - return result - } + fun fieldMap(m: Model): Map> = m.getJSONArray("flds").jsonObjectIterable().associate { f -> f.getString("name") to Pair(f.getInt("ord"), f) } /* * Templates *********************************************************************************************** diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/Utils.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/Utils.kt index 84805bb2c3b4..1fd776bb9ae7 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/Utils.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/Utils.kt @@ -35,8 +35,6 @@ import com.ichi2.anki.CollectionHelper import com.ichi2.anki.R import com.ichi2.compat.CompatHelper.Companion.compat import com.ichi2.libanki.Consts.FIELD_SEPARATOR -import com.ichi2.utils.HashMapInit -import com.ichi2.utils.HashSetInit import com.ichi2.utils.ImportUtils.isValidPackageName import com.ichi2.utils.JSONArray import com.ichi2.utils.JSONException @@ -724,7 +722,7 @@ object Utils { throw IOException("Failed to create target directory: $targetDirectory") } if (zipEntryToFilenameMap == null) { - zipEntryToFilenameMap = HashMapInit(0) + zipEntryToFilenameMap = mapOf() } for (requestedEntry in zipEntries) { val ze = zipFile.getEntry(requestedEntry) @@ -1126,15 +1124,6 @@ object Utils { * @return The set of non empty field values. */ @KotlinCleanup("remove TextUtils at least. Maybe .filter { }") - fun nonEmptyFields(fields: Map): Set { - val nonempty_fields: MutableSet = HashSetInit(fields.size) - for (kv in fields.entries) { - var value = kv.value - value = stripHTMLMedia(value).trim { it <= ' ' } - if (!TextUtils.isEmpty(value)) { - nonempty_fields.add(kv.key) - } - } - return nonempty_fields - } + fun nonEmptyFields(fields: Map) = + fields.entries.filter { kv -> !TextUtils.isEmpty(stripHTMLMedia(kv.value).trim()) }.map { it.key }.toSet() } diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/importer/AnkiPackageImporter.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/importer/AnkiPackageImporter.kt index e895ec717963..caa0992700c6 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/importer/AnkiPackageImporter.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/importer/AnkiPackageImporter.kt @@ -27,7 +27,6 @@ import com.ichi2.anki.exception.ImportExportException import com.ichi2.libanki.Collection import com.ichi2.libanki.Storage import com.ichi2.libanki.Utils -import com.ichi2.utils.HashMapInit import com.ichi2.utils.KotlinCleanup import org.apache.commons.compress.archivers.zip.ZipFile import timber.log.Timber @@ -83,8 +82,7 @@ class AnkiPackageImporter(col: Collection?, file: String?) : Anki2Importer(col!! // The filename that we extract should be collection.anki2 // Importing collection.anki21 fails due to some media regexes expecting collection.anki2. // We follow how Anki does it and fix the problem here. - val mediaToFileNameMap = HashMapInit(1) - mediaToFileNameMap[colname] = CollectionHelper.COLLECTION_FILENAME + val mediaToFileNameMap = mapOf(colname to CollectionHelper.COLLECTION_FILENAME) Utils.unzipFiles(mZip!!, tempDir.absolutePath, arrayOf(colname, "media"), mediaToFileNameMap) colname = CollectionHelper.COLLECTION_FILENAME } catch (e: IOException) { diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/sched/SchedV2.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/sched/SchedV2.kt index 0f568b260f87..60e08aa44365 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/sched/SchedV2.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/sched/SchedV2.kt @@ -2383,13 +2383,10 @@ end) """ return } // determine nid ordering - val due = HashMapInit(nids.size) if (shuffle) { Collections.shuffle(nids) } - for (c in nids.indices) { - due[nids[c]] = (start + c * step).toLong() - } + val due = nids.indices.associate { c -> nids[c] to (start + c * step).toLong() } val high = start + step * (nids.size - 1) // shift? if (shift) { diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/sync/FullSyncer.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/sync/FullSyncer.kt index ee7882d8448f..d8b42541e100 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/sync/FullSyncer.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/sync/FullSyncer.kt @@ -30,7 +30,6 @@ import com.ichi2.libanki.sync.Syncer.ConnectionResultType import com.ichi2.libanki.sync.Syncer.ConnectionResultType.ARBITRARY_STRING import com.ichi2.libanki.sync.Syncer.ConnectionResultType.OVERWRITE_ERROR import com.ichi2.libanki.sync.Syncer.ConnectionResultType.SUCCESS -import com.ichi2.utils.HashMapInit import com.ichi2.utils.KotlinCleanup import com.ichi2.utils.VersionUtils.pkgVersionName import okhttp3.Response @@ -49,9 +48,10 @@ class FullSyncer(col: Collection?, hkey: String?, con: Connection, hostNum: Host private val mCon: Connection init { - postVars = HashMapInit(2) - postVars["k"] = hkey - postVars["v"] = String.format(Locale.US, "ankidroid,%s,%s", pkgVersionName, Utils.platDesc()) + postVars = mutableMapOf( + "k" to hkey, + "v" to String.format(Locale.US, "ankidroid,%s,%s", pkgVersionName, Utils.platDesc()) + ) @KotlinCleanup("move to constructor") mCol = col mCon = con diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/sync/HttpSyncer.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/sync/HttpSyncer.kt index ef3dbdf687e7..32b115b7ca35 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/sync/HttpSyncer.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/sync/HttpSyncer.kt @@ -27,7 +27,6 @@ import com.ichi2.anki.web.CustomSyncServer import com.ichi2.anki.web.HttpFetcher import com.ichi2.async.Connection import com.ichi2.libanki.Utils -import com.ichi2.utils.HashMapInit import com.ichi2.utils.KotlinCleanup import okhttp3.HttpUrl import okhttp3.HttpUrl.Companion.toHttpUrl @@ -329,7 +328,7 @@ open class HttpSyncer( @KotlinCleanup("move to constructor") this.con = con @KotlinCleanup("combined declaration and initialization") - postVars = HashMapInit(0) // New map is created each time it is filled. No need to allocate room + postVars = mutableMapOf() // New map is created each time it is filled. No need to allocate room @KotlinCleanup("move to constructor") mHostNum = hostNum } diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/sync/RemoteMediaServer.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/sync/RemoteMediaServer.kt index aeba640a0074..1d8681016902 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/sync/RemoteMediaServer.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/sync/RemoteMediaServer.kt @@ -23,7 +23,6 @@ import com.ichi2.anki.web.CustomSyncServer import com.ichi2.async.Connection import com.ichi2.libanki.Collection import com.ichi2.libanki.Utils -import com.ichi2.utils.HashMapInit import com.ichi2.utils.JSONArray import com.ichi2.utils.JSONObject import com.ichi2.utils.VersionUtils.pkgVersionName @@ -49,9 +48,10 @@ class RemoteMediaServer( @Throws(UnknownHttpResponseException::class, MediaSyncException::class) fun begin(): JSONObject { return try { - postVars = HashMapInit(2) - postVars["k"] = hKey - postVars["v"] = String.format(Locale.US, "ankidroid,%s,%s", pkgVersionName, Utils.platDesc()) + postVars = mutableMapOf( + "k" to hKey, + "v" to String.format(Locale.US, "ankidroid,%s,%s", pkgVersionName, Utils.platDesc()) + ) val resp = req("begin", getInputStream(Utils.jsonToString(JSONObject()))) val jresp = JSONObject(resp.body!!.string()) val ret = dataOnly(jresp, JSONObject::class.java) @@ -66,8 +66,7 @@ class RemoteMediaServer( @Throws(UnknownHttpResponseException::class, MediaSyncException::class) fun mediaChanges(lastUsn: Int): JSONArray { return try { - postVars = HashMapInit(1) - postVars["sk"] = checksumKey + postVars = mutableMapOf("sk" to checksumKey) val resp = req( "mediaChanges", getInputStream(Utils.jsonToString(JSONObject().put("lastUsn", lastUsn))) diff --git a/AnkiDroid/src/main/java/com/ichi2/libanki/sync/RemoteServer.kt b/AnkiDroid/src/main/java/com/ichi2/libanki/sync/RemoteServer.kt index 9714d15e5aa7..3d0eaca1da34 100644 --- a/AnkiDroid/src/main/java/com/ichi2/libanki/sync/RemoteServer.kt +++ b/AnkiDroid/src/main/java/com/ichi2/libanki/sync/RemoteServer.kt @@ -21,7 +21,6 @@ import com.ichi2.anki.exception.UnknownHttpResponseException import com.ichi2.async.Connection import com.ichi2.libanki.Consts import com.ichi2.libanki.Utils -import com.ichi2.utils.HashMapInit import com.ichi2.utils.JSONException import com.ichi2.utils.JSONObject import com.ichi2.utils.VersionUtils.pkgVersionName @@ -40,7 +39,7 @@ class RemoteServer( @Throws(UnknownHttpResponseException::class) fun hostKey(user: String?, pw: String?): Response? { return try { - postVars = HashMapInit(0) + postVars = mutableMapOf() val credentials = JSONObject() credentials.put("u", user) credentials.put("p", pw) @@ -53,9 +52,10 @@ class RemoteServer( @Throws(UnknownHttpResponseException::class) fun meta(): Response { - postVars = HashMapInit(2) - postVars["k"] = hKey - postVars["s"] = checksumKey + postVars = mutableMapOf( + "k" to hKey, + "s" to checksumKey + ) val meta = JSONObject() meta.put("v", Consts.SYNC_VER) meta.put("cv", String.format(Locale.US, "ankidroid,%s,%s", pkgVersionName, Utils.platDesc())) diff --git a/AnkiDroid/src/main/java/com/wildplot/android/parsing/TopLevelParser.kt b/AnkiDroid/src/main/java/com/wildplot/android/parsing/TopLevelParser.kt index a5afa3e4f9af..c0c87a3b4359 100644 --- a/AnkiDroid/src/main/java/com/wildplot/android/parsing/TopLevelParser.kt +++ b/AnkiDroid/src/main/java/com/wildplot/android/parsing/TopLevelParser.kt @@ -15,7 +15,6 @@ ****************************************************************************************/ package com.wildplot.android.parsing -import com.ichi2.utils.HashMapInit import com.wildplot.android.rendering.interfaces.Function2D import com.wildplot.android.rendering.interfaces.Function3D import java.util.regex.Pattern @@ -23,7 +22,10 @@ import java.util.regex.Pattern class TopLevelParser(expressionString: String, parserRegister: HashMap) : Function2D, Function3D, Cloneable { private val parserRegister: HashMap - private val varMap = HashMapInit(2) // Number form initVarMap + private val varMap = mapOf( + "e" to Math.E, + "pi" to Math.PI + ) var x = 0.0 var y = 0.0 private val expression: Expression @@ -33,7 +35,6 @@ class TopLevelParser(expressionString: String, parserRegister: HashMap(2) - - var values = arrayOf(0, "

", "

") - buttons.add(TextUtils.join(Consts.FIELD_SEPARATOR, values)) - - values = arrayOf(1, "

", "

") - buttons.add(TextUtils.join(Consts.FIELD_SEPARATOR, values)) + val buttons = setOf( + TextUtils.join(Consts.FIELD_SEPARATOR, arrayOf(0, "

", "

")), + TextUtils.join(Consts.FIELD_SEPARATOR, arrayOf(1, "

", "

")) + ) mPrefs.edit { putStringSet("note_editor_custom_buttons", buttons) @@ -137,7 +133,7 @@ class PreferenceUpgradeServiceTest : RobolectricTest() { // now update it and check it PreferenceUpgrade.UpdateNoteEditorToolbarPrefs().performUpgrade(mPrefs) - val set = mPrefs.getStringSet("note_editor_custom_buttons", HashSetInit(0)) as Set + val set = mPrefs.getStringSet("note_editor_custom_buttons", setOf()) as Set val toolbarButtons = CustomToolbarButton.fromStringSet(set) assertEquals("Set size", 2, set.size)