From 0d89a36ff23fb845a67528bd6790202d1584d879 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Geoffrey=20M=C3=A9tais?= Date: Tue, 15 Oct 2019 10:50:49 +0200 Subject: [PATCH] Target Android 10 --- build.gradle | 4 ++-- .../main/java/org/videolan/tools/KotlinExtensions.kt | 5 +++-- vlc-android/src/org/videolan/vlc/ExternalMonitor.kt | 4 ++-- vlc-android/src/org/videolan/vlc/StoragesMonitor.kt | 4 ++-- .../videolan/vlc/gui/browser/MediaBrowserFragment.kt | 4 +--- .../videolan/vlc/gui/browser/StorageBrowserFragment.kt | 6 ++++-- .../videolan/vlc/gui/dialogs/NetworkServerDialog.kt | 10 ++++++---- .../vlc/gui/dialogs/SubtitleDownloadFragment.kt | 2 +- .../gui/dialogs/SubtitleDownloaderDialogFragment.kt | 6 ++++-- .../vlc/gui/dialogs/SubtitleHistoryFragment.kt | 2 +- .../org/videolan/vlc/gui/preferences/PreferencesUi.kt | 4 ++-- .../videolan/vlc/gui/tv/MediaItemDetailsFragment.kt | 2 +- .../org/videolan/vlc/gui/video/VideoPlayerActivity.kt | 4 +++- .../videolan/vlc/repository/ExternalSubRepository.kt | 2 +- vlc-android/src/org/videolan/vlc/util/FileUtils.kt | 2 +- vlc-android/src/org/videolan/vlc/util/Settings.kt | 2 +- .../src/org/videolan/vlc/util/VLCDownloadManager.kt | 4 ++-- vlc-android/src/org/videolan/vlc/util/VLCOptions.kt | 4 ++-- 18 files changed, 39 insertions(+), 32 deletions(-) diff --git a/build.gradle b/build.gradle index 0c4fa7cf0..823704b11 100644 --- a/build.gradle +++ b/build.gradle @@ -32,8 +32,8 @@ ext { libvlcVersion = '3.2-eap13' medialibraryVersion = '0.5-eap13' minSdkVersion = 17 - targetSdkVersion = 28 - compileSdkVersion = 28 + targetSdkVersion = 29 + compileSdkVersion = 29 androidxLegacyVersion = '1.0.0' androidxCoreVersion = '1.1.0' lifecycleViewmodelVersion = '2.1.0' diff --git a/tools/src/main/java/org/videolan/tools/KotlinExtensions.kt b/tools/src/main/java/org/videolan/tools/KotlinExtensions.kt index c65b3b9ba..fb8b945e3 100644 --- a/tools/src/main/java/org/videolan/tools/KotlinExtensions.kt +++ b/tools/src/main/java/org/videolan/tools/KotlinExtensions.kt @@ -75,6 +75,7 @@ fun Context.getColorFromAttr( } fun Context.copy(label: String, text: String) { - val clipboard = applicationContext.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager - clipboard.primaryClip = ClipData.newPlainText(label, text) + (applicationContext.getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager)?.run { + setPrimaryClip(ClipData.newPlainText(label, text)) + } } diff --git a/vlc-android/src/org/videolan/vlc/ExternalMonitor.kt b/vlc-android/src/org/videolan/vlc/ExternalMonitor.kt index 74adde90f..66c513f11 100644 --- a/vlc-android/src/org/videolan/vlc/ExternalMonitor.kt +++ b/vlc-android/src/org/videolan/vlc/ExternalMonitor.kt @@ -239,5 +239,5 @@ fun containsDevice(devices: Array, device: String): Boolean { } private sealed class DeviceAction -private class MediaMounted(val uri : Uri, val path : String = uri.path, val uuid : String = uri.lastPathSegment) : DeviceAction() -private class MediaUnmounted(val uri : Uri, val path : String = uri.path, val uuid : String = uri.lastPathSegment) : DeviceAction() \ No newline at end of file +private class MediaMounted(val uri : Uri, val path : String = uri.path!!, val uuid : String = uri.lastPathSegment!!) : DeviceAction() +private class MediaUnmounted(val uri : Uri, val path : String = uri.path!!, val uuid : String = uri.lastPathSegment!!) : DeviceAction() \ No newline at end of file diff --git a/vlc-android/src/org/videolan/vlc/StoragesMonitor.kt b/vlc-android/src/org/videolan/vlc/StoragesMonitor.kt index 23464d7af..94622ce5b 100644 --- a/vlc-android/src/org/videolan/vlc/StoragesMonitor.kt +++ b/vlc-android/src/org/videolan/vlc/StoragesMonitor.kt @@ -60,8 +60,8 @@ class StoragesMonitor : BroadcastReceiver() { } private sealed class MediaEvent(val ctx: Context) -private class Mount(ctx: Context, val uri : Uri, val path : String = uri.path, val uuid : String = uri.lastPathSegment) : MediaEvent(ctx) -private class Unmount(ctx: Context, val uri : Uri, val path : String = uri.path, val uuid : String = uri.lastPathSegment) : MediaEvent(ctx) +private class Mount(ctx: Context, val uri : Uri, val path : String = uri.path!!, val uuid : String = uri.lastPathSegment!!) : MediaEvent(ctx) +private class Unmount(ctx: Context, val uri : Uri, val path : String = uri.path!!, val uuid : String = uri.lastPathSegment!!) : MediaEvent(ctx) fun Context.enableStorageMonitoring() { val componentName = ComponentName(applicationContext, StoragesMonitor::class.java) diff --git a/vlc-android/src/org/videolan/vlc/gui/browser/MediaBrowserFragment.kt b/vlc-android/src/org/videolan/vlc/gui/browser/MediaBrowserFragment.kt index 1e135e5a1..35f2d9e52 100644 --- a/vlc-android/src/org/videolan/vlc/gui/browser/MediaBrowserFragment.kt +++ b/vlc-android/src/org/videolan/vlc/gui/browser/MediaBrowserFragment.kt @@ -96,9 +96,7 @@ abstract class MediaBrowserFragment : Fragment(), ActionMode. super.onCreate(savedInstanceState) mediaLibrary = AbstractMedialibrary.getInstance() setHasOptionsMenu(!AndroidDevices.isAndroidTv) - if (savedInstanceState?.keySet()?.contains(KEY_SELECTION) == true) { - savedSelection = (savedInstanceState.getParcelable(KEY_SELECTION) as SparseBooleanArrayParcelable).data - } + (savedInstanceState?.getParcelable(KEY_SELECTION))?.let { savedSelection = it.data } } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { diff --git a/vlc-android/src/org/videolan/vlc/gui/browser/StorageBrowserFragment.kt b/vlc-android/src/org/videolan/vlc/gui/browser/StorageBrowserFragment.kt index 73ad10dac..27a413492 100644 --- a/vlc-android/src/org/videolan/vlc/gui/browser/StorageBrowserFragment.kt +++ b/vlc-android/src/org/videolan/vlc/gui/browser/StorageBrowserFragment.kt @@ -150,8 +150,9 @@ class StorageBrowserFragment : FileBrowserFragment(), EntryPointsEventsCb { override fun onCtxClick(v: View, position: Int, item: MediaLibraryItem) { if (isRootDirectory) { val storage = adapter.getItem(position) as Storage + val path = storage.uri.path ?: return launch { - val isCustom = viewModel.customDirectoryExists(storage.uri.path) + val isCustom = viewModel.customDirectoryExists(path) if (isCustom && isAdded) showContext(requireActivity(), this@StorageBrowserFragment, position, item.title, CTX_CUSTOM_REMOVE) } } @@ -159,7 +160,8 @@ class StorageBrowserFragment : FileBrowserFragment(), EntryPointsEventsCb { override fun onCtxAction(position: Int, option: Int) { val storage = adapter.getItem(position) as Storage - viewModel.deleteCustomDirectory(storage.uri.path) + val path = storage.uri.path ?: return + viewModel.deleteCustomDirectory(path) viewModel.remove(storage) (activity as AudioPlayerContainerActivity).updateLib() } diff --git a/vlc-android/src/org/videolan/vlc/gui/dialogs/NetworkServerDialog.kt b/vlc-android/src/org/videolan/vlc/gui/dialogs/NetworkServerDialog.kt index 1adfc86e3..1e5a486ba 100644 --- a/vlc-android/src/org/videolan/vlc/gui/dialogs/NetworkServerDialog.kt +++ b/vlc-android/src/org/videolan/vlc/gui/dialogs/NetworkServerDialog.kt @@ -113,10 +113,12 @@ class NetworkServerDialog : DialogFragment(), AdapterView.OnItemSelectedListener if (!TextUtils.isEmpty(networkName)) editServername.setText(networkName) - val position = getProtocolSpinnerPosition(networkUri.scheme.toUpperCase()) - spinnerProtocol.setSelection(position) - val port = networkUri.port - editPort.setText(if (port != -1) port.toString() else getPortForProtocol(position)) + networkUri.scheme?.toUpperCase()?.let { + val position = getProtocolSpinnerPosition(it) + spinnerProtocol.setSelection(position) + val port = networkUri.port + editPort.setText(if (port != -1) port.toString() else getPortForProtocol(position)) + } } spinnerProtocol.onItemSelectedListener = this save.setOnClickListener(this) diff --git a/vlc-android/src/org/videolan/vlc/gui/dialogs/SubtitleDownloadFragment.kt b/vlc-android/src/org/videolan/vlc/gui/dialogs/SubtitleDownloadFragment.kt index b2c4e22ab..db6e0ef03 100644 --- a/vlc-android/src/org/videolan/vlc/gui/dialogs/SubtitleDownloadFragment.kt +++ b/vlc-android/src/org/videolan/vlc/gui/dialogs/SubtitleDownloadFragment.kt @@ -26,7 +26,7 @@ class SubtitleDownloadFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mediaUri = arguments?.getParcelable(MEDIA_PATH) ?: Uri.EMPTY - viewModel = ViewModelProviders.of(requireActivity(), SubtitlesModel.Factory(requireContext(), mediaUri)).get(mediaUri.path, SubtitlesModel::class.java) + viewModel = ViewModelProviders.of(requireActivity(), SubtitlesModel.Factory(requireContext(), mediaUri)).get(mediaUri.path!!, SubtitlesModel::class.java) } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { diff --git a/vlc-android/src/org/videolan/vlc/gui/dialogs/SubtitleDownloaderDialogFragment.kt b/vlc-android/src/org/videolan/vlc/gui/dialogs/SubtitleDownloaderDialogFragment.kt index 8e347df3d..11ddb4f84 100644 --- a/vlc-android/src/org/videolan/vlc/gui/dialogs/SubtitleDownloaderDialogFragment.kt +++ b/vlc-android/src/org/videolan/vlc/gui/dialogs/SubtitleDownloaderDialogFragment.kt @@ -42,7 +42,9 @@ class SubtitleDownloaderDialogFragment : DialogFragment() { for (subtitleEvent in channel) if (isActive) when (subtitleEvent) { is Click -> when (subtitleEvent.item.state) { State.NotDownloaded -> VLCDownloadManager.download(requireActivity(), subtitleEvent.item) - State.Downloaded -> deleteSubtitleDialog(requireActivity(), DialogInterface.OnClickListener { _, _ -> viewModel.deleteSubtitle(subtitleEvent.item.mediaUri.path, subtitleEvent.item.idSubtitle) } + State.Downloaded -> deleteSubtitleDialog(requireActivity(), DialogInterface.OnClickListener { _, _ -> + subtitleEvent.item.mediaUri.path?.let { viewModel.deleteSubtitle(it, subtitleEvent.item.idSubtitle) } + } , DialogInterface.OnClickListener { _, _ -> }) else -> return@actor } @@ -68,7 +70,7 @@ class SubtitleDownloaderDialogFragment : DialogFragment() { ?: arguments?.getParcelableArrayList(MEDIA_PATHS)?.toList() ?: listOf() if (uris.isEmpty()) dismiss() - viewModel = ViewModelProviders.of(requireActivity(), SubtitlesModel.Factory(requireContext(), uris[0])).get(uris[0].path, SubtitlesModel::class.java) + viewModel = ViewModelProviders.of(requireActivity(), SubtitlesModel.Factory(requireContext(), uris[0])).get(uris[0].path!!, SubtitlesModel::class.java) } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { diff --git a/vlc-android/src/org/videolan/vlc/gui/dialogs/SubtitleHistoryFragment.kt b/vlc-android/src/org/videolan/vlc/gui/dialogs/SubtitleHistoryFragment.kt index d97248649..d06991be9 100644 --- a/vlc-android/src/org/videolan/vlc/gui/dialogs/SubtitleHistoryFragment.kt +++ b/vlc-android/src/org/videolan/vlc/gui/dialogs/SubtitleHistoryFragment.kt @@ -21,7 +21,7 @@ class SubtitleHistoryFragment : Fragment() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) mediaUri = arguments?.getParcelable(MEDIA_PATH) ?: Uri.EMPTY - viewModel = ViewModelProviders.of(requireActivity(), SubtitlesModel.Factory(requireContext(), mediaUri)).get(mediaUri.path, SubtitlesModel::class.java) + viewModel = ViewModelProviders.of(requireActivity(), SubtitlesModel.Factory(requireContext(), mediaUri)).get(mediaUri.path!!, SubtitlesModel::class.java) } override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { diff --git a/vlc-android/src/org/videolan/vlc/gui/preferences/PreferencesUi.kt b/vlc-android/src/org/videolan/vlc/gui/preferences/PreferencesUi.kt index c64958f8a..fefbf5de6 100644 --- a/vlc-android/src/org/videolan/vlc/gui/preferences/PreferencesUi.kt +++ b/vlc-android/src/org/videolan/vlc/gui/preferences/PreferencesUi.kt @@ -125,12 +125,12 @@ class PreferencesUi : BasePreferenceFragment(), SharedPreferences.OnSharedPrefer "browser_show_all_files", "video_min_group_length" -> (activity as PreferencesActivity).setRestart() KEY_APP_THEME -> (activity as PreferencesActivity).exitAndRescan() LIST_TITLE_ELLIPSIZE -> { - Settings.listTitleEllipsize = sharedPreferences.getString(LIST_TITLE_ELLIPSIZE, "0").toInt() + Settings.listTitleEllipsize = sharedPreferences.getString(LIST_TITLE_ELLIPSIZE, "0")?.toInt() ?: 0 (activity as PreferencesActivity).setRestart() } "video_group_size" -> { val goupSizeValue = try { - Settings.getInstance(requireActivity()).getString(key, "6").toInt() + Settings.getInstance(requireActivity()).getString(key, "6")?.toInt() ?: 6 } catch (e: NumberFormatException) { 6 } diff --git a/vlc-android/src/org/videolan/vlc/gui/tv/MediaItemDetailsFragment.kt b/vlc-android/src/org/videolan/vlc/gui/tv/MediaItemDetailsFragment.kt index b25cdad84..506895445 100644 --- a/vlc-android/src/org/videolan/vlc/gui/tv/MediaItemDetailsFragment.kt +++ b/vlc-android/src/org/videolan/vlc/gui/tv/MediaItemDetailsFragment.kt @@ -79,7 +79,7 @@ class MediaItemDetailsFragment : DetailsSupportFragment() { viewModel.mediaStarted = false val extras = requireActivity().intent.extras ?: savedInstanceState ?: return - viewModel.mediaItemDetails = extras.getParcelable("item") as MediaItemDetails + viewModel.mediaItemDetails = extras.getParcelable("item") ?: return val hasMedia = extras.containsKey("media") val media = (extras.getParcelable("media") ?: MLServiceLocator.getAbstractMediaWrapper(AndroidUtil.LocationToUri(viewModel.mediaItemDetails.location))) as AbstractMediaWrapper diff --git a/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt b/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt index 9004b6628..1a02dd4a5 100644 --- a/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt +++ b/vlc-android/src/org/videolan/vlc/gui/video/VideoPlayerActivity.kt @@ -97,6 +97,7 @@ import org.videolan.vlc.media.MediaUtils import org.videolan.vlc.repository.ExternalSubRepository import org.videolan.vlc.repository.SlaveRepository import org.videolan.vlc.util.* +import org.videolan.vlc.util.FileUtils import org.videolan.vlc.viewmodels.PlaylistModel @Suppress("DEPRECATION") @@ -550,6 +551,7 @@ open class VideoPlayerActivity : AppCompatActivity(), IPlaybackSettingsControlle } override fun onNewIntent(intent: Intent) { + super.onNewIntent(intent) setIntent(intent) if (playbackStarted) service?.run { if (::hudBinding.isInitialized) { @@ -1837,7 +1839,7 @@ open class VideoPlayerActivity : AppCompatActivity(), IPlaybackSettingsControlle .setOnDismissListener { this.dimStatusBar(true) } .create().apply { setCanceledOnTouchOutside(true) - ownerActivity = this@VideoPlayerActivity + setOwnerActivity(this@VideoPlayerActivity) show() } } diff --git a/vlc-android/src/org/videolan/vlc/repository/ExternalSubRepository.kt b/vlc-android/src/org/videolan/vlc/repository/ExternalSubRepository.kt index f5a7ac56e..6f0626a6e 100644 --- a/vlc-android/src/org/videolan/vlc/repository/ExternalSubRepository.kt +++ b/vlc-android/src/org/videolan/vlc/repository/ExternalSubRepository.kt @@ -49,7 +49,7 @@ class ExternalSubRepository(private val externalSubDao: ExternalSubDao ) { } fun getDownloadedSubtitles(mediaUri: Uri): LiveData> { - val externalSubs = externalSubDao.get(mediaUri.path) + val externalSubs = externalSubDao.get(mediaUri.path!!) return Transformations.map(externalSubs) { list -> val existExternalSubs: MutableList = mutableListOf() list.forEach { diff --git a/vlc-android/src/org/videolan/vlc/util/FileUtils.kt b/vlc-android/src/org/videolan/vlc/util/FileUtils.kt index de2fe38de..3ed4d3dfc 100644 --- a/vlc-android/src/org/videolan/vlc/util/FileUtils.kt +++ b/vlc-android/src/org/videolan/vlc/util/FileUtils.kt @@ -412,7 +412,7 @@ object FileUtils { uri = MediaUtils.getContentMediaUri(data) } else if (TextUtils.equals(data.authority, ctx.getString(R.string.tv_provider_authority))) { val medialibrary = AbstractMedialibrary.getInstance() - val media = medialibrary.getMedia(data.lastPathSegment.toLong()) + val media = medialibrary.getMedia(data.lastPathSegment!!.toLong()) uri = media.uri } else { val inputPFD: ParcelFileDescriptor? diff --git a/vlc-android/src/org/videolan/vlc/util/Settings.kt b/vlc-android/src/org/videolan/vlc/util/Settings.kt index 6ee2e3269..ff3daf8ca 100644 --- a/vlc-android/src/org/videolan/vlc/util/Settings.kt +++ b/vlc-android/src/org/videolan/vlc/util/Settings.kt @@ -21,7 +21,7 @@ object Settings : SingletonHolder({ PreferenceManage fun init(prefs: SharedPreferences) { showVideoThumbs = prefs.getBoolean(SHOW_VIDEO_THUMBNAILS, true) tvUI = prefs.getBoolean(PREF_TV_UI, false) - listTitleEllipsize = prefs.getString(LIST_TITLE_ELLIPSIZE, "0").toInt() + listTitleEllipsize = prefs.getString(LIST_TITLE_ELLIPSIZE, "0")?.toInt() ?: 0 } val showTvUi : Boolean diff --git a/vlc-android/src/org/videolan/vlc/util/VLCDownloadManager.kt b/vlc-android/src/org/videolan/vlc/util/VLCDownloadManager.kt index b7c0ae4bb..ea3be5f29 100644 --- a/vlc-android/src/org/videolan/vlc/util/VLCDownloadManager.kt +++ b/vlc-android/src/org/videolan/vlc/util/VLCDownloadManager.kt @@ -84,7 +84,7 @@ object VLCDownloadManager: BroadcastReceiver(), LifecycleObserver { ExternalSubRepository.getInstance(context).removeDownloadingItem(id) downloadedPaths.forEach { if (it.endsWith(".srt")) - ExternalSubRepository.getInstance(context).saveDownloadedSubtitle(idSubtitle, it, mediaUri.path, subLanguageID, movieReleaseName) + ExternalSubRepository.getInstance(context).saveDownloadedSubtitle(idSubtitle, it, mediaUri.path!!, subLanguageID, movieReleaseName) } withContext(Dispatchers.IO) { FileUtils.deleteFile(localUri) } } @@ -122,7 +122,7 @@ object VLCDownloadManager: BroadcastReceiver(), LifecycleObserver { cursor.getString(localUriIndex) else "" - return Pair(status, if (localUri != null) Uri.parse(localUri).path else "") + return Pair(status, if (localUri != null) Uri.parse(localUri).path!! else "") } } diff --git a/vlc-android/src/org/videolan/vlc/util/VLCOptions.kt b/vlc-android/src/org/videolan/vlc/util/VLCOptions.kt index 6d471613f..b1e3a5962 100644 --- a/vlc-android/src/org/videolan/vlc/util/VLCOptions.kt +++ b/vlc-android/src/org/videolan/vlc/util/VLCOptions.kt @@ -69,9 +69,9 @@ object VLCOptions { val timeStrechingDefault = context != null && context.resources.getBoolean(R.bool.time_stretching_default) val timeStreching = pref.getBoolean("enable_time_stretching_audio", timeStrechingDefault) - val subtitlesEncoding = pref.getString("subtitle_text_encoding", "") + val subtitlesEncoding = pref.getString("subtitle_text_encoding", "") ?: "" val frameSkip = pref.getBoolean("enable_frame_skip", false) - val chroma = pref.getString("chroma_format", "RV16") + val chroma = pref.getString("chroma_format", "RV16") ?: "RV16" val verboseMode = pref.getBoolean("enable_verbose_mode", true) var deblocking = -1