From 1b7f48c53a3ec377119cca20ca17cc046ebe5642 Mon Sep 17 00:00:00 2001 From: Maxence G Date: Mon, 24 May 2021 23:25:12 +0200 Subject: [PATCH 01/22] Implement server feature checking --- .../java/org/moire/ultrasonic/util/Util.java | 26 +++++++ .../ultrasonic/activity/NavigationActivity.kt | 20 +++-- .../org/moire/ultrasonic/data/AppDatabase.kt | 11 ++- .../moire/ultrasonic/data/ServerSetting.kt | 6 +- .../di/AppPermanentStorageModule.kt | 4 +- .../ultrasonic/fragment/EditServerFragment.kt | 76 ++++++++++++++++--- 6 files changed, 125 insertions(+), 18 deletions(-) diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java b/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java index f89ed103..da3e98af 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java @@ -359,6 +359,20 @@ public class Util return Math.min(Math.max(percent,0),100) + " %"; } + /** + * Return a Mark depending on boolean (❌ or ✓) + * + * @param value Is true or false + * @return The corresponding mark. + */ + public static synchronized String boolToMark(boolean value) + { + if (value) + return "✔️"; + else + return "❌"; + } + /** * Converts a byte-count to a formatted string suitable for display to the user. @@ -606,6 +620,18 @@ public class Util }).show(); } + public static void showDialog(Context context, int icon, int titleId, String message) + { + new AlertDialog.Builder(context).setIcon(icon).setTitle(titleId).setMessage(message).setPositiveButton(R.string.common_ok, new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface dialog, int i) + { + dialog.dismiss(); + } + }).show(); + } + public static void sleepQuietly(long millis) { diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt index 6c8e5691..2cff4a3f 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt @@ -29,7 +29,9 @@ import androidx.preference.PreferenceManager import com.google.android.material.navigation.NavigationView import org.koin.android.ext.android.inject import org.koin.android.viewmodel.ext.android.viewModel +import org.koin.java.KoinJavaComponent.inject import org.moire.ultrasonic.R +import org.moire.ultrasonic.data.ActiveServerProvider import org.moire.ultrasonic.data.ActiveServerProvider.Companion.isOffline import org.moire.ultrasonic.domain.PlayerState import org.moire.ultrasonic.fragment.OnBackPressedHandler @@ -368,10 +370,18 @@ class NavigationActivity : AppCompatActivity() { } private fun setMenuForServerSetting() { - val visibility = !isOffline() - chatMenuItem?.isVisible = visibility - bookmarksMenuItem?.isVisible = visibility - sharesMenuItem?.isVisible = visibility - podcastsMenuItem?.isVisible = visibility + if (isOffline()) + { + chatMenuItem?.isVisible = false + bookmarksMenuItem?.isVisible = false + sharesMenuItem?.isVisible = false + podcastsMenuItem?.isVisible = false + return + } + val activeServerProvider = inject(ActiveServerProvider::class.java) + chatMenuItem?.isVisible = activeServerProvider.value.getActiveServer().chatSupport + bookmarksMenuItem?.isVisible = activeServerProvider.value.getActiveServer().bookmarkSupport + sharesMenuItem?.isVisible = activeServerProvider.value.getActiveServer().shareSupport + podcastsMenuItem?.isVisible = activeServerProvider.value.getActiveServer().podcastSupport } } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/AppDatabase.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/AppDatabase.kt index ee265000..2a882cd9 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/AppDatabase.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/AppDatabase.kt @@ -8,7 +8,7 @@ import androidx.sqlite.db.SupportSQLiteDatabase /** * Room Database to be used to store data for Ultrasonic */ -@Database(entities = [ServerSetting::class], version = 2) +@Database(entities = [ServerSetting::class], version = 3) abstract class AppDatabase : RoomDatabase() { /** @@ -24,3 +24,12 @@ val MIGRATION_1_2: Migration = object : Migration(1, 2) { ) } } + +val MIGRATION_2_3: Migration = object : Migration(2, 3) { + override fun migrate(database: SupportSQLiteDatabase) { + database.execSQL("ALTER TABLE ServerSetting ADD COLUMN chatSupport INTEGER NOT NULL DEFAULT(1)") + database.execSQL("ALTER TABLE ServerSetting ADD COLUMN bookmarkSupport INTEGER NOT NULL DEFAULT(1)") + database.execSQL("ALTER TABLE ServerSetting ADD COLUMN shareSupport INTEGER NOT NULL DEFAULT(1)") + database.execSQL("ALTER TABLE ServerSetting ADD COLUMN podcastSupport INTEGER NOT NULL DEFAULT(1)") + } +} diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/ServerSetting.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/ServerSetting.kt index c5749a23..f1597e87 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/ServerSetting.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/ServerSetting.kt @@ -29,7 +29,11 @@ data class ServerSetting( @ColumnInfo(name = "allowSelfSignedCertificate") var allowSelfSignedCertificate: Boolean, @ColumnInfo(name = "ldapSupport") var ldapSupport: Boolean, @ColumnInfo(name = "musicFolderId") var musicFolderId: String?, - @ColumnInfo(name = "minimumApiVersion") var minimumApiVersion: String? + @ColumnInfo(name = "minimumApiVersion") var minimumApiVersion: String?, + @ColumnInfo(name = "chatSupport") var chatSupport: Boolean = true, + @ColumnInfo(name = "bookmarkSupport") var bookmarkSupport: Boolean = true, + @ColumnInfo(name = "shareSupport") var shareSupport: Boolean = true, + @ColumnInfo(name = "podcastSupport") var podcastSupport: Boolean = true ) { constructor() : this ( -1, 0, "", "", "", "", false, false, false, null, null diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/di/AppPermanentStorageModule.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/di/AppPermanentStorageModule.kt index 89c5cbc3..fd07d52f 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/di/AppPermanentStorageModule.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/di/AppPermanentStorageModule.kt @@ -7,6 +7,7 @@ import org.koin.core.qualifier.named import org.koin.dsl.module import org.moire.ultrasonic.data.AppDatabase import org.moire.ultrasonic.data.MIGRATION_1_2 +import org.moire.ultrasonic.data.MIGRATION_2_3 import org.moire.ultrasonic.fragment.ServerSettingsModel import org.moire.ultrasonic.util.Util @@ -24,7 +25,8 @@ val appPermanentStorage = module { AppDatabase::class.java, "ultrasonic-database" ) - .addMigrations(MIGRATION_1_2) + .addMigrations(MIGRATION_1_2) + .addMigrations(MIGRATION_2_3) .fallbackToDestructiveMigrationOnDowngrade() .build() } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt index 12519813..3bb409f6 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt @@ -295,14 +295,22 @@ class EditServerFragment : Fragment(), OnBackPressedHandler { * Tests if the network connection to the entered Server Settings can be made */ private fun testConnection() { - val task: ModalBackgroundTask = object : ModalBackgroundTask( + val task: ModalBackgroundTask = object : ModalBackgroundTask( activity, false ) { @Throws(Throwable::class) - override fun doInBackground(): Boolean { - updateProgress(R.string.settings_testing_connection) + override fun doInBackground(): String { + + var progressString = """ + |%s - ${activity.resources.getString(R.string.button_bar_chat)} + |%s - ${activity.resources.getString(R.string.button_bar_bookmarks)} + |%s - ${activity.resources.getString(R.string.button_bar_shares)} + |%s - ${activity.resources.getString(R.string.button_bar_podcasts)} + """.trimMargin() + updateProgress(String.format(progressString, "⌛", "⌛", "⌛", "⌛")) + val configuration = SubsonicClientConfiguration( currentServerSetting!!.url, currentServerSetting!!.userName, @@ -330,17 +338,65 @@ class EditServerFragment : Fragment(), OnBackPressedHandler { pingResponse = subsonicApiClient.api.ping().execute() ApiCallResponseChecker.checkResponseSuccessful(pingResponse) + updateProgress(String.format(progressString, "⌛", "⌛", "⌛", "⌛")) + + currentServerSetting!!.chatSupport = try { + subsonicApiClient.api.getChatMessages().execute() + true + } catch (e: Throwable) { false } + + updateProgress(String.format(progressString, + Util.boolToMark(currentServerSetting!!.chatSupport), + "⌛", "⌛", "⌛")) + + currentServerSetting!!.bookmarkSupport = try { + subsonicApiClient.api.getBookmarks().execute() + true + } catch (e: Throwable) { false } + + updateProgress(String.format(progressString, + Util.boolToMark(currentServerSetting!!.chatSupport), + Util.boolToMark(currentServerSetting!!.bookmarkSupport), + "⌛", "⌛")) + + currentServerSetting!!.shareSupport = try { + subsonicApiClient.api.getShares().execute() + true + } catch (e: Throwable) { false } + + updateProgress(String.format(progressString, + Util.boolToMark(currentServerSetting!!.chatSupport), + Util.boolToMark(currentServerSetting!!.bookmarkSupport), + Util.boolToMark(currentServerSetting!!.shareSupport), + "⌛")) + + currentServerSetting!!.podcastSupport = try { + subsonicApiClient.api.getPodcasts().execute() + true + } catch (e: Throwable) { false } + + // Finalize String before displaying it to Dialog + progressString = String.format(progressString, + Util.boolToMark(currentServerSetting!!.chatSupport), + Util.boolToMark(currentServerSetting!!.bookmarkSupport), + Util.boolToMark(currentServerSetting!!.shareSupport), + Util.boolToMark(currentServerSetting!!.podcastSupport)) + updateProgress(progressString) + val licenseResponse = subsonicApiClient.api.getLicense().execute() ApiCallResponseChecker.checkResponseSuccessful(licenseResponse) - return licenseResponse.body()!!.license.valid + if (!licenseResponse.body()!!.license.valid) { + progressString += "\n${activity.resources.getString(R.string.settings_testing_unlicensed)}" + } + return progressString } - override fun done(licenseValid: Boolean) { - if (licenseValid) { - Util.toast(activity, R.string.settings_testing_ok) - } else { - Util.toast(activity, R.string.settings_testing_unlicensed) - } + override fun done(responseString: String) { + Util.showDialog( + activity, + android.R.drawable.ic_dialog_info, + R.string.settings_testing_ok, + responseString) } override fun error(error: Throwable) { From 070e0ac792d34c52033a5aad1e85d6f321cdc726 Mon Sep 17 00:00:00 2001 From: Maxence G Date: Tue, 25 May 2021 18:51:00 +0200 Subject: [PATCH 02/22] Fix lintFormat + remove synchronized --- .../java/org/moire/ultrasonic/util/Util.java | 2 +- .../ultrasonic/activity/NavigationActivity.kt | 3 +- .../org/moire/ultrasonic/data/AppDatabase.kt | 16 ++++-- .../di/AppPermanentStorageModule.kt | 4 +- .../ultrasonic/fragment/EditServerFragment.kt | 51 ++++++++++++------- 5 files changed, 50 insertions(+), 26 deletions(-) diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java b/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java index da3e98af..35086202 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java @@ -365,7 +365,7 @@ public class Util * @param value Is true or false * @return The corresponding mark. */ - public static synchronized String boolToMark(boolean value) + public static String boolToMark(boolean value) { if (value) return "✔️"; diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt index 2cff4a3f..2a1f97c0 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt @@ -370,8 +370,7 @@ class NavigationActivity : AppCompatActivity() { } private fun setMenuForServerSetting() { - if (isOffline()) - { + if (isOffline()) { chatMenuItem?.isVisible = false bookmarksMenuItem?.isVisible = false sharesMenuItem?.isVisible = false diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/AppDatabase.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/AppDatabase.kt index 2a882cd9..a29f895f 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/AppDatabase.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/AppDatabase.kt @@ -27,9 +27,17 @@ val MIGRATION_1_2: Migration = object : Migration(1, 2) { val MIGRATION_2_3: Migration = object : Migration(2, 3) { override fun migrate(database: SupportSQLiteDatabase) { - database.execSQL("ALTER TABLE ServerSetting ADD COLUMN chatSupport INTEGER NOT NULL DEFAULT(1)") - database.execSQL("ALTER TABLE ServerSetting ADD COLUMN bookmarkSupport INTEGER NOT NULL DEFAULT(1)") - database.execSQL("ALTER TABLE ServerSetting ADD COLUMN shareSupport INTEGER NOT NULL DEFAULT(1)") - database.execSQL("ALTER TABLE ServerSetting ADD COLUMN podcastSupport INTEGER NOT NULL DEFAULT(1)") + database.execSQL( + "ALTER TABLE ServerSetting ADD COLUMN chatSupport INTEGER NOT NULL DEFAULT(1)" + ) + database.execSQL( + "ALTER TABLE ServerSetting ADD COLUMN bookmarkSupport INTEGER NOT NULL DEFAULT(1)" + ) + database.execSQL( + "ALTER TABLE ServerSetting ADD COLUMN shareSupport INTEGER NOT NULL DEFAULT(1)" + ) + database.execSQL( + "ALTER TABLE ServerSetting ADD COLUMN podcastSupport INTEGER NOT NULL DEFAULT(1)" + ) } } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/di/AppPermanentStorageModule.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/di/AppPermanentStorageModule.kt index fd07d52f..31d63ffd 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/di/AppPermanentStorageModule.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/di/AppPermanentStorageModule.kt @@ -25,8 +25,8 @@ val appPermanentStorage = module { AppDatabase::class.java, "ultrasonic-database" ) - .addMigrations(MIGRATION_1_2) - .addMigrations(MIGRATION_2_3) + .addMigrations(MIGRATION_1_2) + .addMigrations(MIGRATION_2_3) .fallbackToDestructiveMigrationOnDowngrade() .build() } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt index 3bb409f6..c7d009fa 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt @@ -303,7 +303,8 @@ class EditServerFragment : Fragment(), OnBackPressedHandler { @Throws(Throwable::class) override fun doInBackground(): String { - var progressString = """ + var progressString = + """ |%s - ${activity.resources.getString(R.string.button_bar_chat)} |%s - ${activity.resources.getString(R.string.button_bar_bookmarks)} |%s - ${activity.resources.getString(R.string.button_bar_shares)} @@ -345,30 +346,42 @@ class EditServerFragment : Fragment(), OnBackPressedHandler { true } catch (e: Throwable) { false } - updateProgress(String.format(progressString, + updateProgress( + String.format( + progressString, Util.boolToMark(currentServerSetting!!.chatSupport), - "⌛", "⌛", "⌛")) + "⌛", "⌛", "⌛" + ) + ) currentServerSetting!!.bookmarkSupport = try { subsonicApiClient.api.getBookmarks().execute() true } catch (e: Throwable) { false } - updateProgress(String.format(progressString, + updateProgress( + String.format( + progressString, Util.boolToMark(currentServerSetting!!.chatSupport), Util.boolToMark(currentServerSetting!!.bookmarkSupport), - "⌛", "⌛")) + "⌛", "⌛" + ) + ) currentServerSetting!!.shareSupport = try { subsonicApiClient.api.getShares().execute() true } catch (e: Throwable) { false } - updateProgress(String.format(progressString, + updateProgress( + String.format( + progressString, Util.boolToMark(currentServerSetting!!.chatSupport), Util.boolToMark(currentServerSetting!!.bookmarkSupport), Util.boolToMark(currentServerSetting!!.shareSupport), - "⌛")) + "⌛" + ) + ) currentServerSetting!!.podcastSupport = try { subsonicApiClient.api.getPodcasts().execute() @@ -376,27 +389,31 @@ class EditServerFragment : Fragment(), OnBackPressedHandler { } catch (e: Throwable) { false } // Finalize String before displaying it to Dialog - progressString = String.format(progressString, - Util.boolToMark(currentServerSetting!!.chatSupport), - Util.boolToMark(currentServerSetting!!.bookmarkSupport), - Util.boolToMark(currentServerSetting!!.shareSupport), - Util.boolToMark(currentServerSetting!!.podcastSupport)) + progressString = String.format( + progressString, + Util.boolToMark(currentServerSetting!!.chatSupport), + Util.boolToMark(currentServerSetting!!.bookmarkSupport), + Util.boolToMark(currentServerSetting!!.shareSupport), + Util.boolToMark(currentServerSetting!!.podcastSupport) + ) updateProgress(progressString) val licenseResponse = subsonicApiClient.api.getLicense().execute() ApiCallResponseChecker.checkResponseSuccessful(licenseResponse) if (!licenseResponse.body()!!.license.valid) { - progressString += "\n${activity.resources.getString(R.string.settings_testing_unlicensed)}" + progressString += "\n" + + activity.resources.getString(R.string.settings_testing_unlicensed) } return progressString } override fun done(responseString: String) { Util.showDialog( - activity, - android.R.drawable.ic_dialog_info, - R.string.settings_testing_ok, - responseString) + activity, + android.R.drawable.ic_dialog_info, + R.string.settings_testing_ok, + responseString + ) } override fun error(error: Throwable) { From 3c4a5064b05313b26a540c36b25b4808e1cffb06 Mon Sep 17 00:00:00 2001 From: Maxence G Date: Tue, 25 May 2021 19:30:02 +0200 Subject: [PATCH 03/22] change exception type --- .../org/moire/ultrasonic/fragment/EditServerFragment.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt index c7d009fa..978f6bf3 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt @@ -29,6 +29,7 @@ import org.moire.ultrasonic.util.ErrorDialog import org.moire.ultrasonic.util.ModalBackgroundTask import org.moire.ultrasonic.util.Util import timber.log.Timber +import java.io.IOException /** * Displays a form where server settings can be created / edited @@ -344,7 +345,7 @@ class EditServerFragment : Fragment(), OnBackPressedHandler { currentServerSetting!!.chatSupport = try { subsonicApiClient.api.getChatMessages().execute() true - } catch (e: Throwable) { false } + } catch (e: IOException) { false } updateProgress( String.format( @@ -357,7 +358,7 @@ class EditServerFragment : Fragment(), OnBackPressedHandler { currentServerSetting!!.bookmarkSupport = try { subsonicApiClient.api.getBookmarks().execute() true - } catch (e: Throwable) { false } + } catch (e: IOException) { false } updateProgress( String.format( @@ -371,7 +372,7 @@ class EditServerFragment : Fragment(), OnBackPressedHandler { currentServerSetting!!.shareSupport = try { subsonicApiClient.api.getShares().execute() true - } catch (e: Throwable) { false } + } catch (e: IOException) { false } updateProgress( String.format( @@ -386,7 +387,7 @@ class EditServerFragment : Fragment(), OnBackPressedHandler { currentServerSetting!!.podcastSupport = try { subsonicApiClient.api.getPodcasts().execute() true - } catch (e: Throwable) { false } + } catch (e: IOException) { false } // Finalize String before displaying it to Dialog progressString = String.format( From 31850bf2704f5e3336ede7d813adb96e24db78ee Mon Sep 17 00:00:00 2001 From: tzugen <67737443+tzugen@users.noreply.github.com> Date: Wed, 26 May 2021 08:36:54 +0200 Subject: [PATCH 04/22] Cleanup AlertDialog method The other method was unused, so we can get rid of it. Also use a lambda for the callback --- .../java/org/moire/ultrasonic/util/Util.java | 28 ++++++------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java b/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java index 35086202..fc4fce23 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java @@ -608,28 +608,16 @@ public class Util } - private static void showDialog(Context context, int icon, int titleId, int messageId) - { - new AlertDialog.Builder(context).setIcon(icon).setTitle(titleId).setMessage(messageId).setPositiveButton(R.string.common_ok, new DialogInterface.OnClickListener() - { - @Override - public void onClick(DialogInterface dialog, int i) - { - dialog.dismiss(); - } - }).show(); - } - + // The AlertDialog requires an Activity context, app context is not enough + // See https://stackoverflow.com/questions/5436822/ public static void showDialog(Context context, int icon, int titleId, String message) { - new AlertDialog.Builder(context).setIcon(icon).setTitle(titleId).setMessage(message).setPositiveButton(R.string.common_ok, new DialogInterface.OnClickListener() - { - @Override - public void onClick(DialogInterface dialog, int i) - { - dialog.dismiss(); - } - }).show(); + new AlertDialog.Builder(context) + .setIcon(icon) + .setTitle(titleId) + .setMessage(message) + .setPositiveButton(R.string.common_ok, (dialog, i) -> dialog.dismiss()) + .show(); } From f510638571d40dc053cf21217ee21ef80d9114db Mon Sep 17 00:00:00 2001 From: tzugen Date: Wed, 26 May 2021 08:44:11 +0200 Subject: [PATCH 05/22] Fix KtLint issue --- .../kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt index 978f6bf3..d5767ce1 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt @@ -11,6 +11,7 @@ import androidx.lifecycle.Observer import androidx.navigation.fragment.findNavController import com.google.android.material.switchmaterial.SwitchMaterial import com.google.android.material.textfield.TextInputLayout +import java.io.IOException import java.net.MalformedURLException import java.net.URL import org.koin.android.ext.android.inject @@ -29,7 +30,6 @@ import org.moire.ultrasonic.util.ErrorDialog import org.moire.ultrasonic.util.ModalBackgroundTask import org.moire.ultrasonic.util.Util import timber.log.Timber -import java.io.IOException /** * Displays a form where server settings can be created / edited From b5801f488f5e70356dc726db95443fd43474473c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 May 2021 12:36:26 +0000 Subject: [PATCH 06/22] Bump versions.kotlin from 1.4.32 to 1.5.10 Bumps `versions.kotlin` from 1.4.32 to 1.5.10. Updates `kotlin-gradle-plugin` from 1.4.32 to 1.5.10 - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v1.4.32...v1.5.10) Updates `kotlin-stdlib` from 1.4.32 to 1.5.10 - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v1.4.32...v1.5.10) Updates `kotlin-reflect` from 1.4.32 to 1.5.10 - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v1.4.32...v1.5.10) Updates `kotlin-test-junit` from 1.4.32 to 1.5.10 - [Release notes](https://github.com/JetBrains/kotlin/releases) - [Changelog](https://github.com/JetBrains/kotlin/blob/master/ChangeLog.md) - [Commits](https://github.com/JetBrains/kotlin/compare/v1.4.32...v1.5.10) Signed-off-by: dependabot[bot] --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 9d5e4339..458303b2 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -21,7 +21,7 @@ ext.versions = [ constraintLayout : "2.0.4", multidex : "2.0.1", room : "2.2.6", - kotlin : "1.4.32", + kotlin : "1.5.10", kotlinxCoroutines : "1.4.3-native-mt", viewModelKtx : "2.2.0", From e1d3e61c74b6bc045cd2c0820775b8402b32fb10 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 May 2021 12:14:45 +0200 Subject: [PATCH 07/22] Bump kotlinx-coroutines-android from 1.4.3-native-mt to 1.5.0-native-mt Bumps [kotlinx-coroutines-android](https://github.com/Kotlin/kotlinx.coroutines) from 1.4.3-native-mt to 1.5.0-native-mt. - [Release notes](https://github.com/Kotlin/kotlinx.coroutines/releases) - [Changelog](https://github.com/Kotlin/kotlinx.coroutines/blob/master/CHANGES.md) - [Commits](https://github.com/Kotlin/kotlinx.coroutines/commits) --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 458303b2..57a29674 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -22,7 +22,7 @@ ext.versions = [ multidex : "2.0.1", room : "2.2.6", kotlin : "1.5.10", - kotlinxCoroutines : "1.4.3-native-mt", + kotlinxCoroutines : "1.5.0-native-mt", viewModelKtx : "2.2.0", retrofit : "2.6.4", From d8500e45e4ee2156bc02a7fdddbb30877f01c41f Mon Sep 17 00:00:00 2001 From: tzugen Date: Tue, 18 May 2021 12:30:45 +0200 Subject: [PATCH 08/22] Kotlin and Room need to be updated at the same time. --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 57a29674..5ecfc4d3 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -20,7 +20,7 @@ ext.versions = [ androidSupportDesign : "1.3.0", constraintLayout : "2.0.4", multidex : "2.0.1", - room : "2.2.6", + room : "2.3.0", kotlin : "1.5.10", kotlinxCoroutines : "1.5.0-native-mt", viewModelKtx : "2.2.0", From f9401ba1fade1400344d11cc89c85dd1144a84bd Mon Sep 17 00:00:00 2001 From: tzugen Date: Mon, 24 May 2021 12:04:18 +0200 Subject: [PATCH 09/22] Apply JVM Target to all Kotlin tasks --- build.gradle | 7 +++++++ gradle_scripts/android-module-bootstrap.gradle | 4 ---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 597d384a..d6d7c22f 100644 --- a/build.gradle +++ b/build.gradle @@ -35,6 +35,13 @@ allprojects { google() maven { url 'https://jitpack.io' } } + + // Set Kotlin JVM target to the same for all subprojects + tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { + kotlinOptions { + jvmTarget = "1.8" + } + } } apply from: 'gradle_scripts/jacoco.gradle' diff --git a/gradle_scripts/android-module-bootstrap.gradle b/gradle_scripts/android-module-bootstrap.gradle index f9fa091a..847827e7 100644 --- a/gradle_scripts/android-module-bootstrap.gradle +++ b/gradle_scripts/android-module-bootstrap.gradle @@ -13,10 +13,6 @@ android { targetSdkVersion versions.targetSdk } - kotlinOptions { - jvmTarget = "1.8" - } - compileOptions { // Sets Java compatibility to Java 8 sourceCompatibility JavaVersion.VERSION_1_8 From 71068fe635cba7dec61e1cb1efe25d347b8240aa Mon Sep 17 00:00:00 2001 From: tzugen Date: Thu, 27 May 2021 12:15:56 +0200 Subject: [PATCH 10/22] Upgrade Koin to 3.0.2 --- dependencies.gradle | 2 +- ultrasonic/build.gradle | 2 -- .../ultrasonic/fragment/PlayerFragment.java | 3 ++- .../moire/ultrasonic/util/CacheCleaner.java | 2 +- .../ultrasonic/activity/NavigationActivity.kt | 2 +- .../di/AppPermanentStorageModule.kt | 2 +- .../ultrasonic/fragment/AlbumListFragment.kt | 2 -- .../ultrasonic/fragment/AlbumListModel.kt | 2 -- .../ultrasonic/fragment/ArtistListFragment.kt | 2 -- .../ultrasonic/fragment/ArtistListModel.kt | 2 -- .../ultrasonic/fragment/EditServerFragment.kt | 2 +- .../fragment/GenericListFragment.kt | 4 +--- .../ultrasonic/fragment/GenericListModel.kt | 2 -- .../fragment/ServerSelectorFragment.kt | 2 +- .../fragment/TrackCollectionFragment.kt | 2 -- .../fragment/TrackCollectionModel.kt | 2 -- .../ultrasonic/service/AudioFocusHandler.kt | 3 ++- .../ultrasonic/service/CachedMusicService.kt | 14 ++++++------- .../moire/ultrasonic/service/DownloadFile.kt | 12 +++++------ .../ultrasonic/service/LocalMediaPlayer.kt | 2 -- .../service/MediaPlayerController.kt | 16 +++++++-------- .../ultrasonic/service/MusicServiceFactory.kt | 2 -- .../ultrasonic/service/OfflineMusicService.kt | 13 ++++++------ .../ultrasonic/subsonic/DownloadHandler.kt | 2 -- .../subsonic/ImageLoaderProvider.kt | 12 +++++------ .../org/moire/ultrasonic/view/SongView.kt | 20 +++++++++---------- 26 files changed, 53 insertions(+), 78 deletions(-) diff --git a/dependencies.gradle b/dependencies.gradle index 5ecfc4d3..068f738b 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -29,7 +29,7 @@ ext.versions = [ jackson : "2.9.5", okhttp : "3.12.13", twitterSerial : "0.1.6", - koin : "2.2.2", + koin : "3.0.2", picasso : "2.71828", sortListView : "1.0.1", diff --git a/ultrasonic/build.gradle b/ultrasonic/build.gradle index f8530d95..f9426351 100644 --- a/ultrasonic/build.gradle +++ b/ultrasonic/build.gradle @@ -56,7 +56,6 @@ android { kotlinOptions { jvmTarget = "1.8" - freeCompilerArgs += "-Xopt-in=org.koin.core.component.KoinApiExtension" } compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 @@ -94,7 +93,6 @@ dependencies { implementation other.kotlinStdlib implementation other.kotlinxCoroutines implementation other.koinAndroid - implementation other.koinViewModel implementation other.okhttpLogging implementation other.fastScroll implementation other.sortListView diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/PlayerFragment.java b/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/PlayerFragment.java index a2f5881b..4f662d60 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/PlayerFragment.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/fragment/PlayerFragment.java @@ -162,7 +162,8 @@ public class PlayerFragment extends Fragment implements GestureDetector.OnGestur setHasOptionsMenu(true); - useFiveStarRating = KoinJavaComponent.get(FeatureStorage.class).isFeatureEnabled(Feature.FIVE_STAR_RATING); + FeatureStorage features = KoinJavaComponent.get(FeatureStorage.class); + useFiveStarRating = features.isFeatureEnabled(Feature.FIVE_STAR_RATING); swipeDistance = (width + height) * PERCENTAGE_OF_SCREEN_FOR_SWIPE / 100; swipeVelocity = swipeDistance; diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/util/CacheCleaner.java b/ultrasonic/src/main/java/org/moire/ultrasonic/util/CacheCleaner.java index a63c8875..c09d6edc 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/util/CacheCleaner.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/util/CacheCleaner.java @@ -23,7 +23,7 @@ import kotlin.Lazy; import static org.koin.java.KoinJavaComponent.inject; /** - * Responsible for cleaning up files from the offline download cache on the filesystem + * Responsible for cleaning up files from the offline download cache on the filesystem. */ public class CacheCleaner { diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt index ed7245cb..54f88c30 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt @@ -28,7 +28,7 @@ import androidx.navigation.ui.setupWithNavController import androidx.preference.PreferenceManager import com.google.android.material.navigation.NavigationView import org.koin.android.ext.android.inject -import org.koin.android.viewmodel.ext.android.viewModel +import org.koin.androidx.viewmodel.ext.android.viewModel import org.moire.ultrasonic.R import org.moire.ultrasonic.data.ActiveServerProvider.Companion.isOffline import org.moire.ultrasonic.domain.PlayerState diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/di/AppPermanentStorageModule.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/di/AppPermanentStorageModule.kt index 89c5cbc3..e92454b4 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/di/AppPermanentStorageModule.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/di/AppPermanentStorageModule.kt @@ -2,7 +2,7 @@ package org.moire.ultrasonic.di import androidx.room.Room import org.koin.android.ext.koin.androidContext -import org.koin.android.viewmodel.dsl.viewModel +import org.koin.androidx.viewmodel.dsl.viewModel import org.koin.core.qualifier.named import org.koin.dsl.module import org.moire.ultrasonic.data.AppDatabase diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/AlbumListFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/AlbumListFragment.kt index f5b4b4e4..75b93057 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/AlbumListFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/AlbumListFragment.kt @@ -6,7 +6,6 @@ import androidx.fragment.app.viewModels import androidx.lifecycle.LiveData import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.RecyclerView -import org.koin.core.component.KoinApiExtension import org.moire.ultrasonic.R import org.moire.ultrasonic.domain.MusicDirectory import org.moire.ultrasonic.util.Constants @@ -15,7 +14,6 @@ import org.moire.ultrasonic.util.Constants * Displays a list of Albums from the media library * TODO: Check refresh is working */ -@KoinApiExtension class AlbumListFragment : GenericListFragment() { /** diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/AlbumListModel.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/AlbumListModel.kt index 7c927044..5a6e1ba8 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/AlbumListModel.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/AlbumListModel.kt @@ -5,14 +5,12 @@ import android.os.Bundle import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.swiperefreshlayout.widget.SwipeRefreshLayout -import org.koin.core.component.KoinApiExtension import org.moire.ultrasonic.api.subsonic.models.AlbumListType import org.moire.ultrasonic.domain.MusicDirectory import org.moire.ultrasonic.service.MusicService import org.moire.ultrasonic.util.Constants import org.moire.ultrasonic.util.Util -@KoinApiExtension class AlbumListModel(application: Application) : GenericListModel(application) { val albumList: MutableLiveData> = MutableLiveData() diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ArtistListFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ArtistListFragment.kt index ddda850b..6b48979c 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ArtistListFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ArtistListFragment.kt @@ -3,7 +3,6 @@ package org.moire.ultrasonic.fragment import android.os.Bundle import androidx.fragment.app.viewModels import androidx.lifecycle.LiveData -import org.koin.core.component.KoinApiExtension import org.moire.ultrasonic.R import org.moire.ultrasonic.domain.Artist import org.moire.ultrasonic.util.Constants @@ -11,7 +10,6 @@ import org.moire.ultrasonic.util.Constants /** * Displays the list of Artists from the media library */ -@KoinApiExtension class ArtistListFragment : GenericListFragment() { /** diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ArtistListModel.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ArtistListModel.kt index 2611e3d2..d58e97ca 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ArtistListModel.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ArtistListModel.kt @@ -23,14 +23,12 @@ import android.os.Bundle import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.swiperefreshlayout.widget.SwipeRefreshLayout -import org.koin.core.component.KoinApiExtension import org.moire.ultrasonic.domain.Artist import org.moire.ultrasonic.service.MusicService /** * Provides ViewModel which contains the list of available Artists */ -@KoinApiExtension class ArtistListModel(application: Application) : GenericListModel(application) { private val artists: MutableLiveData> = MutableLiveData() diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt index 12519813..1647fdeb 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt @@ -14,7 +14,7 @@ import com.google.android.material.textfield.TextInputLayout import java.net.MalformedURLException import java.net.URL import org.koin.android.ext.android.inject -import org.koin.android.viewmodel.ext.android.viewModel +import org.koin.androidx.viewmodel.ext.android.viewModel import org.moire.ultrasonic.BuildConfig import org.moire.ultrasonic.R import org.moire.ultrasonic.api.subsonic.SubsonicAPIClient diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/GenericListFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/GenericListFragment.kt index 723193ad..2862eaa8 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/GenericListFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/GenericListFragment.kt @@ -13,8 +13,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.swiperefreshlayout.widget.SwipeRefreshLayout import org.koin.android.ext.android.inject -import org.koin.android.viewmodel.ext.android.viewModel -import org.koin.core.component.KoinApiExtension +import org.koin.androidx.viewmodel.ext.android.viewModel import org.moire.ultrasonic.R import org.moire.ultrasonic.data.ActiveServerProvider import org.moire.ultrasonic.domain.Artist @@ -31,7 +30,6 @@ import org.moire.ultrasonic.view.SelectMusicFolderView * @param T: The type of data which will be used (must extend GenericEntry) * @param TA: The Adapter to use (must extend GenericRowAdapter) */ -@KoinApiExtension abstract class GenericListFragment> : Fragment() { internal val activeServerProvider: ActiveServerProvider by inject() internal val serverSettingsModel: ServerSettingsModel by viewModel() diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/GenericListModel.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/GenericListModel.kt index 810e90f5..bf377eed 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/GenericListModel.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/GenericListModel.kt @@ -15,7 +15,6 @@ import java.net.UnknownHostException import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.withContext -import org.koin.core.component.KoinApiExtension import org.koin.core.component.KoinComponent import org.koin.core.component.inject import org.moire.ultrasonic.data.ActiveServerProvider @@ -29,7 +28,6 @@ import org.moire.ultrasonic.util.Util /** * An abstract Model, which can be extended to retrieve a list of items from the API */ -@KoinApiExtension open class GenericListModel(application: Application) : AndroidViewModel(application), KoinComponent { diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ServerSelectorFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ServerSelectorFragment.kt index a7093210..bde3efd5 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ServerSelectorFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ServerSelectorFragment.kt @@ -15,7 +15,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.runBlocking import kotlinx.coroutines.withContext import org.koin.android.ext.android.inject -import org.koin.android.viewmodel.ext.android.viewModel +import org.koin.androidx.viewmodel.ext.android.viewModel import org.moire.ultrasonic.R import org.moire.ultrasonic.data.ActiveServerProvider import org.moire.ultrasonic.fragment.EditServerFragment.Companion.EDIT_SERVER_INTENT_INDEX diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt index 08dd7fd7..2d544ef1 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionFragment.kt @@ -33,7 +33,6 @@ import java.util.Random import kotlinx.coroutines.CoroutineExceptionHandler import kotlinx.coroutines.launch import org.koin.android.ext.android.inject -import org.koin.core.component.KoinApiExtension import org.moire.ultrasonic.R import org.moire.ultrasonic.data.ActiveServerProvider.Companion.isOffline import org.moire.ultrasonic.domain.MusicDirectory @@ -60,7 +59,6 @@ import timber.log.Timber * Displays a group of tracks, eg. the songs of an album, of a playlist etc. * TODO: Refactor this fragment and model to extend the GenericListFragment */ -@KoinApiExtension class TrackCollectionFragment : Fragment() { private var refreshAlbumListView: SwipeRefreshLayout? = null diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionModel.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionModel.kt index 45b2d81a..c6ca882a 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionModel.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/TrackCollectionModel.kt @@ -13,7 +13,6 @@ import androidx.lifecycle.MutableLiveData import java.util.LinkedList import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import org.koin.core.component.KoinApiExtension import org.moire.ultrasonic.R import org.moire.ultrasonic.domain.MusicDirectory import org.moire.ultrasonic.service.MusicService @@ -24,7 +23,6 @@ import org.moire.ultrasonic.util.Util * Model for retrieving different collections of tracks from the API * TODO: Refactor this model to extend the GenericListModel */ -@KoinApiExtension class TrackCollectionModel(application: Application) : GenericListModel(application) { private val allSongsId = "-1" diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/AudioFocusHandler.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/AudioFocusHandler.kt index dbd107b8..0d3e7791 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/AudioFocusHandler.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/AudioFocusHandler.kt @@ -18,7 +18,8 @@ import timber.log.Timber class AudioFocusHandler(private val context: Context) { // TODO: This is a circular reference, try to remove it // This should be doable by using the native MediaController framework - private val mediaPlayerControllerLazy = inject(MediaPlayerController::class.java) + private val mediaPlayerControllerLazy = + inject(MediaPlayerController::class.java) private val audioManager by lazy { context.getSystemService(Context.AUDIO_SERVICE) as AudioManager diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/CachedMusicService.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/CachedMusicService.kt index 1086a797..0f280258 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/CachedMusicService.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/CachedMusicService.kt @@ -9,7 +9,8 @@ package org.moire.ultrasonic.service import android.graphics.Bitmap import java.io.InputStream import java.util.concurrent.TimeUnit -import org.koin.java.KoinJavaComponent.inject +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject import org.moire.ultrasonic.data.ActiveServerProvider import org.moire.ultrasonic.domain.Bookmark import org.moire.ultrasonic.domain.ChatMessage @@ -31,10 +32,9 @@ import org.moire.ultrasonic.util.TimeLimitedCache import org.moire.ultrasonic.util.Util @Suppress("TooManyFunctions") -class CachedMusicService(private val musicService: MusicService) : MusicService { - private val activeServerProvider = inject( - ActiveServerProvider::class.java - ) +class CachedMusicService(private val musicService: MusicService) : MusicService, KoinComponent { + private val activeServerProvider: ActiveServerProvider by inject() + private val cachedMusicDirectories: LRUCache> private val cachedArtist: LRUCache> private val cachedAlbum: LRUCache> @@ -308,8 +308,8 @@ class CachedMusicService(private val musicService: MusicService) : MusicService } private fun checkSettingsChanged() { - val newUrl = activeServerProvider.value.getRestUrl(null) - val newFolderId = activeServerProvider.value.getActiveServer().musicFolderId + val newUrl = activeServerProvider.getRestUrl(null) + val newFolderId = activeServerProvider.getActiveServer().musicFolderId if (!Util.equals(newUrl, restUrl) || !Util.equals(cachedMusicFolderId, newFolderId)) { cachedMusicFolders.clear() cachedMusicDirectories.clear() diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/DownloadFile.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/DownloadFile.kt index 6c75e62d..fd98da9b 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/DownloadFile.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/DownloadFile.kt @@ -19,8 +19,8 @@ import java.io.IOException import java.io.InputStream import java.io.OutputStream import java.io.RandomAccessFile -import org.koin.core.component.KoinApiExtension -import org.koin.java.KoinJavaComponent.inject +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject import org.moire.ultrasonic.app.UApp import org.moire.ultrasonic.domain.MusicDirectory import org.moire.ultrasonic.service.MusicServiceFactory.getMusicService @@ -36,11 +36,10 @@ import timber.log.Timber * @author Sindre Mehus * @version $Id$ */ -@KoinApiExtension class DownloadFile( val song: MusicDirectory.Entry, private val save: Boolean -) { +) : KoinComponent { val partialFile: File val completeFile: File private val saveFile: File = FileUtil.getSongFile(song) @@ -59,7 +58,7 @@ class DownloadFile( @Volatile private var completeWhenDone = false - private val downloader = inject(Downloader::class.java) + private val downloader: Downloader by inject() val progress: MutableLiveData = MutableLiveData(0) @@ -201,7 +200,6 @@ class DownloadFile( return String.format("DownloadFile (%s)", song) } - @KoinApiExtension @Suppress("TooGenericExceptionCaught") private inner class DownloadTask : CancellableTask() { override fun execute() { @@ -310,7 +308,7 @@ class DownloadFile( } wifiLock?.release() CacheCleaner().cleanSpace() - downloader.value.checkDownloads() + downloader.checkDownloads() } } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/LocalMediaPlayer.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/LocalMediaPlayer.kt index 0e4c2503..eae455c1 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/LocalMediaPlayer.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/LocalMediaPlayer.kt @@ -25,7 +25,6 @@ import java.net.URLEncoder import java.util.Locale import kotlin.math.abs import kotlin.math.max -import org.koin.core.component.KoinApiExtension import org.moire.ultrasonic.audiofx.EqualizerController import org.moire.ultrasonic.audiofx.VisualizerController import org.moire.ultrasonic.data.ActiveServerProvider.Companion.isOffline @@ -40,7 +39,6 @@ import timber.log.Timber /** * Represents a Media Player which uses the mobile's resources for playback */ -@KoinApiExtension class LocalMediaPlayer( private val audioFocusHandler: AudioFocusHandler, private val context: Context diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerController.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerController.kt index 7f88a75d..e8f3c4f0 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerController.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MediaPlayerController.kt @@ -7,9 +7,9 @@ package org.moire.ultrasonic.service import android.content.Intent -import org.koin.core.component.KoinApiExtension -import org.koin.java.KoinJavaComponent.get -import org.koin.java.KoinJavaComponent.inject +import org.koin.core.component.KoinComponent +import org.koin.core.component.get +import org.koin.core.component.inject import org.moire.ultrasonic.app.UApp import org.moire.ultrasonic.data.ActiveServerProvider import org.moire.ultrasonic.domain.MusicDirectory @@ -30,7 +30,6 @@ import timber.log.Timber * This class contains everything that is necessary for the Application UI * to control the Media Player implementation. */ -@KoinApiExtension @Suppress("TooManyFunctions") class MediaPlayerController( private val downloadQueueSerializer: DownloadQueueSerializer, @@ -38,7 +37,7 @@ class MediaPlayerController( private val downloader: Downloader, private val shufflePlayBuffer: ShufflePlayBuffer, private val localMediaPlayer: LocalMediaPlayer -) { +) : KoinComponent { private var created = false var suggestedPlaylistName: String? = null @@ -46,8 +45,8 @@ class MediaPlayerController( var showVisualization = false private var autoPlayStart = false - private val jukeboxMediaPlayer = inject(JukeboxMediaPlayer::class.java).value - private val activeServerProvider = inject(ActiveServerProvider::class.java).value + private val jukeboxMediaPlayer: JukeboxMediaPlayer by inject() + private val activeServerProvider: ActiveServerProvider by inject() fun onCreate() { if (created) return @@ -462,7 +461,8 @@ class MediaPlayerController( @Suppress("TooGenericExceptionCaught") // The interface throws only generic exceptions fun setSongRating(rating: Int) { - if (!get(FeatureStorage::class.java).isFeatureEnabled(Feature.FIVE_STAR_RATING)) return + val features: FeatureStorage = get() + if (!features.isFeatureEnabled(Feature.FIVE_STAR_RATING)) return if (localMediaPlayer.currentPlaying == null) return val song = localMediaPlayer.currentPlaying!!.song song.userRating = rating diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MusicServiceFactory.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MusicServiceFactory.kt index 0f3f33df..02ddb4a5 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MusicServiceFactory.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/MusicServiceFactory.kt @@ -18,7 +18,6 @@ */ package org.moire.ultrasonic.service -import org.koin.core.component.KoinApiExtension import org.koin.core.component.KoinComponent import org.koin.core.component.get import org.koin.core.context.loadKoinModules @@ -30,7 +29,6 @@ import org.moire.ultrasonic.di.ONLINE_MUSIC_SERVICE import org.moire.ultrasonic.di.musicServiceModule // TODO Refactor everywhere to use DI way to get MusicService, and then remove this class -@KoinApiExtension object MusicServiceFactory : KoinComponent { @JvmStatic fun getMusicService(): MusicService { diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/OfflineMusicService.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/OfflineMusicService.kt index 8e751382..6afed13d 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/OfflineMusicService.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/OfflineMusicService.kt @@ -22,7 +22,8 @@ import java.util.Locale import java.util.Random import java.util.concurrent.TimeUnit import java.util.regex.Pattern -import org.koin.java.KoinJavaComponent.inject +import org.koin.core.component.KoinComponent +import org.koin.core.component.inject import org.moire.ultrasonic.data.ActiveServerProvider import org.moire.ultrasonic.domain.Artist import org.moire.ultrasonic.domain.Bookmark @@ -47,10 +48,8 @@ import timber.log.Timber // TODO: There are quite a number of deeply nested and complicated functions in this class.. // Simplify them :) @Suppress("TooManyFunctions") -class OfflineMusicService : MusicService { - private val activeServerProvider = inject( - ActiveServerProvider::class.java - ) +class OfflineMusicService : MusicService, KoinComponent { + private val activeServerProvider: ActiveServerProvider by inject() override fun getIndexes(musicFolderId: String?, refresh: Boolean): Indexes { val artists: MutableList = ArrayList() @@ -85,7 +84,7 @@ class OfflineMusicService : MusicService { lhs = lhs.substring(article.length + 1) } index = rhs.indexOf( - String.format(Locale.ROOT, "%s ", article.toLowerCase(Locale.ROOT)) + String.format(Locale.ROOT, "%s ", article.lowercase(Locale.ROOT)) ) if (index == 0) { rhs = rhs.substring(article.length + 1) @@ -253,7 +252,7 @@ class OfflineMusicService : MusicService { @Throws(Exception::class) override fun createPlaylist(id: String, name: String, entries: List) { val playlistFile = - FileUtil.getPlaylistFile(activeServerProvider.value.getActiveServer().name, name) + FileUtil.getPlaylistFile(activeServerProvider.getActiveServer().name, name) val fw = FileWriter(playlistFile) val bw = BufferedWriter(fw) try { diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/DownloadHandler.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/DownloadHandler.kt index 7782d8a0..b30490ac 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/DownloadHandler.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/DownloadHandler.kt @@ -5,7 +5,6 @@ import androidx.fragment.app.Fragment import androidx.navigation.fragment.findNavController import java.util.Collections import java.util.LinkedList -import org.koin.core.component.KoinApiExtension import org.moire.ultrasonic.R import org.moire.ultrasonic.data.ActiveServerProvider.Companion.isOffline import org.moire.ultrasonic.domain.MusicDirectory @@ -20,7 +19,6 @@ import org.moire.ultrasonic.util.Util * Retrieves a list of songs and adds them to the now playing list */ @Suppress("LongParameterList") -@KoinApiExtension class DownloadHandler( val mediaPlayerController: MediaPlayerController, val networkAndStorageChecker: NetworkAndStorageChecker diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/ImageLoaderProvider.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/ImageLoaderProvider.kt index 549b9e8e..3ee6bf53 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/ImageLoaderProvider.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/subsonic/ImageLoaderProvider.kt @@ -1,10 +1,10 @@ package org.moire.ultrasonic.subsonic import android.content.Context -import org.koin.java.KoinJavaComponent.get +import org.koin.core.component.KoinComponent +import org.koin.core.component.get import org.moire.ultrasonic.featureflags.Feature import org.moire.ultrasonic.featureflags.FeatureStorage -import org.moire.ultrasonic.subsonic.loader.image.SubsonicImageLoader import org.moire.ultrasonic.util.ImageLoader import org.moire.ultrasonic.util.LegacyImageLoader import org.moire.ultrasonic.util.Util @@ -12,7 +12,7 @@ import org.moire.ultrasonic.util.Util /** * Handles the lifetime of the Image Loader */ -class ImageLoaderProvider(val context: Context) { +class ImageLoaderProvider(val context: Context) : KoinComponent { private var imageLoader: ImageLoader? = null @Synchronized @@ -33,12 +33,12 @@ class ImageLoaderProvider(val context: Context) { context, Util.getImageLoaderConcurrency() ) - val isNewImageLoaderEnabled = get(FeatureStorage::class.java) - .isFeatureEnabled(Feature.NEW_IMAGE_DOWNLOADER) + val features: FeatureStorage = get() + val isNewImageLoaderEnabled = features.isFeatureEnabled(Feature.NEW_IMAGE_DOWNLOADER) imageLoader = if (isNewImageLoaderEnabled) { SubsonicImageLoaderProxy( legacyImageLoader, - get(SubsonicImageLoader::class.java) + get() ) } else { legacyImageLoader diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/view/SongView.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/view/SongView.kt index 165f4ab1..3a4638c7 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/view/SongView.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/view/SongView.kt @@ -24,8 +24,9 @@ import android.graphics.drawable.Drawable import android.text.TextUtils import android.view.LayoutInflater import android.widget.Checkable -import org.koin.java.KoinJavaComponent.get -import org.koin.java.KoinJavaComponent.inject +import org.koin.core.component.KoinComponent +import org.koin.core.component.get +import org.koin.core.component.inject import org.moire.ultrasonic.R import org.moire.ultrasonic.data.ActiveServerProvider.Companion.isOffline import org.moire.ultrasonic.domain.MusicDirectory @@ -42,7 +43,7 @@ import timber.log.Timber /** * Used to display songs and videos in a `ListView`. */ -class SongView(context: Context) : UpdateView(context), Checkable { +class SongView(context: Context) : UpdateView(context), Checkable, KoinComponent { var entry: MusicDirectory.Entry? = null private set @@ -55,10 +56,9 @@ class SongView(context: Context) : UpdateView(context), Checkable { private var downloadFile: DownloadFile? = null private var playing = false private var viewHolder: SongViewHolder? = null - - private val useFiveStarRating: Boolean = - get(FeatureStorage::class.java).isFeatureEnabled(Feature.FIVE_STAR_RATING) - private val mediaPlayerControllerLazy = inject(MediaPlayerController::class.java) + private val features: FeatureStorage = get() + private val useFiveStarRating: Boolean = features.isFeatureEnabled(Feature.FIVE_STAR_RATING) + private val mediaPlayerController: MediaPlayerController by inject() fun setLayout(song: MusicDirectory.Entry) { @@ -96,7 +96,7 @@ class SongView(context: Context) : UpdateView(context), Checkable { updateBackground() entry = song - downloadFile = mediaPlayerControllerLazy.value.getDownloadFileForSong(song) + downloadFile = mediaPlayerController.getDownloadFileForSong(song) val artist = StringBuilder(60) var bitRate: String? = null @@ -223,7 +223,7 @@ class SongView(context: Context) : UpdateView(context), Checkable { public override fun update() { updateBackground() - downloadFile = mediaPlayerControllerLazy.value.getDownloadFileForSong(entry) + downloadFile = mediaPlayerController.getDownloadFileForSong(entry) updateDownloadStatus(downloadFile!!) @@ -254,7 +254,7 @@ class SongView(context: Context) : UpdateView(context), Checkable { if (rating > 4) starDrawable else starHollowDrawable ) - val playing = mediaPlayerControllerLazy.value.currentPlaying === downloadFile + val playing = mediaPlayerController.currentPlaying === downloadFile if (playing) { if (!this.playing) { From 8aa1cf1e2cdcbe23f052b2a6e186da768c0357c4 Mon Sep 17 00:00:00 2001 From: tzugen Date: Fri, 28 May 2021 20:32:31 +0200 Subject: [PATCH 11/22] Fix Kotlin 1.5 deprecated calls --- .../subsonic/interceptors/PasswordMD5Interceptor.kt | 2 +- .../org/moire/ultrasonic/fragment/ArtistRowAdapter.kt | 2 +- .../moire/ultrasonic/service/OfflineMusicService.kt | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/PasswordMD5Interceptor.kt b/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/PasswordMD5Interceptor.kt index 75d6a48e..8a1c8388 100644 --- a/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/PasswordMD5Interceptor.kt +++ b/core/subsonic-api/src/main/kotlin/org/moire/ultrasonic/api/subsonic/interceptors/PasswordMD5Interceptor.kt @@ -39,7 +39,7 @@ class PasswordMD5Interceptor(private val password: String) : Interceptor { val md5Digest = MessageDigest.getInstance("MD5") return md5Digest.digest( "$password$salt".toByteArray() - ).toHexBytes().toLowerCase(Locale.getDefault()) + ).toHexBytes().lowercase(Locale.getDefault()) } catch (e: NoSuchAlgorithmException) { throw IllegalStateException(e) } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ArtistRowAdapter.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ArtistRowAdapter.kt index 30f76f4e..2e312225 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ArtistRowAdapter.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/ArtistRowAdapter.kt @@ -96,7 +96,7 @@ class ArtistRowAdapter( } private fun getSectionFromName(name: String): String { - var section = name.first().toUpperCase() + var section = name.first().uppercaseChar() if (!section.isLetter()) section = '#' return section.toString() } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/OfflineMusicService.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/OfflineMusicService.kt index 6afed13d..f1fc7f43 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/OfflineMusicService.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/service/OfflineMusicService.kt @@ -66,8 +66,8 @@ class OfflineMusicService : MusicService, KoinComponent { val ignoredArticlesString = "The El La Los Las Le Les" val ignoredArticles = COMPILE.split(ignoredArticlesString) artists.sortWith { lhsArtist, rhsArtist -> - var lhs = lhsArtist.name!!.toLowerCase(Locale.ROOT) - var rhs = rhsArtist.name!!.toLowerCase(Locale.ROOT) + var lhs = lhsArtist.name!!.lowercase(Locale.ROOT) + var rhs = rhsArtist.name!!.lowercase(Locale.ROOT) val lhs1 = lhs[0] val rhs1 = rhs[0] if (Character.isDigit(lhs1) && !Character.isDigit(rhs1)) { @@ -78,7 +78,7 @@ class OfflineMusicService : MusicService, KoinComponent { } for (article in ignoredArticles) { var index = lhs.indexOf( - String.format(Locale.ROOT, "%s ", article.toLowerCase(Locale.ROOT)) + String.format(Locale.ROOT, "%s ", article.lowercase(Locale.ROOT)) ) if (index == 0) { lhs = lhs.substring(article.length + 1) @@ -667,10 +667,10 @@ class OfflineMusicService : MusicService, KoinComponent { } private fun matchCriteria(criteria: SearchCriteria, name: String?): Int { - val query = criteria.query.toLowerCase(Locale.ROOT) + val query = criteria.query.lowercase(Locale.ROOT) val queryParts = COMPILE.split(query) val nameParts = COMPILE.split( - name!!.toLowerCase(Locale.ROOT) + name!!.lowercase(Locale.ROOT) ) var closeness = 0 for (queryPart in queryParts) { From 2050e21c9c5fe71bb7c3c47830a339275f810a05 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 29 May 2021 08:35:39 +0000 Subject: [PATCH 12/22] Bump detekt-gradle-plugin from 1.17.0 to 1.17.1 Bumps [detekt-gradle-plugin](https://github.com/detekt/detekt) from 1.17.0 to 1.17.1. - [Release notes](https://github.com/detekt/detekt/releases) - [Commits](https://github.com/detekt/detekt/compare/v1.17.0...v1.17.1) Signed-off-by: dependabot[bot] --- dependencies.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dependencies.gradle b/dependencies.gradle index 068f738b..aa0f257b 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -10,7 +10,7 @@ ext.versions = [ androidxcore : "1.5.0", ktlint : "0.37.1", ktlintGradle : "9.2.1", - detekt : "1.17.0", + detekt : "1.17.1", jacoco : "0.8.7", preferences : "1.1.1", media : "1.3.1", From fd48367cab22fc3e27a578cbe167d78249207bd4 Mon Sep 17 00:00:00 2001 From: Maxence G Date: Sat, 29 May 2021 15:00:46 +0200 Subject: [PATCH 13/22] Reduce function length --- .../java/org/moire/ultrasonic/util/Util.java | 14 ---- .../ultrasonic/activity/NavigationActivity.kt | 10 +-- .../org/moire/ultrasonic/data/AppDatabase.kt | 8 +- .../moire/ultrasonic/data/ServerSetting.kt | 8 +- .../ultrasonic/fragment/EditServerFragment.kt | 82 ++++++++----------- 5 files changed, 48 insertions(+), 74 deletions(-) diff --git a/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java b/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java index fc4fce23..82366ed6 100644 --- a/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java +++ b/ultrasonic/src/main/java/org/moire/ultrasonic/util/Util.java @@ -359,20 +359,6 @@ public class Util return Math.min(Math.max(percent,0),100) + " %"; } - /** - * Return a Mark depending on boolean (❌ or ✓) - * - * @param value Is true or false - * @return The corresponding mark. - */ - public static String boolToMark(boolean value) - { - if (value) - return "✔️"; - else - return "❌"; - } - /** * Converts a byte-count to a formatted string suitable for display to the user. diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt index 2a1f97c0..f81c99b8 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt @@ -377,10 +377,10 @@ class NavigationActivity : AppCompatActivity() { podcastsMenuItem?.isVisible = false return } - val activeServerProvider = inject(ActiveServerProvider::class.java) - chatMenuItem?.isVisible = activeServerProvider.value.getActiveServer().chatSupport - bookmarksMenuItem?.isVisible = activeServerProvider.value.getActiveServer().bookmarkSupport - sharesMenuItem?.isVisible = activeServerProvider.value.getActiveServer().shareSupport - podcastsMenuItem?.isVisible = activeServerProvider.value.getActiveServer().podcastSupport + val activeServerProvider = inject(ActiveServerProvider::class.java).value.getActiveServer() + chatMenuItem?.isVisible = activeServerProvider.chatSupport != false + bookmarksMenuItem?.isVisible = activeServerProvider.bookmarkSupport != false + sharesMenuItem?.isVisible = activeServerProvider.shareSupport != false + podcastsMenuItem?.isVisible = activeServerProvider.podcastSupport != false } } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/AppDatabase.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/AppDatabase.kt index a29f895f..e4aa77dc 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/AppDatabase.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/AppDatabase.kt @@ -28,16 +28,16 @@ val MIGRATION_1_2: Migration = object : Migration(1, 2) { val MIGRATION_2_3: Migration = object : Migration(2, 3) { override fun migrate(database: SupportSQLiteDatabase) { database.execSQL( - "ALTER TABLE ServerSetting ADD COLUMN chatSupport INTEGER NOT NULL DEFAULT(1)" + "ALTER TABLE ServerSetting ADD COLUMN chatSupport INTEGER" ) database.execSQL( - "ALTER TABLE ServerSetting ADD COLUMN bookmarkSupport INTEGER NOT NULL DEFAULT(1)" + "ALTER TABLE ServerSetting ADD COLUMN bookmarkSupport INTEGER" ) database.execSQL( - "ALTER TABLE ServerSetting ADD COLUMN shareSupport INTEGER NOT NULL DEFAULT(1)" + "ALTER TABLE ServerSetting ADD COLUMN shareSupport INTEGER" ) database.execSQL( - "ALTER TABLE ServerSetting ADD COLUMN podcastSupport INTEGER NOT NULL DEFAULT(1)" + "ALTER TABLE ServerSetting ADD COLUMN podcastSupport INTEGER" ) } } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/ServerSetting.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/ServerSetting.kt index f1597e87..705f526a 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/ServerSetting.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/data/ServerSetting.kt @@ -30,10 +30,10 @@ data class ServerSetting( @ColumnInfo(name = "ldapSupport") var ldapSupport: Boolean, @ColumnInfo(name = "musicFolderId") var musicFolderId: String?, @ColumnInfo(name = "minimumApiVersion") var minimumApiVersion: String?, - @ColumnInfo(name = "chatSupport") var chatSupport: Boolean = true, - @ColumnInfo(name = "bookmarkSupport") var bookmarkSupport: Boolean = true, - @ColumnInfo(name = "shareSupport") var shareSupport: Boolean = true, - @ColumnInfo(name = "podcastSupport") var podcastSupport: Boolean = true + @ColumnInfo(name = "chatSupport") var chatSupport: Boolean? = null, + @ColumnInfo(name = "bookmarkSupport") var bookmarkSupport: Boolean? = null, + @ColumnInfo(name = "shareSupport") var shareSupport: Boolean? = null, + @ColumnInfo(name = "podcastSupport") var podcastSupport: Boolean? = null ) { constructor() : this ( -1, 0, "", "", "", "", false, false, false, null, null diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt index d5767ce1..b2f6bf4a 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt @@ -11,9 +11,6 @@ import androidx.lifecycle.Observer import androidx.navigation.fragment.findNavController import com.google.android.material.switchmaterial.SwitchMaterial import com.google.android.material.textfield.TextInputLayout -import java.io.IOException -import java.net.MalformedURLException -import java.net.URL import org.koin.android.ext.android.inject import org.koin.android.viewmodel.ext.android.viewModel import org.moire.ultrasonic.BuildConfig @@ -29,7 +26,11 @@ import org.moire.ultrasonic.util.Constants import org.moire.ultrasonic.util.ErrorDialog import org.moire.ultrasonic.util.ModalBackgroundTask import org.moire.ultrasonic.util.Util +import retrofit2.Call import timber.log.Timber +import java.io.IOException +import java.net.MalformedURLException +import java.net.URL /** * Displays a form where server settings can be created / edited @@ -300,18 +301,36 @@ class EditServerFragment : Fragment(), OnBackPressedHandler { activity, false ) { + fun boolToMark(value: Boolean?): String { + if (value == null) + return "⌛" + return if (value) "✔️" else "❌" + } - @Throws(Throwable::class) - override fun doInBackground(): String { - - var progressString = - """ + fun getProgress(): String { + return String.format( + """ |%s - ${activity.resources.getString(R.string.button_bar_chat)} |%s - ${activity.resources.getString(R.string.button_bar_bookmarks)} |%s - ${activity.resources.getString(R.string.button_bar_shares)} |%s - ${activity.resources.getString(R.string.button_bar_podcasts)} - """.trimMargin() - updateProgress(String.format(progressString, "⌛", "⌛", "⌛", "⌛")) + """.trimMargin(), + boolToMark(currentServerSetting!!.chatSupport), + boolToMark(currentServerSetting!!.bookmarkSupport), + boolToMark(currentServerSetting!!.shareSupport), + boolToMark(currentServerSetting!!.podcastSupport) + ) + } + + @Throws(Throwable::class) + override fun doInBackground(): String { + + currentServerSetting!!.chatSupport = null + currentServerSetting!!.bookmarkSupport = null + currentServerSetting!!.shareSupport = null + currentServerSetting!!.podcastSupport = null + + updateProgress(getProgress()) val configuration = SubsonicClientConfiguration( currentServerSetting!!.url, @@ -340,72 +359,41 @@ class EditServerFragment : Fragment(), OnBackPressedHandler { pingResponse = subsonicApiClient.api.ping().execute() ApiCallResponseChecker.checkResponseSuccessful(pingResponse) - updateProgress(String.format(progressString, "⌛", "⌛", "⌛", "⌛")) - currentServerSetting!!.chatSupport = try { subsonicApiClient.api.getChatMessages().execute() true } catch (e: IOException) { false } - updateProgress( - String.format( - progressString, - Util.boolToMark(currentServerSetting!!.chatSupport), - "⌛", "⌛", "⌛" - ) - ) + updateProgress(getProgress()) currentServerSetting!!.bookmarkSupport = try { subsonicApiClient.api.getBookmarks().execute() true } catch (e: IOException) { false } - updateProgress( - String.format( - progressString, - Util.boolToMark(currentServerSetting!!.chatSupport), - Util.boolToMark(currentServerSetting!!.bookmarkSupport), - "⌛", "⌛" - ) - ) + updateProgress(getProgress()) currentServerSetting!!.shareSupport = try { subsonicApiClient.api.getShares().execute() true } catch (e: IOException) { false } - updateProgress( - String.format( - progressString, - Util.boolToMark(currentServerSetting!!.chatSupport), - Util.boolToMark(currentServerSetting!!.bookmarkSupport), - Util.boolToMark(currentServerSetting!!.shareSupport), - "⌛" - ) - ) + updateProgress(getProgress()) currentServerSetting!!.podcastSupport = try { subsonicApiClient.api.getPodcasts().execute() true } catch (e: IOException) { false } - // Finalize String before displaying it to Dialog - progressString = String.format( - progressString, - Util.boolToMark(currentServerSetting!!.chatSupport), - Util.boolToMark(currentServerSetting!!.bookmarkSupport), - Util.boolToMark(currentServerSetting!!.shareSupport), - Util.boolToMark(currentServerSetting!!.podcastSupport) - ) - updateProgress(progressString) + updateProgress(getProgress()) val licenseResponse = subsonicApiClient.api.getLicense().execute() ApiCallResponseChecker.checkResponseSuccessful(licenseResponse) if (!licenseResponse.body()!!.license.valid) { - progressString += "\n" + + return getProgress() + "\n" + activity.resources.getString(R.string.settings_testing_unlicensed) } - return progressString + return getProgress() } override fun done(responseString: String) { From 075b80c01fc818c08cd20562042cafa60955181d Mon Sep 17 00:00:00 2001 From: Maxence G Date: Sat, 29 May 2021 15:30:01 +0200 Subject: [PATCH 14/22] Fix new active server getter --- .../moire/ultrasonic/activity/NavigationActivity.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt index 126454b5..c30e689f 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt @@ -377,10 +377,10 @@ class NavigationActivity : AppCompatActivity() { podcastsMenuItem?.isVisible = false return } - val activeServerProvider = inject(ActiveServerProvider::class.java).value.getActiveServer() - chatMenuItem?.isVisible = activeServerProvider.chatSupport != false - bookmarksMenuItem?.isVisible = activeServerProvider.bookmarkSupport != false - sharesMenuItem?.isVisible = activeServerProvider.shareSupport != false - podcastsMenuItem?.isVisible = activeServerProvider.podcastSupport != false + val activeServerProvider: ActiveServerProvider by inject() + chatMenuItem?.isVisible = activeServerProvider.getActiveServer().chatSupport != false + bookmarksMenuItem?.isVisible = activeServerProvider.getActiveServer().bookmarkSupport != false + sharesMenuItem?.isVisible = activeServerProvider.getActiveServer().shareSupport != false + podcastsMenuItem?.isVisible = activeServerProvider.getActiveServer().podcastSupport != false } } From 3e0873537410ad41331671a88cfa0a5b7593a58b Mon Sep 17 00:00:00 2001 From: Maxence G Date: Sat, 29 May 2021 15:42:15 +0200 Subject: [PATCH 15/22] run ktlint --- .../ultrasonic/fragment/EditServerFragment.kt | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt index d8776c14..f4b6d757 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt @@ -11,6 +11,9 @@ import androidx.lifecycle.Observer import androidx.navigation.fragment.findNavController import com.google.android.material.switchmaterial.SwitchMaterial import com.google.android.material.textfield.TextInputLayout +import java.io.IOException +import java.net.MalformedURLException +import java.net.URL import org.koin.android.ext.android.inject import org.koin.androidx.viewmodel.ext.android.viewModel import org.moire.ultrasonic.BuildConfig @@ -26,11 +29,7 @@ import org.moire.ultrasonic.util.Constants import org.moire.ultrasonic.util.ErrorDialog import org.moire.ultrasonic.util.ModalBackgroundTask import org.moire.ultrasonic.util.Util -import retrofit2.Call import timber.log.Timber -import java.io.IOException -import java.net.MalformedURLException -import java.net.URL /** * Displays a form where server settings can be created / edited @@ -309,16 +308,16 @@ class EditServerFragment : Fragment(), OnBackPressedHandler { fun getProgress(): String { return String.format( - """ + """ |%s - ${activity.resources.getString(R.string.button_bar_chat)} |%s - ${activity.resources.getString(R.string.button_bar_bookmarks)} |%s - ${activity.resources.getString(R.string.button_bar_shares)} |%s - ${activity.resources.getString(R.string.button_bar_podcasts)} """.trimMargin(), - boolToMark(currentServerSetting!!.chatSupport), - boolToMark(currentServerSetting!!.bookmarkSupport), - boolToMark(currentServerSetting!!.shareSupport), - boolToMark(currentServerSetting!!.podcastSupport) + boolToMark(currentServerSetting!!.chatSupport), + boolToMark(currentServerSetting!!.bookmarkSupport), + boolToMark(currentServerSetting!!.shareSupport), + boolToMark(currentServerSetting!!.podcastSupport) ) } @@ -362,28 +361,36 @@ class EditServerFragment : Fragment(), OnBackPressedHandler { currentServerSetting!!.chatSupport = try { subsonicApiClient.api.getChatMessages().execute() true - } catch (e: IOException) { false } + } catch (e: IOException) { + false + } updateProgress(getProgress()) currentServerSetting!!.bookmarkSupport = try { subsonicApiClient.api.getBookmarks().execute() true - } catch (e: IOException) { false } + } catch (e: IOException) { + false + } updateProgress(getProgress()) currentServerSetting!!.shareSupport = try { subsonicApiClient.api.getShares().execute() true - } catch (e: IOException) { false } + } catch (e: IOException) { + false + } updateProgress(getProgress()) currentServerSetting!!.podcastSupport = try { subsonicApiClient.api.getPodcasts().execute() true - } catch (e: IOException) { false } + } catch (e: IOException) { + false + } updateProgress(getProgress()) From 67870efd6795090c28e124e502adfc66d3616106 Mon Sep 17 00:00:00 2001 From: Maxence G Date: Sat, 29 May 2021 15:46:09 +0200 Subject: [PATCH 16/22] Fix length --- .../org/moire/ultrasonic/activity/NavigationActivity.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt index c30e689f..7f8abc29 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt @@ -378,9 +378,10 @@ class NavigationActivity : AppCompatActivity() { return } val activeServerProvider: ActiveServerProvider by inject() - chatMenuItem?.isVisible = activeServerProvider.getActiveServer().chatSupport != false - bookmarksMenuItem?.isVisible = activeServerProvider.getActiveServer().bookmarkSupport != false - sharesMenuItem?.isVisible = activeServerProvider.getActiveServer().shareSupport != false - podcastsMenuItem?.isVisible = activeServerProvider.getActiveServer().podcastSupport != false + val activeServer = activeServerProvider.getActiveServer() + chatMenuItem?.isVisible = activeServer.chatSupport != false + bookmarksMenuItem?.isVisible = activeServer.bookmarkSupport != false + sharesMenuItem?.isVisible = activeServer.shareSupport != false + podcastsMenuItem?.isVisible = activeServer.podcastSupport != false } } From 41023282e8a323d148f07d68d66d0ebde602e30e Mon Sep 17 00:00:00 2001 From: Nite Date: Mon, 31 May 2021 13:38:53 +0200 Subject: [PATCH 17/22] Fixed detekt Fixed code duplication Added more info to the Connection Test dialog for the user --- .../ultrasonic/fragment/EditServerFragment.kt | 60 ++++++++++++------- ultrasonic/src/main/res/values/strings.xml | 1 + 2 files changed, 39 insertions(+), 22 deletions(-) diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt index f4b6d757..7f56979b 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt @@ -21,14 +21,17 @@ import org.moire.ultrasonic.R import org.moire.ultrasonic.api.subsonic.SubsonicAPIClient import org.moire.ultrasonic.api.subsonic.SubsonicAPIVersions import org.moire.ultrasonic.api.subsonic.SubsonicClientConfiguration +import org.moire.ultrasonic.api.subsonic.response.SubsonicResponse import org.moire.ultrasonic.data.ActiveServerProvider import org.moire.ultrasonic.data.ServerSetting import org.moire.ultrasonic.service.ApiCallResponseChecker import org.moire.ultrasonic.service.MusicServiceFactory +import org.moire.ultrasonic.service.SubsonicRESTException import org.moire.ultrasonic.util.Constants import org.moire.ultrasonic.util.ErrorDialog import org.moire.ultrasonic.util.ModalBackgroundTask import org.moire.ultrasonic.util.Util +import retrofit2.Response import timber.log.Timber /** @@ -309,10 +312,10 @@ class EditServerFragment : Fragment(), OnBackPressedHandler { fun getProgress(): String { return String.format( """ - |%s - ${activity.resources.getString(R.string.button_bar_chat)} - |%s - ${activity.resources.getString(R.string.button_bar_bookmarks)} - |%s - ${activity.resources.getString(R.string.button_bar_shares)} - |%s - ${activity.resources.getString(R.string.button_bar_podcasts)} + |%s - ${resources.getString(R.string.button_bar_chat)} + |%s - ${resources.getString(R.string.button_bar_bookmarks)} + |%s - ${resources.getString(R.string.button_bar_shares)} + |%s - ${resources.getString(R.string.button_bar_podcasts)} """.trimMargin(), boolToMark(currentServerSetting!!.chatSupport), boolToMark(currentServerSetting!!.bookmarkSupport), @@ -358,38 +361,26 @@ class EditServerFragment : Fragment(), OnBackPressedHandler { pingResponse = subsonicApiClient.api.ping().execute() ApiCallResponseChecker.checkResponseSuccessful(pingResponse) - currentServerSetting!!.chatSupport = try { + currentServerSetting!!.chatSupport = isServerFunctionAvailable { subsonicApiClient.api.getChatMessages().execute() - true - } catch (e: IOException) { - false } updateProgress(getProgress()) - currentServerSetting!!.bookmarkSupport = try { + currentServerSetting!!.bookmarkSupport = isServerFunctionAvailable { subsonicApiClient.api.getBookmarks().execute() - true - } catch (e: IOException) { - false } updateProgress(getProgress()) - currentServerSetting!!.shareSupport = try { + currentServerSetting!!.shareSupport = isServerFunctionAvailable { subsonicApiClient.api.getShares().execute() - true - } catch (e: IOException) { - false } updateProgress(getProgress()) - currentServerSetting!!.podcastSupport = try { + currentServerSetting!!.podcastSupport = isServerFunctionAvailable { subsonicApiClient.api.getPodcasts().execute() - true - } catch (e: IOException) { - false } updateProgress(getProgress()) @@ -398,17 +389,30 @@ class EditServerFragment : Fragment(), OnBackPressedHandler { ApiCallResponseChecker.checkResponseSuccessful(licenseResponse) if (!licenseResponse.body()!!.license.valid) { return getProgress() + "\n" + - activity.resources.getString(R.string.settings_testing_unlicensed) + resources.getString(R.string.settings_testing_unlicensed) } return getProgress() } override fun done(responseString: String) { + var dialogText = responseString + if ( arrayOf(currentServerSetting!!.chatSupport, + currentServerSetting!!.bookmarkSupport, + currentServerSetting!!.shareSupport, + currentServerSetting!!.podcastSupport).any { x -> x == false } + ) { + dialogText = String.format( + "%s\n\n%s", + responseString, + resources.getString(R.string.server_editor_disabled_feature) + ) + } + Util.showDialog( activity, android.R.drawable.ic_dialog_info, R.string.settings_testing_ok, - responseString + dialogText ) } @@ -428,6 +432,18 @@ class EditServerFragment : Fragment(), OnBackPressedHandler { task.execute() } + private fun isServerFunctionAvailable(function: () -> Response): Boolean { + return try { + val response = function() + ApiCallResponseChecker.checkResponseSuccessful(response) + true + } catch (_: IOException) { + false + } catch (_: SubsonicRESTException) { + false + } + } + /** * Finishes the Activity, after confirmation from the user if needed */ diff --git a/ultrasonic/src/main/res/values/strings.xml b/ultrasonic/src/main/res/values/strings.xml index 7ab179e0..280d0352 100644 --- a/ultrasonic/src/main/res/values/strings.xml +++ b/ultrasonic/src/main/res/values/strings.xml @@ -462,6 +462,7 @@ Move down Authentication Advanced settings + One or more features were disabled because the server doesn\'t support them.\nYou can run this test again anytime. 1 song From fe5ee8b12a5118645934b06ecc48bd6226edd491 Mon Sep 17 00:00:00 2001 From: Nite Date: Mon, 31 May 2021 14:04:46 +0200 Subject: [PATCH 18/22] Fixed ktlint --- .../org/moire/ultrasonic/fragment/EditServerFragment.kt | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt index 7f56979b..39dc892d 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/fragment/EditServerFragment.kt @@ -14,6 +14,7 @@ import com.google.android.material.textfield.TextInputLayout import java.io.IOException import java.net.MalformedURLException import java.net.URL +import java.util.Locale import org.koin.android.ext.android.inject import org.koin.androidx.viewmodel.ext.android.viewModel import org.moire.ultrasonic.BuildConfig @@ -396,12 +397,15 @@ class EditServerFragment : Fragment(), OnBackPressedHandler { override fun done(responseString: String) { var dialogText = responseString - if ( arrayOf(currentServerSetting!!.chatSupport, + if (arrayOf( + currentServerSetting!!.chatSupport, currentServerSetting!!.bookmarkSupport, currentServerSetting!!.shareSupport, - currentServerSetting!!.podcastSupport).any { x -> x == false } + currentServerSetting!!.podcastSupport + ).any { x -> x == false } ) { dialogText = String.format( + Locale.ROOT, "%s\n\n%s", responseString, resources.getString(R.string.server_editor_disabled_feature) From 132ee3b5636bde983ff5f3775c8d2a92fa6337c1 Mon Sep 17 00:00:00 2001 From: Nite Date: Mon, 31 May 2021 14:26:48 +0200 Subject: [PATCH 19/22] Removed unused string --- ultrasonic/src/main/res/values-cs/strings.xml | 1 - ultrasonic/src/main/res/values-de/strings.xml | 1 - ultrasonic/src/main/res/values-es/strings.xml | 1 - ultrasonic/src/main/res/values-fr/strings.xml | 1 - ultrasonic/src/main/res/values-hu/strings.xml | 1 - ultrasonic/src/main/res/values-it/strings.xml | 1 - ultrasonic/src/main/res/values-nl/strings.xml | 1 - ultrasonic/src/main/res/values-pl/strings.xml | 1 - ultrasonic/src/main/res/values-pt-rBR/strings.xml | 1 - ultrasonic/src/main/res/values-pt/strings.xml | 1 - ultrasonic/src/main/res/values-ru/strings.xml | 1 - ultrasonic/src/main/res/values-zh-rCN/strings.xml | 1 - ultrasonic/src/main/res/values/strings.xml | 1 - 13 files changed, 13 deletions(-) diff --git a/ultrasonic/src/main/res/values-cs/strings.xml b/ultrasonic/src/main/res/values-cs/strings.xml index eae638c6..21c58346 100644 --- a/ultrasonic/src/main/res/values-cs/strings.xml +++ b/ultrasonic/src/main/res/values-cs/strings.xml @@ -297,7 +297,6 @@ Zobrazovat číslo skladby Připojovat číslo skladby při zobrazování skladby Test připojení - Testuji připojení… Připojení je v pořádku Připojení je v pořádku. Server bez licence. Světlý diff --git a/ultrasonic/src/main/res/values-de/strings.xml b/ultrasonic/src/main/res/values-de/strings.xml index 32b362a5..ee0c65bf 100644 --- a/ultrasonic/src/main/res/values-de/strings.xml +++ b/ultrasonic/src/main/res/values-de/strings.xml @@ -296,7 +296,6 @@ Titelnummer anzeigen Titel mit Nummer anzeigen Verbindung testen - Teste Verbindung… Verbindung OK Verbindung OK, Server nicht lizensiert. Hell diff --git a/ultrasonic/src/main/res/values-es/strings.xml b/ultrasonic/src/main/res/values-es/strings.xml index 5c2520ba..6b11208a 100644 --- a/ultrasonic/src/main/res/values-es/strings.xml +++ b/ultrasonic/src/main/res/values-es/strings.xml @@ -309,7 +309,6 @@ Mostrar número de pista Incluir el número de pista cuando se muestre una canción Comprobar conexión - Comprobado conexión… La conexión es correcta La conexión es correcta. Servidor sin licencia. Claro diff --git a/ultrasonic/src/main/res/values-fr/strings.xml b/ultrasonic/src/main/res/values-fr/strings.xml index f2f65ed8..be164a44 100644 --- a/ultrasonic/src/main/res/values-fr/strings.xml +++ b/ultrasonic/src/main/res/values-fr/strings.xml @@ -297,7 +297,6 @@ Afficher le numéro du titre Inclure son numero lors de l\'affichage d\'un titre Tester la connexion - Connexion en cours de test… Connexion correcte Connexion correcte. Serveur sans licence. Clair diff --git a/ultrasonic/src/main/res/values-hu/strings.xml b/ultrasonic/src/main/res/values-hu/strings.xml index c185bcf5..3999ff01 100644 --- a/ultrasonic/src/main/res/values-hu/strings.xml +++ b/ultrasonic/src/main/res/values-hu/strings.xml @@ -297,7 +297,6 @@ Sorszám megjelenítése Dalok sorszámának megjelenítése. Kapcsolat tesztelése - Kapcsolat tesztelése… Kapcsolat OK! Kapcsolat OK! A kiszolgálónak nincs licence! Világos diff --git a/ultrasonic/src/main/res/values-it/strings.xml b/ultrasonic/src/main/res/values-it/strings.xml index a74532b5..043368a8 100644 --- a/ultrasonic/src/main/res/values-it/strings.xml +++ b/ultrasonic/src/main/res/values-it/strings.xml @@ -289,7 +289,6 @@ Visualizza numero traccia Includi numero traccia quando visualizzi una canzone Prova Connessione - Collaudo connessione… Connessione OK Connessione OK. Server senza licenza. Chiaro diff --git a/ultrasonic/src/main/res/values-nl/strings.xml b/ultrasonic/src/main/res/values-nl/strings.xml index 41c77857..d39fd5fd 100644 --- a/ultrasonic/src/main/res/values-nl/strings.xml +++ b/ultrasonic/src/main/res/values-nl/strings.xml @@ -307,7 +307,6 @@ Itemnummer tonen Itemnummer tonen tijdens tonen van nummers Verbinding testen - Bezig met testen van verbinding… Verbinding is goed Verbinding is goed; geen serverlicentie. Licht diff --git a/ultrasonic/src/main/res/values-pl/strings.xml b/ultrasonic/src/main/res/values-pl/strings.xml index 12d063bb..c09b4479 100644 --- a/ultrasonic/src/main/res/values-pl/strings.xml +++ b/ultrasonic/src/main/res/values-pl/strings.xml @@ -295,7 +295,6 @@ Wyświetlaj numer utworu Dołącza numer utworu podczas wyświetlania utworu Testuj połączenie - Trwa testowanie połączenia… Połączenie jest OK Połączenie jest OK. Brak licencji na serwerze. Jasny diff --git a/ultrasonic/src/main/res/values-pt-rBR/strings.xml b/ultrasonic/src/main/res/values-pt-rBR/strings.xml index 9989f711..0a864f66 100644 --- a/ultrasonic/src/main/res/values-pt-rBR/strings.xml +++ b/ultrasonic/src/main/res/values-pt-rBR/strings.xml @@ -297,7 +297,6 @@ Mostrar o Número da Faixa Incluir o número da faixa quando mostrando uma música Teste de Conexão - Testando conexão… Conexão OK Conexão OK. Servidor não licenciado. Claro diff --git a/ultrasonic/src/main/res/values-pt/strings.xml b/ultrasonic/src/main/res/values-pt/strings.xml index d607c8c4..74a7d3d4 100644 --- a/ultrasonic/src/main/res/values-pt/strings.xml +++ b/ultrasonic/src/main/res/values-pt/strings.xml @@ -295,7 +295,6 @@ Mostrar o Número da Faixa Incluir o número da faixa quando mostrando uma música Teste de Conexão - Testando conexão… Conexão OK Conexão OK. Servidor não licenciado. Claro diff --git a/ultrasonic/src/main/res/values-ru/strings.xml b/ultrasonic/src/main/res/values-ru/strings.xml index 277f7d6b..76d8f0c0 100644 --- a/ultrasonic/src/main/res/values-ru/strings.xml +++ b/ultrasonic/src/main/res/values-ru/strings.xml @@ -290,7 +290,6 @@ Показать номер трека Включить номер дорожки при отображении песни Тестовое соединение - Тестирование соединения… Успешное соединение Успешное соединение. Сервер нелицензионный. Светлая diff --git a/ultrasonic/src/main/res/values-zh-rCN/strings.xml b/ultrasonic/src/main/res/values-zh-rCN/strings.xml index 9ebc2ebc..e6fd90bf 100644 --- a/ultrasonic/src/main/res/values-zh-rCN/strings.xml +++ b/ultrasonic/src/main/res/values-zh-rCN/strings.xml @@ -220,7 +220,6 @@ 显示通知 总是显示通知 测试连接 - 测试连接… 连接正常 连接正常, 服务器未授权。 主题 diff --git a/ultrasonic/src/main/res/values/strings.xml b/ultrasonic/src/main/res/values/strings.xml index 280d0352..f0733e73 100644 --- a/ultrasonic/src/main/res/values/strings.xml +++ b/ultrasonic/src/main/res/values/strings.xml @@ -311,7 +311,6 @@ Show Track Number Include track number when displaying a song Test Connection - Testing connection… Connection is OK Connection is OK. Server unlicensed. Light From 17b9b776fb4270286e284790c66e26df20c23362 Mon Sep 17 00:00:00 2001 From: Maxence G Date: Mon, 31 May 2021 17:02:27 +0200 Subject: [PATCH 20/22] Add french translation --- ultrasonic/src/main/res/values-fr/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/ultrasonic/src/main/res/values-fr/strings.xml b/ultrasonic/src/main/res/values-fr/strings.xml index be164a44..7270a666 100644 --- a/ultrasonic/src/main/res/values-fr/strings.xml +++ b/ultrasonic/src/main/res/values-fr/strings.xml @@ -498,5 +498,6 @@ Utiliser un système de notation à base d\'étoiles pour les morceaux au lieu de simplement mettre en avant les morceaux. + Une ou plusieurs fonctionnalités ont été désactivées car le serveur ne les prend pas en charge.\nVous pouvez réexécuter ce test à tout moment. From e0f9059de8da33c465b6eab94223e2124620b89c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Garc=C3=ADa=20Amor?= Date: Thu, 3 Jun 2021 08:58:13 +0200 Subject: [PATCH 21/22] Update translations --- ultrasonic/src/main/res/values-cs/strings.xml | 1 - ultrasonic/src/main/res/values-es/strings.xml | 1 + ultrasonic/src/main/res/values-fr/strings.xml | 2 +- ultrasonic/src/main/res/values-hu/strings.xml | 16 +++++++++++++++- ultrasonic/src/main/res/values-nl/strings.xml | 3 +++ .../src/main/res/values-pt-rBR/strings.xml | 1 - .../src/main/res/values-zh-rCN/strings.xml | 1 - 7 files changed, 20 insertions(+), 5 deletions(-) diff --git a/ultrasonic/src/main/res/values-cs/strings.xml b/ultrasonic/src/main/res/values-cs/strings.xml index 21c58346..e1fc4b29 100644 --- a/ultrasonic/src/main/res/values-cs/strings.xml +++ b/ultrasonic/src/main/res/values-cs/strings.xml @@ -444,7 +444,6 @@ Posunout níž Ověření Rozšířené možnosti - 1 skladba %d skladby diff --git a/ultrasonic/src/main/res/values-es/strings.xml b/ultrasonic/src/main/res/values-es/strings.xml index 6b11208a..1225d7eb 100644 --- a/ultrasonic/src/main/res/values-es/strings.xml +++ b/ultrasonic/src/main/res/values-es/strings.xml @@ -458,6 +458,7 @@ Bajar Autenticación Configuración avanzada + Una o más funciones se han deshabilitado porque el servidor no las admite.\nPuedes ejecutar esta prueba nuevamente en cualquier momento. 1 canción diff --git a/ultrasonic/src/main/res/values-fr/strings.xml b/ultrasonic/src/main/res/values-fr/strings.xml index 7270a666..8e9ba787 100644 --- a/ultrasonic/src/main/res/values-fr/strings.xml +++ b/ultrasonic/src/main/res/values-fr/strings.xml @@ -446,6 +446,7 @@ Déplacer vers le bas Authentification Paramètres avancés + Une ou plusieurs fonctionnalités ont été désactivées car le serveur ne les prend pas en charge.\nVous pouvez réexécuter ce test à tout moment. 1 titre @@ -498,6 +499,5 @@ Utiliser un système de notation à base d\'étoiles pour les morceaux au lieu de simplement mettre en avant les morceaux. - Une ou plusieurs fonctionnalités ont été désactivées car le serveur ne les prend pas en charge.\nVous pouvez réexécuter ce test à tout moment. diff --git a/ultrasonic/src/main/res/values-hu/strings.xml b/ultrasonic/src/main/res/values-hu/strings.xml index 3999ff01..c913b846 100644 --- a/ultrasonic/src/main/res/values-hu/strings.xml +++ b/ultrasonic/src/main/res/values-hu/strings.xml @@ -15,6 +15,13 @@ Csevegés (Chat) Ultrasonic főoldal Lejátszó + Lejátszás + Szünet + Ismétlés + Véletlen sorrendű + Állj + Következő + Előző Podcast Nincsenek podcast-csatornák regisztrálva Podcast @@ -32,8 +39,11 @@ Név OK Tárolás (Megőrzés az eszközön) + Szünet + Lejátszás Lejátszás (Utolsóként) Lejátszás (Következőként) + Előző lejátszása Lejátszás Véletlen sorrendű lejátszás Nyilvános @@ -256,6 +266,8 @@ Az alkalmazás folytatja a szüneteltetett lejátszást a fejhallgató behelyezésekor a készülékbe. Képernyő ébrentartása a letöltés alatt, a magasabb letöltési sebesség érdekében. Képernyő ébrentartása + Ne felejtsd el beállítani a Scrobble szolgáltatónál használt felhasználóneved és jelszavad a szervereden + Scrobble engedélyezése 1 10 100 @@ -301,6 +313,7 @@ Kapcsolat OK! A kiszolgálónak nincs licence! Világos Sötét + Fekete Téma Engedélyezze az önaláírt HTTPS tanúsítványt Az LDAP-felhasználók támogatásának engedélyezése @@ -400,6 +413,8 @@ Minden Bluetooth eszköz Csak audio (A2DP) eszközök Kikapcsolva + Egy gombos Lejátszás/Szünet a Bluetooth eszközökön + Régebbi Bluetooth eszközök esetén segíthet, ha a Lejátszás/Szünet nem működik megfelelően Hibakeresési lehetőségek Hibakeresési napló írása fájlba A naplófájlok elérhetőek a következő helyen: %1$s/%2$s @@ -443,7 +458,6 @@ Lejjebb mozgat Bejelentkezés Haladó beállítások - 1 dal %d dal diff --git a/ultrasonic/src/main/res/values-nl/strings.xml b/ultrasonic/src/main/res/values-nl/strings.xml index d39fd5fd..2b2da416 100644 --- a/ultrasonic/src/main/res/values-nl/strings.xml +++ b/ultrasonic/src/main/res/values-nl/strings.xml @@ -266,6 +266,8 @@ Het afspelen wordt hervat zodra er een hoofdtelefoon wordt aangesloten. Door het scherm aan te houden tijdens het downloaden, wordt de downloadsnelheid verhoogd. Scherm aan houden + Let op: stel je gebruikersnaam en wachtwoord van je scrobble-dienst(en) in op je Subsonic-server + Scrobbelen 1 10 100 @@ -456,6 +458,7 @@ Omlaag Authenticatie Geavanceerde instellingen + Eén of meerdere functies zijn uitgeschakeld omdat de server ze niet ondersteunt.\nVoer deze test later opnieuw uit. 1 nummer diff --git a/ultrasonic/src/main/res/values-pt-rBR/strings.xml b/ultrasonic/src/main/res/values-pt-rBR/strings.xml index 0a864f66..826a45e4 100644 --- a/ultrasonic/src/main/res/values-pt-rBR/strings.xml +++ b/ultrasonic/src/main/res/values-pt-rBR/strings.xml @@ -446,7 +446,6 @@ Para baixo Autenticação Configurações avançadas - %d música %d músicas diff --git a/ultrasonic/src/main/res/values-zh-rCN/strings.xml b/ultrasonic/src/main/res/values-zh-rCN/strings.xml index e6fd90bf..716b65f4 100644 --- a/ultrasonic/src/main/res/values-zh-rCN/strings.xml +++ b/ultrasonic/src/main/res/values-zh-rCN/strings.xml @@ -300,7 +300,6 @@ 下移 认证 高级设置 - 用户名或密码错误 缺少必需的参数。 未找到请求的数据。 From 1dc480b141c632df47165941758c23e7392afdf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=93scar=20Garc=C3=ADa=20Amor?= Date: Thu, 3 Jun 2021 10:33:05 +0200 Subject: [PATCH 22/22] Bump version to 2.21.0 --- fastlane/metadata/android/en-US/changelogs/93.txt | 14 ++++++++++++++ fastlane/metadata/android/es-ES/changelogs/93.txt | 14 ++++++++++++++ ultrasonic/build.gradle | 4 ++-- 3 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/93.txt create mode 100644 fastlane/metadata/android/es-ES/changelogs/93.txt diff --git a/fastlane/metadata/android/en-US/changelogs/93.txt b/fastlane/metadata/android/en-US/changelogs/93.txt new file mode 100644 index 00000000..9b17841a --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/93.txt @@ -0,0 +1,14 @@ +Bug fixes +- #411: getContext() can return null in Fragments. +- #415: App crashes when pressing the album cover in player. +- #447: Fix all service notification issues. +- #484: Add error handling to SelectAlbumModel functions. + +Enhancements +- #433: Lock screen playback controls should include next/previous track. +- #476: Remove jcenter(). +- #477: Make all preference operations context-free. +- #485: Remove MusicService. +- #493: Introduce new Generic Fragments, ViewModels, and Adapters for the display of API data. +- #505: Implement server feature checking. +- #506: Convert all remaining Music servic classes to Kotlin. diff --git a/fastlane/metadata/android/es-ES/changelogs/93.txt b/fastlane/metadata/android/es-ES/changelogs/93.txt new file mode 100644 index 00000000..31567094 --- /dev/null +++ b/fastlane/metadata/android/es-ES/changelogs/93.txt @@ -0,0 +1,14 @@ +Correción de errores +- #411: getContext() puede retornar fragmentos nulos. +- #415: La aplicación se bloquea al presionar sobre la portada del álbum en el reproductor. +- #447: Solucionar todos los problemas de notificación de servicio. +- #484: Agregar manejo de errores a las funciones de SelectAlbumModel. + +Mejoras +- #433: Los controles de reproducción de la pantalla de bloqueo deben incluir la pista siguiente/anterior. +- #476: Elimina jcenter(). +- #477: Hacer que todas las operaciones de preferencias estén libres de contexto. +- #485: Elimina MusicService. +- #493: Introducir nuevos fragmentos genéricos, modelos de vista y adaptadores para la visualización de datos de API. +- #505: Implementar la verificación de características del servidor. +- #506: Convertir todas las clases de servicios de música restantes a Kotlin. diff --git a/ultrasonic/build.gradle b/ultrasonic/build.gradle index f9426351..3d6a9f78 100644 --- a/ultrasonic/build.gradle +++ b/ultrasonic/build.gradle @@ -9,8 +9,8 @@ android { defaultConfig { applicationId "org.moire.ultrasonic" - versionCode 92 - versionName "2.20.0" + versionCode 93 + versionName "2.21.0" minSdkVersion versions.minSdk targetSdkVersion versions.targetSdk