Add timeout for plugin updates and better texts, bottom menu lighter disable shade, library cursor cleanup

This commit is contained in:
Kelvin
2025-11-17 21:28:07 +01:00
parent f17e147b4e
commit 07f3140038
3 changed files with 130 additions and 97 deletions
@@ -187,9 +187,16 @@ class PluginUpdateDialog : AlertDialog {
val scope = StateApp.instance.scopeOrNull;
scope?.launch(Dispatchers.IO) {
try {
withContext(Dispatchers.Main) {
_textProgres.setText("Loading current script file...");
}
val client = ManagedHttpClient();
client.setTimeout(10000);
val script = StatePlugins.instance.getScript(_oldConfig.id) ?: "";
withContext(Dispatchers.Main) {
_textProgres.setText("Requesting new script file...");
}
val newScript = client.get(_newConfig.absoluteScriptUrl)?.body?.string();
if(newScript.isNullOrEmpty())
throw IllegalStateException("No script found");
@@ -143,7 +143,7 @@ class MenuBottomBarFragment : MainActivityFragment() {
val animations = arrayListOf<Animator>()
animations.add(ObjectAnimator.ofFloat(moreOverlayBackground, "alpha", 0.0f, 1.0f).setDuration(duration))
_bottomButtons.find { it.definition.id == 99 }?.let {
animations.add(ObjectAnimator.ofFloat(it, "alpha", 0.4f, 1.0f)
animations.add(ObjectAnimator.ofFloat(it, "alpha", 0.5f, 1.0f)
.setDuration(duration));
}
@@ -165,7 +165,7 @@ class MenuBottomBarFragment : MainActivityFragment() {
.add(ObjectAnimator.ofFloat(moreOverlayBackground, "alpha", 1.0f, 0.0f)
.setDuration(duration))
_bottomButtons.find { it.definition.id == 99 }?.let {
animations.add(ObjectAnimator.ofFloat(it, "alpha", 1.0f, 0.4f)
animations.add(ObjectAnimator.ofFloat(it, "alpha", 1.0f, 0.5f)
.setDuration(duration));
}
@@ -369,7 +369,7 @@ class MenuBottomBarFragment : MainActivityFragment() {
this.alpha = 1f;
}
else {
this.alpha = 0.4f;
this.alpha = 0.5f;
}
_textButton = findViewById(R.id.text_button);
@@ -389,7 +389,7 @@ class MenuBottomBarFragment : MainActivityFragment() {
this.alpha = 1f;
}
else {
this.alpha = 0.4f;
this.alpha = 0.5f;
}
}
}
@@ -102,13 +102,15 @@ class StateLibrary {
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, StateLibrary.PROJECTION_MEDIA,
"LOWER(" + MediaStore.Audio.Media.DISPLAY_NAME + ") LIKE ? ", arrayOf("%" + str.trim().lowercase() + "%"),
null) ?: return listOf();
return cursor.use {
cursor.moveToFirst();
val list = mutableListOf<IPlatformVideo>()
while(!cursor.isAfterLast) {
list.add(StateLibrary.audioFromCursor(cursor));
cursor.moveToNext();
}
return list;
return@use list;
}
}
fun getAlbums(): List<Album> {
@@ -155,6 +157,7 @@ class StateLibrary {
query,
null,
MediaStore.Video.Media.DATE_ADDED + " DESC") ?: return EmptyPager();
return cursor.use {
cursor.moveToFirst();
val list = mutableListOf<IPlatformVideo>()
while(!cursor.isAfterLast && list.size < 10) {
@@ -162,7 +165,7 @@ class StateLibrary {
cursor.moveToNext();
}
return AdhocPager<IPlatformContent>({
return@use AdhocPager<IPlatformContent>({
val list = mutableListOf<IPlatformContent>()
while(!cursor.isAfterLast && list.size < 10) {
list.add(videoFromCursor(cursor));
@@ -171,6 +174,7 @@ class StateLibrary {
return@AdhocPager list;
}, list);
}
}
fun getRecentVideos(buckets: List<String>? = null, count: Int = 20): List<IPlatformVideo> {
val videoPager = getVideos(buckets);
val items = mutableListOf<IPlatformVideo>();
@@ -194,6 +198,7 @@ class StateLibrary {
), null, null, null
) ?: return listOf();
return cur.use {
val buckets = mutableListOf<Bucket>();
val list = HashSet<Long>();
if (cur.moveToFirst()) {
@@ -213,7 +218,8 @@ class StateLibrary {
} while (cur.moveToNext())
}
_cacheBucketNames = buckets.toList()
return _cacheBucketNames ?: listOf();
return@use _cacheBucketNames ?: listOf();
}
}
catch(ex: Throwable) {
Logger.e(TAG, "Buckets loading failed, returning empty");
@@ -286,10 +292,12 @@ class StateLibrary {
val cursor = resolver?.query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, StateLibrary.PROJECTION_MEDIA, "${MediaStore.Audio.Media._ID} = ?", arrayOf(id.toString()),
null) ?: return null;
return cursor.use {
cursor.moveToFirst();
if(cursor.isAfterLast)
return null;
return audioFromCursor(cursor);
return@use null;
return@use audioFromCursor(cursor);
}
}
fun findAudioByName(name: String): IPlatformContentDetails? {
val resolver = StateApp.instance.contextOrNull?.contentResolver;
@@ -300,10 +308,12 @@ class StateLibrary {
val cursor = resolver?.query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, StateLibrary.PROJECTION_MEDIA, "${MediaStore.Audio.Media.DISPLAY_NAME} = ?", arrayOf(name),
null) ?: return null;
return cursor.use {
cursor.moveToFirst();
if(cursor.isAfterLast)
return null;
return audioFromCursor(cursor);
return@use audioFromCursor(cursor);
}
}
fun getVideoTrack(url: String): IPlatformContentDetails? {
val uri = Uri.parse(url);
@@ -319,10 +329,12 @@ class StateLibrary {
val cursor = resolver?.query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, StateLibrary.PROJECTION_VIDEO, "${MediaStore.Video.Media._ID} = ?", arrayOf(id.toString()),
null) ?: return null;
return cursor.use {
cursor.moveToFirst();
if(cursor.isAfterLast)
return null;
return videoFromCursor(cursor);
return@use null;
return@use videoFromCursor(cursor);
}
}
fun findVideoByName(name: String): IPlatformContentDetails? {
val resolver = StateApp.instance.contextOrNull?.contentResolver;
@@ -333,10 +345,12 @@ class StateLibrary {
val cursor = resolver?.query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, StateLibrary.PROJECTION_VIDEO, "${MediaStore.Video.Media.DISPLAY_NAME} = ?", arrayOf(name),
null) ?: return null;
return cursor.use {
cursor.moveToFirst();
if(cursor.isAfterLast)
return null;
return videoFromCursor(cursor);
return@use null;
return@use videoFromCursor(cursor);
}
}
fun audioFromCursor(cursor: Cursor): IPlatformVideoDetails {
@@ -484,12 +498,13 @@ class Artist {
val cursor = resolver.query(MediaStore.Audio.Artists.EXTERNAL_CONTENT_URI,
Artist.PROJECTION,
"${MediaStore.Audio.Artists._ID} = ?",
arrayOf(id.toString()), null) ?:
return null;
arrayOf(id.toString()), null) ?: return null;
return cursor.use {
cursor.moveToFirst();
if(cursor.isAfterLast)
return null;
return Artist.fromCursor(cursor);
return@use null;
return@use Artist.fromCursor(cursor);
}
}
fun getArtists(ordering: ArtistOrdering = ArtistOrdering.Alphabethic, query: String? = null, args: Array<String>? = null): List<Artist> {
val ordering = when(ordering) {
@@ -503,13 +518,15 @@ class Artist {
query,
args,
ordering) ?: return listOf();
return cursor.use {
cursor.moveToFirst();
val list = mutableListOf<Artist>()
while(!cursor.isAfterLast) {
list.add(fromCursor(cursor));
cursor.moveToNext();
}
return list;
return@use list;
}
}
fun getTracksPager(artistId: Long): List<IPlatformVideo> {
@@ -521,13 +538,15 @@ class Artist {
val cursor = resolver?.query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, StateLibrary.PROJECTION_MEDIA, "${MediaStore.Audio.Media.ARTIST_ID} = ?", arrayOf(artistId.toString()),
null) ?: return listOf();
return cursor.use {
cursor.moveToFirst();
val list = mutableListOf<IPlatformVideo>()
while(!cursor.isAfterLast) {
list.add(StateLibrary.audioFromCursor(cursor));
cursor.moveToNext();
}
return list;
return@use list;
}
}
}
}
@@ -583,13 +602,15 @@ class Album {
val cursor = resolver?.query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, StateLibrary.PROJECTION_MEDIA, "${MediaStore.Audio.Media.ALBUM_ID} = ?", arrayOf(albumId.toString()),
null) ?: return listOf();
return cursor.use {
cursor.moveToFirst();
val list = mutableListOf<IPlatformVideo>()
while(!cursor.isAfterLast) {
list.add(StateLibrary.audioFromCursor(cursor));
cursor.moveToNext();
}
return list;
return@use list;
}
}
fun getAlbum(id: Long): Album? {
val resolver = StateApp.instance.contextOrNull?.contentResolver;
@@ -600,12 +621,13 @@ class Album {
val cursor = resolver.query(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI,
PROJECTION,
"${MediaStore.Audio.Albums.ALBUM_ID} = ?",
arrayOf(id.toString()), null) ?:
return null;
arrayOf(id.toString()), null) ?: return null;
return cursor.use {
cursor.moveToFirst();
if(cursor.isAfterLast)
return null;
return fromCursor(cursor);
return@use null;
return@use fromCursor(cursor);
}
}
fun getAlbums(query: String? = null, args: Array<String>? = null): List<Album> {
val resolver = StateApp.instance.contextOrNull?.contentResolver;
@@ -616,13 +638,15 @@ class Album {
val cursor = resolver?.query(
MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, PROJECTION, query, args,
MediaStore.Audio.Albums.ALBUM + " ASC") ?: return listOf();
return cursor.use {
cursor.moveToFirst();
val list = mutableListOf<Album>()
while(!cursor.isAfterLast) {
list.add(fromCursor(cursor));
cursor.moveToNext();
}
return list;
return@use list;
}
}
fun getArtistAlbums(artistId: Long): List<Album> {
val resolver = StateApp.instance.contextOrNull?.contentResolver;
@@ -633,13 +657,15 @@ class Album {
val cursor = resolver?.query(
MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, PROJECTION, "${MediaStore.Audio.Media.ARTIST_ID} = ?", arrayOf(artistId.toString()),
MediaStore.Audio.Albums.ALBUM + " ASC") ?: return listOf();
return cursor.use {
cursor.moveToFirst();
val list = mutableListOf<Album>()
while(!cursor.isAfterLast) {
list.add(fromCursor(cursor));
cursor.moveToNext();
}
return list;
return@use list;
}
}
}
}