Plugin sdk: add file owner and meta data fields

This commit is contained in:
MM20 2023-12-11 16:16:37 +01:00
parent d13ca6cd6c
commit bdf8b1f0d7
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389
4 changed files with 153 additions and 6 deletions

View File

@ -48,6 +48,8 @@ abstract class FilePluginContract {
*/ */
const val IsDirectory = "is_directory" const val IsDirectory = "is_directory"
const val Owner = "owner"
const val MetaTitle = "meta_title" const val MetaTitle = "meta_title"
const val MetaArtist = "meta_artist" const val MetaArtist = "meta_artist"
const val MetaAlbum = "meta_album" const val MetaAlbum = "meta_album"
@ -59,6 +61,5 @@ abstract class FilePluginContract {
const val MetaAppName = "meta_app_name" const val MetaAppName = "meta_app_name"
const val MetaAppPackageName = "meta_app_package_name" const val MetaAppPackageName = "meta_app_package_name"
const val MetaAppMinSdkVersion = "meta_app_min_sdk_version" const val MetaAppMinSdkVersion = "meta_app_min_sdk_version"
const val MetaOwner = "meta_owner"
} }
} }

View File

@ -4,17 +4,19 @@ import android.content.Context
import android.database.Cursor import android.database.Cursor
import android.net.Uri import android.net.Uri
import android.os.CancellationSignal import android.os.CancellationSignal
import android.text.format.DateUtils
import android.util.Log import android.util.Log
import androidx.core.database.getIntOrNull
import androidx.core.database.getLongOrNull
import androidx.core.database.getStringOrNull import androidx.core.database.getStringOrNull
import de.mm20.launcher2.crashreporter.CrashReporter import de.mm20.launcher2.crashreporter.CrashReporter
import de.mm20.launcher2.plugin.Plugin
import de.mm20.launcher2.plugin.config.SearchPluginConfig import de.mm20.launcher2.plugin.config.SearchPluginConfig
import de.mm20.launcher2.plugin.config.StorageStrategy
import de.mm20.launcher2.plugin.contracts.FilePluginContract import de.mm20.launcher2.plugin.contracts.FilePluginContract
import de.mm20.launcher2.plugin.contracts.PluginContract import de.mm20.launcher2.plugin.contracts.PluginContract
import de.mm20.launcher2.plugin.contracts.SearchPluginContract import de.mm20.launcher2.plugin.contracts.SearchPluginContract
import de.mm20.launcher2.search.File import de.mm20.launcher2.search.File
import kotlinx.collections.immutable.persistentMapOf import de.mm20.launcher2.search.FileMetaType
import kotlinx.collections.immutable.toPersistentMap
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.suspendCancellableCoroutine
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
@ -138,6 +140,40 @@ class PluginFileProvider(
val directoryIndex = val directoryIndex =
cursor.getColumnIndex(FilePluginContract.FileColumns.IsDirectory).takeIf { it >= 0 } cursor.getColumnIndex(FilePluginContract.FileColumns.IsDirectory).takeIf { it >= 0 }
val ownerIndex =
cursor.getColumnIndex(FilePluginContract.FileColumns.Owner).takeIf { it >= 0 }
val metaTitleIndex =
cursor.getColumnIndex(FilePluginContract.FileColumns.MetaTitle).takeIf { it >= 0 }
val metaArtistIndex =
cursor.getColumnIndex(FilePluginContract.FileColumns.MetaArtist).takeIf { it >= 0 }
val metaAlbumIndex =
cursor.getColumnIndex(FilePluginContract.FileColumns.MetaAlbum).takeIf { it >= 0 }
val metaDurationIndex =
cursor.getColumnIndex(FilePluginContract.FileColumns.MetaDuration).takeIf { it >= 0 }
val metaYearIndex =
cursor.getColumnIndex(FilePluginContract.FileColumns.MetaYear).takeIf { it >= 0 }
val metaWidthIndex =
cursor.getColumnIndex(FilePluginContract.FileColumns.MetaWidth).takeIf { it >= 0 }
val metaHeightIndex =
cursor.getColumnIndex(FilePluginContract.FileColumns.MetaHeight).takeIf { it >= 0 }
val metaLocationIndex =
cursor.getColumnIndex(FilePluginContract.FileColumns.MetaLocation).takeIf { it >= 0 }
val metaAppNameIndex =
cursor.getColumnIndex(FilePluginContract.FileColumns.MetaAppName).takeIf { it >= 0 }
val metaAppPackageNameIndex =
cursor.getColumnIndex(FilePluginContract.FileColumns.MetaAppPackageName)
.takeIf { it >= 0 }
val results = mutableListOf<File>() val results = mutableListOf<File>()
while (cursor.moveToNext()) { while (cursor.moveToNext()) {
results.add( results.add(
@ -147,7 +183,42 @@ class PluginFileProvider(
mimeType = typeIndex?.let { cursor.getString(it) } mimeType = typeIndex?.let { cursor.getString(it) }
?: "application/octet-stream", ?: "application/octet-stream",
size = sizeIndex?.let { cursor.getLong(it) } ?: 0, size = sizeIndex?.let { cursor.getLong(it) } ?: 0,
metaData = persistentMapOf(), metaData = buildMap {
metaTitleIndex?.let { cursor.getStringOrNull(it) }?.let {
put(FileMetaType.Title, it)
}
metaArtistIndex?.let { cursor.getStringOrNull(it) }?.let {
put(FileMetaType.Artist, it)
}
metaAlbumIndex?.let { cursor.getStringOrNull(it) }?.let {
put(FileMetaType.Album, it)
}
metaDurationIndex?.let { cursor.getLongOrNull(it) }?.let {
put(FileMetaType.Duration, DateUtils.formatElapsedTime(it / 1000L))
}
metaYearIndex?.let { cursor.getIntOrNull(it) }?.let {
put(FileMetaType.Year, it.toString())
}
if (metaWidthIndex != null && metaHeightIndex != null) {
val width = cursor.getIntOrNull(metaWidthIndex)
val height = cursor.getIntOrNull(metaHeightIndex)
if (width != null && height != null) {
put(FileMetaType.Dimensions, "${width}x${height}")
}
}
metaLocationIndex?.let { cursor.getStringOrNull(it) }?.let {
put(FileMetaType.Location, it)
}
metaAppNameIndex?.let { cursor.getStringOrNull(it) }?.let {
put(FileMetaType.AppName, it)
}
metaAppPackageNameIndex?.let { cursor.getStringOrNull(it) }?.let {
put(FileMetaType.AppPackageName, it)
}
ownerIndex?.let { cursor.getStringOrNull(it) }?.let {
put(FileMetaType.Owner, it)
}
}.toPersistentMap(),
label = cursor.getString(nameIndex), label = cursor.getString(nameIndex),
uri = Uri.parse(cursor.getString(contentUriIndex)), uri = Uri.parse(cursor.getString(contentUriIndex)),
thumbnailUri = thumbnailUriIndex?.let { thumbnailUri = thumbnailUriIndex?.let {

View File

@ -1,7 +1,50 @@
package de.mm20.launcher2.sdk.files package de.mm20.launcher2.sdk.files
import android.net.Uri import android.net.Uri
import de.mm20.launcher2.plugin.config.StorageStrategy
data class FileDimensions(
val width: Int,
val height: Int,
)
data class FileMetadata(
/**
* Song title, for audio files.
*/
val title: String? = null,
/**
* Artist name, for audio files.
*/
val artist: String? = null,
/**
* Album name, for audio files.
*/
val album: String? = null,
/**
* Duration in milliseconds, for audio and video files.
*/
val duration: Long? = null,
/**
* Year, for media files.
*/
val year: Int? = null,
/**
* Dimensions in pixels, for image and video files.
*/
val dimensions: FileDimensions? = null,
/**
* Geo location, for image and video files.
*/
val location: String? = null,
/**
* App name, for APK files.
*/
val appName: String? = null,
/**
* App package name, for APK files.
*/
val appPackageName: String? = null,
)
data class File( data class File(
/** /**
@ -50,4 +93,14 @@ data class File(
* If null, a default icon will be shown, depending on the file type. * If null, a default icon will be shown, depending on the file type.
*/ */
val thumbnailUri: Uri? = null, val thumbnailUri: Uri? = null,
/**
* Name of the owner of this file (i.e. when this file was shared with the user by another person).
*/
val owner: String? = null,
/**
* Additional metadata for this file.
*/
val metadata: FileMetadata = FileMetadata(),
) )

View File

@ -26,6 +26,17 @@ abstract class FileProvider(
FilePluginContract.FileColumns.ContentUri, FilePluginContract.FileColumns.ContentUri,
FilePluginContract.FileColumns.ThumbnailUri, FilePluginContract.FileColumns.ThumbnailUri,
FilePluginContract.FileColumns.IsDirectory, FilePluginContract.FileColumns.IsDirectory,
FilePluginContract.FileColumns.Owner,
FilePluginContract.FileColumns.MetaTitle,
FilePluginContract.FileColumns.MetaArtist,
FilePluginContract.FileColumns.MetaAlbum,
FilePluginContract.FileColumns.MetaDuration,
FilePluginContract.FileColumns.MetaYear,
FilePluginContract.FileColumns.MetaWidth,
FilePluginContract.FileColumns.MetaHeight,
FilePluginContract.FileColumns.MetaLocation,
FilePluginContract.FileColumns.MetaAppName,
FilePluginContract.FileColumns.MetaAppPackageName,
), ),
capacity, capacity,
) )
@ -42,6 +53,17 @@ abstract class FileProvider(
item.uri.toString(), item.uri.toString(),
item.thumbnailUri?.toString(), item.thumbnailUri?.toString(),
if (item.isDirectory) 1 else 0, if (item.isDirectory) 1 else 0,
item.owner,
item.metadata.title,
item.metadata.artist,
item.metadata.album,
item.metadata.duration,
item.metadata.year,
item.metadata.dimensions?.width,
item.metadata.dimensions?.height,
item.metadata.location,
item.metadata.appName,
item.metadata.appPackageName,
) )
) )
} }