Implement server feature checking

This commit is contained in:
Maxence G 2021-05-24 23:25:12 +02:00
parent cebbb39caf
commit 1b7f48c53a
No known key found for this signature in database
GPG Key ID: DC1FD9409E3FE284
6 changed files with 125 additions and 18 deletions

View File

@ -359,6 +359,20 @@ public class Util
return Math.min(Math.max(percent,0),100) + " %"; 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. * Converts a byte-count to a formatted string suitable for display to the user.
@ -606,6 +620,18 @@ public class Util
}).show(); }).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) public static void sleepQuietly(long millis)
{ {

View File

@ -29,7 +29,9 @@ import androidx.preference.PreferenceManager
import com.google.android.material.navigation.NavigationView import com.google.android.material.navigation.NavigationView
import org.koin.android.ext.android.inject import org.koin.android.ext.android.inject
import org.koin.android.viewmodel.ext.android.viewModel import org.koin.android.viewmodel.ext.android.viewModel
import org.koin.java.KoinJavaComponent.inject
import org.moire.ultrasonic.R import org.moire.ultrasonic.R
import org.moire.ultrasonic.data.ActiveServerProvider
import org.moire.ultrasonic.data.ActiveServerProvider.Companion.isOffline import org.moire.ultrasonic.data.ActiveServerProvider.Companion.isOffline
import org.moire.ultrasonic.domain.PlayerState import org.moire.ultrasonic.domain.PlayerState
import org.moire.ultrasonic.fragment.OnBackPressedHandler import org.moire.ultrasonic.fragment.OnBackPressedHandler
@ -368,10 +370,18 @@ class NavigationActivity : AppCompatActivity() {
} }
private fun setMenuForServerSetting() { private fun setMenuForServerSetting() {
val visibility = !isOffline() if (isOffline())
chatMenuItem?.isVisible = visibility {
bookmarksMenuItem?.isVisible = visibility chatMenuItem?.isVisible = false
sharesMenuItem?.isVisible = visibility bookmarksMenuItem?.isVisible = false
podcastsMenuItem?.isVisible = visibility 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
} }
} }

View File

@ -8,7 +8,7 @@ import androidx.sqlite.db.SupportSQLiteDatabase
/** /**
* Room Database to be used to store data for Ultrasonic * 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() { 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)")
}
}

View File

@ -29,7 +29,11 @@ data class ServerSetting(
@ColumnInfo(name = "allowSelfSignedCertificate") var allowSelfSignedCertificate: Boolean, @ColumnInfo(name = "allowSelfSignedCertificate") var allowSelfSignedCertificate: Boolean,
@ColumnInfo(name = "ldapSupport") var ldapSupport: Boolean, @ColumnInfo(name = "ldapSupport") var ldapSupport: Boolean,
@ColumnInfo(name = "musicFolderId") var musicFolderId: String?, @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 ( constructor() : this (
-1, 0, "", "", "", "", false, false, false, null, null -1, 0, "", "", "", "", false, false, false, null, null

View File

@ -7,6 +7,7 @@ import org.koin.core.qualifier.named
import org.koin.dsl.module import org.koin.dsl.module
import org.moire.ultrasonic.data.AppDatabase import org.moire.ultrasonic.data.AppDatabase
import org.moire.ultrasonic.data.MIGRATION_1_2 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.fragment.ServerSettingsModel
import org.moire.ultrasonic.util.Util import org.moire.ultrasonic.util.Util
@ -24,7 +25,8 @@ val appPermanentStorage = module {
AppDatabase::class.java, AppDatabase::class.java,
"ultrasonic-database" "ultrasonic-database"
) )
.addMigrations(MIGRATION_1_2) .addMigrations(MIGRATION_1_2)
.addMigrations(MIGRATION_2_3)
.fallbackToDestructiveMigrationOnDowngrade() .fallbackToDestructiveMigrationOnDowngrade()
.build() .build()
} }

View File

@ -295,14 +295,22 @@ class EditServerFragment : Fragment(), OnBackPressedHandler {
* Tests if the network connection to the entered Server Settings can be made * Tests if the network connection to the entered Server Settings can be made
*/ */
private fun testConnection() { private fun testConnection() {
val task: ModalBackgroundTask<Boolean> = object : ModalBackgroundTask<Boolean>( val task: ModalBackgroundTask<String> = object : ModalBackgroundTask<String>(
activity, activity,
false false
) { ) {
@Throws(Throwable::class) @Throws(Throwable::class)
override fun doInBackground(): Boolean { override fun doInBackground(): String {
updateProgress(R.string.settings_testing_connection)
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( val configuration = SubsonicClientConfiguration(
currentServerSetting!!.url, currentServerSetting!!.url,
currentServerSetting!!.userName, currentServerSetting!!.userName,
@ -330,17 +338,65 @@ class EditServerFragment : Fragment(), OnBackPressedHandler {
pingResponse = subsonicApiClient.api.ping().execute() pingResponse = subsonicApiClient.api.ping().execute()
ApiCallResponseChecker.checkResponseSuccessful(pingResponse) 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() val licenseResponse = subsonicApiClient.api.getLicense().execute()
ApiCallResponseChecker.checkResponseSuccessful(licenseResponse) 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) { override fun done(responseString: String) {
if (licenseValid) { Util.showDialog(
Util.toast(activity, R.string.settings_testing_ok) activity,
} else { android.R.drawable.ic_dialog_info,
Util.toast(activity, R.string.settings_testing_unlicensed) R.string.settings_testing_ok,
} responseString)
} }
override fun error(error: Throwable) { override fun error(error: Throwable) {