From 9aa5eccb5130d961366eab8e02d4acc213c54b80 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Fri, 24 Apr 2020 19:43:57 +0530 Subject: [PATCH 01/22] Context changed to Activity --- app/src/main/java/com/allsoftdroid/audiobook/di/AppModule.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/allsoftdroid/audiobook/di/AppModule.kt b/app/src/main/java/com/allsoftdroid/audiobook/di/AppModule.kt index a4372bea..135b5ea1 100644 --- a/app/src/main/java/com/allsoftdroid/audiobook/di/AppModule.kt +++ b/app/src/main/java/com/allsoftdroid/audiobook/di/AppModule.kt @@ -1,5 +1,6 @@ package com.allsoftdroid.audiobook.di +import android.app.Activity import android.content.Context import com.allsoftdroid.audiobook.domain.usecase.GetLastPlayedUsecase import com.allsoftdroid.audiobook.feature_downloader.data.Downloader @@ -58,7 +59,7 @@ object AppModule { } single { - (ctx:Context) -> + (ctx:Activity) -> Downloader( ctx, get() From d092a4396e4a36b175392d945311629e0c7b5dcc Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Fri, 24 Apr 2020 19:45:00 +0530 Subject: [PATCH 02/22] getter and setter added for downloads folder path --- .../common/base/network/ArchiveUtils.kt | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/common/src/main/java/com/allsoftdroid/common/base/network/ArchiveUtils.kt b/common/src/main/java/com/allsoftdroid/common/base/network/ArchiveUtils.kt index b8b9f228..8982776c 100644 --- a/common/src/main/java/com/allsoftdroid/common/base/network/ArchiveUtils.kt +++ b/common/src/main/java/com/allsoftdroid/common/base/network/ArchiveUtils.kt @@ -1,5 +1,10 @@ package com.allsoftdroid.common.base.network +import android.app.Activity +import android.content.Context +import android.os.Environment +import com.allsoftdroid.common.R + class ArchiveUtils { companion object{ @@ -18,5 +23,20 @@ class ArchiveUtils { fun getThumbnail(imageId: String?) = "$BASE_IMAGE_URL/$imageId/" fun getLocalSavePath(path:String) = "/AudioBooks/$path/" + + fun setDownloadsRootFolder(context: Activity, root:String){ + val sharedPref = context.getPreferences(Context.MODE_PRIVATE) ?: return + with (sharedPref.edit()) { + putString(context.getString(R.string.downloads_root_directory_key), root) + commit() + } + } + + fun getDownloadsRootFolder(context: Activity): String { + val default = Environment.DIRECTORY_DOWNLOADS + val sharedPref = context.getPreferences(Context.MODE_PRIVATE) + + return sharedPref.getString(context.getString(R.string.downloads_root_directory_key),default)?:default + } } } \ No newline at end of file From 8bbbac6651b293c24af463a643b0f2117e4b3acc Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Fri, 24 Apr 2020 19:45:47 +0530 Subject: [PATCH 03/22] key added for downloads folder path in sharedPref --- common/src/main/res/values/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml index e81d71bf..e20466e3 100644 --- a/common/src/main/res/values/strings.xml +++ b/common/src/main/res/values/strings.xml @@ -1,4 +1,5 @@ common No Internet Connection! + dowloads_root_directory_for_downloads From ee04740604d50dbc07746e37c7e84d0c979eb093 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Fri, 24 Apr 2020 19:46:56 +0530 Subject: [PATCH 04/22] album subpath is set to be it's id for easy and unique reference --- .../presentation/viewModel/BookDetailsViewModel.kt | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/feature_book_details/src/main/java/com/allsoftdroid/feature/book_details/presentation/viewModel/BookDetailsViewModel.kt b/feature_book_details/src/main/java/com/allsoftdroid/feature/book_details/presentation/viewModel/BookDetailsViewModel.kt index c680d68e..0d20bf1f 100644 --- a/feature_book_details/src/main/java/com/allsoftdroid/feature/book_details/presentation/viewModel/BookDetailsViewModel.kt +++ b/feature_book_details/src/main/java/com/allsoftdroid/feature/book_details/presentation/viewModel/BookDetailsViewModel.kt @@ -273,14 +273,15 @@ class BookDetailsViewModel( track?.let { val album = it.trackAlbum?:getMetadataUsecase.getBookIdentifier() val desc = "Downloading: chapter ${track.trackNumber} from $album" + val id = getMetadataUsecase.getBookIdentifier() download( Download( - bookId = getMetadataUsecase.getBookIdentifier(), - url = ArchiveUtils.getRemoteFilePath(filename = track.filename,identifier = getMetadataUsecase.getBookIdentifier()), + bookId = id, + url = ArchiveUtils.getRemoteFilePath(filename = track.filename,identifier = id), name = track.filename, chapter = track.title?:"", description = desc, - subPath = ArchiveUtils.getLocalSavePath(album), + subPath = ArchiveUtils.getLocalSavePath(id), chapterIndex = track.trackNumber?:0 ) ) From 2f3ee1e49878b97a7fb5690b1e9088824b0124db Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Fri, 24 Apr 2020 19:48:18 +0530 Subject: [PATCH 05/22] context changed to Activity and root folder is fetched from sharedPref --- .../feature_downloader/data/Downloader.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/feature_downloader/src/main/java/com/allsoftdroid/audiobook/feature_downloader/data/Downloader.java b/feature_downloader/src/main/java/com/allsoftdroid/audiobook/feature_downloader/data/Downloader.java index 151d7d3f..afbb5aa9 100644 --- a/feature_downloader/src/main/java/com/allsoftdroid/audiobook/feature_downloader/data/Downloader.java +++ b/feature_downloader/src/main/java/com/allsoftdroid/audiobook/feature_downloader/data/Downloader.java @@ -1,5 +1,6 @@ package com.allsoftdroid.audiobook.feature_downloader.data; +import android.app.Activity; import android.app.DownloadManager; import android.content.ClipData; import android.content.ClipboardManager; @@ -22,6 +23,7 @@ import com.allsoftdroid.audiobook.feature_downloader.utils.DownloadObserver; import com.allsoftdroid.audiobook.feature_downloader.utils.downloadUtils; import com.allsoftdroid.common.base.extension.Event; +import com.allsoftdroid.common.base.network.ArchiveUtils; import com.allsoftdroid.common.base.store.downloader.Cancel; import com.allsoftdroid.common.base.store.downloader.Cancelled; import com.allsoftdroid.common.base.store.downloader.Download; @@ -49,7 +51,7 @@ public class Downloader implements IDownloader { - private Context mContext; + private Activity mContext; private DownloadManager downloadManager; private DownloadEventStore mDownloadEventStore; private static HashMap keyStrokeCount = new HashMap<>(); @@ -57,12 +59,12 @@ public class Downloader implements IDownloader { private boolean isDownloading = false; private LinkedHashMap mDownloadQueue = new LinkedHashMap<>(); - public Downloader(Context context) { + public Downloader(Activity context) { mContext = context; downloadManager = (DownloadManager) mContext.getSystemService(DOWNLOAD_SERVICE); } - public Downloader(Context context, DownloadEventStore eventStore){ + public Downloader(Activity context, DownloadEventStore eventStore){ mContext = context; downloadManager = (DownloadManager) mContext.getSystemService(DOWNLOAD_SERVICE); mDownloadEventStore = eventStore; @@ -189,6 +191,9 @@ public void updateProgress(String mUrl,String mBookId,int mChapterIndex,long pro private long download(String URL, String name, String description, String subPath){ + //TODO: user defined path for download path can be in default path for DIRECTORY_DOWNLOADS + String downloadFolder = ArchiveUtils.Companion.getDownloadsRootFolder(mContext); + //store downloadId to database for own reference long downloadId= downloadUtils.getDownloadIdIfIsDownloading(mContext,URL); if(downloadId==DOWNLOADER_NOT_DOWNLOADING){ @@ -199,6 +204,7 @@ private long download(String URL, String name, String description, String subPat uri, name, description, + downloadFolder, subPath ); From cf58a49e46a3b2d73dbddd1cf3f73c07d7fff8b4 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Fri, 24 Apr 2020 19:49:18 +0530 Subject: [PATCH 06/22] hard coded parent directory is provided by function param --- .../audiobook/feature_downloader/utils/downloadUtils.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/feature_downloader/src/main/java/com/allsoftdroid/audiobook/feature_downloader/utils/downloadUtils.java b/feature_downloader/src/main/java/com/allsoftdroid/audiobook/feature_downloader/utils/downloadUtils.java index 6f678e02..337bf162 100644 --- a/feature_downloader/src/main/java/com/allsoftdroid/audiobook/feature_downloader/utils/downloadUtils.java +++ b/feature_downloader/src/main/java/com/allsoftdroid/audiobook/feature_downloader/utils/downloadUtils.java @@ -124,6 +124,7 @@ public static long DownloadData(DownloadManager downloadManager, Uri uri, String name, String description, + String root, String subPath) { long downloadReference; @@ -140,7 +141,7 @@ public static long DownloadData(DownloadManager downloadManager, request.setDescription(description); //Set the local destination for the downloaded file to a path within the application's external files directory - request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS,subPath+name); + request.setDestinationInExternalPublicDir(root,subPath+name); //Show notification visibility request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); From 38aa7b968dae51012574475827c3ca7d3e457ef1 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Fri, 24 Apr 2020 22:33:44 +0530 Subject: [PATCH 07/22] context changed to application --- .../allsoftdroid/common/base/network/ArchiveUtils.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/common/src/main/java/com/allsoftdroid/common/base/network/ArchiveUtils.kt b/common/src/main/java/com/allsoftdroid/common/base/network/ArchiveUtils.kt index 8982776c..11e32403 100644 --- a/common/src/main/java/com/allsoftdroid/common/base/network/ArchiveUtils.kt +++ b/common/src/main/java/com/allsoftdroid/common/base/network/ArchiveUtils.kt @@ -1,6 +1,6 @@ package com.allsoftdroid.common.base.network -import android.app.Activity +import android.app.Application import android.content.Context import android.os.Environment import com.allsoftdroid.common.R @@ -22,19 +22,19 @@ class ArchiveUtils { fun getThumbnail(imageId: String?) = "$BASE_IMAGE_URL/$imageId/" - fun getLocalSavePath(path:String) = "/AudioBooks/$path/" + fun getLocalSavePath(bookId:String) = "/AudioBooks/$bookId/" - fun setDownloadsRootFolder(context: Activity, root:String){ - val sharedPref = context.getPreferences(Context.MODE_PRIVATE) ?: return + fun setDownloadsRootFolder(context: Application, root:String){ + val sharedPref = context.getSharedPreferences(context.getString(R.string.downloads_path),Context.MODE_PRIVATE) ?: return with (sharedPref.edit()) { putString(context.getString(R.string.downloads_root_directory_key), root) commit() } } - fun getDownloadsRootFolder(context: Activity): String { + fun getDownloadsRootFolder(context: Application): String { val default = Environment.DIRECTORY_DOWNLOADS - val sharedPref = context.getPreferences(Context.MODE_PRIVATE) + val sharedPref = context.getSharedPreferences(context.getString(R.string.downloads_path),Context.MODE_PRIVATE) return sharedPref.getString(context.getString(R.string.downloads_root_directory_key),default)?:default } From 694e064d17a226aebf02e692559462c30c1a9dbd Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Fri, 24 Apr 2020 22:34:33 +0530 Subject: [PATCH 08/22] download path string resource added --- common/src/main/res/values/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml index e20466e3..5be83665 100644 --- a/common/src/main/res/values/strings.xml +++ b/common/src/main/res/values/strings.xml @@ -2,4 +2,5 @@ common No Internet Connection! dowloads_root_directory_for_downloads + local_downloads_path From 35a5fc862139bd0129993d817df57d4673dbef93 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Fri, 24 Apr 2020 22:35:15 +0530 Subject: [PATCH 09/22] unused adapter removed --- .../feature/book_details/utils/BindingUtil.kt | 8 -------- 1 file changed, 8 deletions(-) diff --git a/feature_book_details/src/main/java/com/allsoftdroid/feature/book_details/utils/BindingUtil.kt b/feature_book_details/src/main/java/com/allsoftdroid/feature/book_details/utils/BindingUtil.kt index a66c0453..c78eef55 100644 --- a/feature_book_details/src/main/java/com/allsoftdroid/feature/book_details/utils/BindingUtil.kt +++ b/feature_book_details/src/main/java/com/allsoftdroid/feature/book_details/utils/BindingUtil.kt @@ -80,14 +80,6 @@ fun setTrackDownloadStatus(imageView: ImageView,item :AudioBookTrackDomainModel? Timber.d("Download image icon updated") } -@BindingAdapter("trackDownloadProgress") -fun setTrackDownloadProgress(view: ProgressBar, holder:TrackItemViewHolder?){ - - holder?.let { - Timber.d("Download event received with progress for $holder") - } -} - /** Handle visibility of progress bar */ From 3d63b24b5d6cee981d8c7305f9ba31252bcc5bdf Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Fri, 24 Apr 2020 22:35:59 +0530 Subject: [PATCH 10/22] context changed to application --- .../audiobook/feature_downloader/data/Downloader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/feature_downloader/src/main/java/com/allsoftdroid/audiobook/feature_downloader/data/Downloader.java b/feature_downloader/src/main/java/com/allsoftdroid/audiobook/feature_downloader/data/Downloader.java index afbb5aa9..c92628ba 100644 --- a/feature_downloader/src/main/java/com/allsoftdroid/audiobook/feature_downloader/data/Downloader.java +++ b/feature_downloader/src/main/java/com/allsoftdroid/audiobook/feature_downloader/data/Downloader.java @@ -192,7 +192,7 @@ public void updateProgress(String mUrl,String mBookId,int mChapterIndex,long pro private long download(String URL, String name, String description, String subPath){ //TODO: user defined path for download path can be in default path for DIRECTORY_DOWNLOADS - String downloadFolder = ArchiveUtils.Companion.getDownloadsRootFolder(mContext); + String downloadFolder = ArchiveUtils.Companion.getDownloadsRootFolder(mContext.getApplication()); //store downloadId to database for own reference long downloadId= downloadUtils.getDownloadIdIfIsDownloading(mContext,URL); From 3be71329244d22e8aefc5f072adc967416b3e786 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Fri, 24 Apr 2020 22:36:45 +0530 Subject: [PATCH 11/22] logging added for else --- .../presentation/viewModel/MiniPlayerViewModel.kt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/feature_mini_player/src/main/java/com/allsoftdroid/audiobook/feature_mini_player/presentation/viewModel/MiniPlayerViewModel.kt b/feature_mini_player/src/main/java/com/allsoftdroid/audiobook/feature_mini_player/presentation/viewModel/MiniPlayerViewModel.kt index 9c94b193..c2fc1f16 100644 --- a/feature_mini_player/src/main/java/com/allsoftdroid/audiobook/feature_mini_player/presentation/viewModel/MiniPlayerViewModel.kt +++ b/feature_mini_player/src/main/java/com/allsoftdroid/audiobook/feature_mini_player/presentation/viewModel/MiniPlayerViewModel.kt @@ -123,6 +123,8 @@ class MiniPlayerViewModel( ) )) } + }else{ + Timber.d("Player is not ready") } } From 9178dd052a94312894618e925afedcbc68de189c Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Fri, 24 Apr 2020 22:37:19 +0530 Subject: [PATCH 12/22] unused imports removed --- .../feature_mini_player/presentation/MiniPlayerFragment.kt | 5 ----- 1 file changed, 5 deletions(-) diff --git a/feature_mini_player/src/main/java/com/allsoftdroid/audiobook/feature_mini_player/presentation/MiniPlayerFragment.kt b/feature_mini_player/src/main/java/com/allsoftdroid/audiobook/feature_mini_player/presentation/MiniPlayerFragment.kt index 99dfd590..ad38fa6b 100644 --- a/feature_mini_player/src/main/java/com/allsoftdroid/audiobook/feature_mini_player/presentation/MiniPlayerFragment.kt +++ b/feature_mini_player/src/main/java/com/allsoftdroid/audiobook/feature_mini_player/presentation/MiniPlayerFragment.kt @@ -6,16 +6,11 @@ import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.lifecycle.Observer -import androidx.navigation.fragment.findNavController import com.allsoftdroid.audiobook.feature_mini_player.R import com.allsoftdroid.audiobook.feature_mini_player.databinding.FragmentMiniPlayerBinding import com.allsoftdroid.audiobook.feature_mini_player.di.FeatureMiniPlayerModule import com.allsoftdroid.audiobook.feature_mini_player.presentation.viewModel.MiniPlayerViewModel -import com.allsoftdroid.common.base.extension.Event -import com.allsoftdroid.common.base.extension.PlayingState import com.allsoftdroid.common.base.fragment.BaseContainerFragment -import com.allsoftdroid.common.base.store.audioPlayer.* -import io.reactivex.disposables.Disposable import org.koin.android.ext.android.inject import timber.log.Timber From 192e7a6ccdeb8998a8f004c38dd5118be42d5629 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Fri, 24 Apr 2020 22:38:12 +0530 Subject: [PATCH 13/22] removed bookId param as it us not used --- .../audiobook/services/audio/service/AudioService.kt | 1 - .../audiobook/services/audio/utils/NotificationUtils.kt | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/services/src/main/java/com/allsoftdroid/audiobook/services/audio/service/AudioService.kt b/services/src/main/java/com/allsoftdroid/audiobook/services/audio/service/AudioService.kt index 5319183f..c2592849 100644 --- a/services/src/main/java/com/allsoftdroid/audiobook/services/audio/service/AudioService.kt +++ b/services/src/main/java/com/allsoftdroid/audiobook/services/audio/service/AudioService.kt @@ -225,7 +225,6 @@ class AudioService : Service(),KoinComponent{ private fun buildNotification( isItFirst:Boolean = false) { sendNotification( trackTitle = audioServiceBinder.getCurrentTrackTitle(), - bookId = audioServiceBinder.getBookId(), bookName = audioServiceBinder.getBookName(), applicationContext = applicationContext, service = this, diff --git a/services/src/main/java/com/allsoftdroid/audiobook/services/audio/utils/NotificationUtils.kt b/services/src/main/java/com/allsoftdroid/audiobook/services/audio/utils/NotificationUtils.kt index 1a320173..84a14f28 100644 --- a/services/src/main/java/com/allsoftdroid/audiobook/services/audio/utils/NotificationUtils.kt +++ b/services/src/main/java/com/allsoftdroid/audiobook/services/audio/utils/NotificationUtils.kt @@ -31,7 +31,7 @@ class NotificationUtils { private const val NOTIFICATION_CHANNEL = "audio_book_music_player_channel" @SuppressLint("NewApi") - fun sendNotification(isAudioPlaying:Boolean, currentAudioPos:Int, service: AudioService, applicationContext: Context, trackTitle:String, bookId: String, bookName:String) { + fun sendNotification(isAudioPlaying:Boolean, currentAudioPos:Int, service: AudioService, applicationContext: Context, trackTitle:String, bookName:String) { val collapsedView = RemoteViews(applicationContext.packageName, R.layout.notification_mini_player_collapsed) var playPauseIcon = 0 From 7899f9a69488099bbf222e87c8753fd8d58609ad Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Fri, 24 Apr 2020 22:38:49 +0530 Subject: [PATCH 14/22] player code is moved to AudioBookPlayer.kt class --- .../audio/service/AudioServiceBinder.kt | 251 +++--------------- 1 file changed, 44 insertions(+), 207 deletions(-) diff --git a/services/src/main/java/com/allsoftdroid/audiobook/services/audio/service/AudioServiceBinder.kt b/services/src/main/java/com/allsoftdroid/audiobook/services/audio/service/AudioServiceBinder.kt index e70ab7d1..c1ecbb5c 100644 --- a/services/src/main/java/com/allsoftdroid/audiobook/services/audio/service/AudioServiceBinder.kt +++ b/services/src/main/java/com/allsoftdroid/audiobook/services/audio/service/AudioServiceBinder.kt @@ -1,33 +1,18 @@ package com.allsoftdroid.audiobook.services.audio.service import android.app.Application -import android.content.Context import android.os.Binder -import androidx.core.net.toUri -import com.allsoftdroid.audiobook.services.R +import com.allsoftdroid.audiobook.services.audio.utils.AudioBookPlayer import com.allsoftdroid.common.base.extension.AudioPlayListItem import com.allsoftdroid.common.base.extension.Event import com.allsoftdroid.common.base.extension.Variable -import com.allsoftdroid.common.base.network.ArchiveUtils -import com.google.android.exoplayer2.C -import com.google.android.exoplayer2.ExoPlaybackException -import com.google.android.exoplayer2.ExoPlayerFactory -import com.google.android.exoplayer2.Player.* -import com.google.android.exoplayer2.SimpleExoPlayer -import com.google.android.exoplayer2.source.ConcatenatingMediaSource -import com.google.android.exoplayer2.source.ExtractorMediaSource -import com.google.android.exoplayer2.trackselection.DefaultTrackSelector -import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory -import com.google.android.exoplayer2.util.Util +import io.reactivex.disposables.CompositeDisposable import timber.log.Timber class AudioServiceBinder(application: Application) : Binder(){ - private var exoPlayer: SimpleExoPlayer? = null - - // Caller activity context, used when play local audio file. - private var context: Context = application + private val player = AudioBookPlayer(application) //id of playing audio book private lateinit var bookId:String @@ -49,138 +34,34 @@ class AudioServiceBinder(application: Application) : Binder(){ val errorEvent = Variable(Event(false)) val isPlayerReadyEvent = Variable(Event(false)) - /** - * EXO Code start - */ - - private val playerEventListener = object : EventListener { - - override fun onPlayerError(error: ExoPlaybackException) { - Timber.w(error, "onPlayerError type: ${error.type}") - } - - override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) { - Timber.d("onPlayerStateChanged -> playWhenReady: $playWhenReady, playbackState: $playbackState, playbackError: ${exoPlayer?.playbackError}") - - if (exoPlayer?.playbackError != null) { - Timber.d("Error detected ") - - exoPlayer?.playbackError?.let { - when(it.type){ - ExoPlaybackException.TYPE_SOURCE->{ - Timber.d("Source Error detected :${it.message}") - } - ExoPlaybackException.TYPE_REMOTE->{ - Timber.d("Remote Error detected :${it.message}") - } - ExoPlaybackException.TYPE_OUT_OF_MEMORY->{ - Timber.d("Memory Error detected :${it.message}") - } - ExoPlaybackException.TYPE_RENDERER->{ - Timber.d("Renderer Error detected :${it.message}") - } - ExoPlaybackException.TYPE_UNEXPECTED->{ - Timber.d("Unexpected Error detected :${it.message}") - } - } - } - - errorEvent.value = Event(true) - Timber.d("Is playing :${exoPlayer?.isPlaying}") - isPlayerReadyEvent.value = Event(false) - Timber.d("Player is not ready to play") - return - } - - if (shouldPreparePlayerAgain(playWhenReady, playbackState)) { - if (playbackState != STATE_ENDED){ - Timber.d("Preparing player again") - preparePlayer() - } - } - - when(playbackState){ - STATE_ENDED -> { - Timber.d("ENDED") - errorEvent.value = Event(true) - } - - STATE_IDLE -> { - Timber.d("IDLE") - isPlayerReadyEvent.value = Event(false) - Timber.d("Player is not ready to play") - } - STATE_BUFFERING -> { - Timber.d("Buffering") - isPlayerReadyEvent.value = Event(false) - Timber.d("Player is still bufferring") - } - STATE_READY -> { - Timber.d("Ready") - isPlayerReadyEvent.value = Event(true) - Timber.d("Player is ready to play") - } - } - } - - override fun onPositionDiscontinuity(reason: Int) { - - exoPlayer?.let { - Timber.d("Event ended audio about to start new") - if(trackPos != it.currentWindowIndex){ - nextTrackEvent.value= Event(true) - _trackTitle.value = trackList[it.currentWindowIndex].title?:"NA" - trackPos = it.currentWindowIndex - } - } - } - } - - private fun shouldPreparePlayerAgain(playWhenReady: Boolean, playbackState: Int) - = playWhenReady && (playbackState == STATE_IDLE || playbackState == STATE_ENDED) - - private fun preparePlayer() { - Timber.d("Preparing player") - exoPlayer?.prepare(createMediaSource(trackList)) - exoPlayer?.seekTo(trackPos,C.TIME_UNSET) - } + private var disposable:CompositeDisposable = CompositeDisposable() - private fun createMediaSource(playlist : List): ConcatenatingMediaSource { - Timber.d("Create media source called") - val dataSourceFactory = DefaultDataSourceFactory(context, Util.getUserAgent(context, context.getString(R.string.audio_player_service))) - val concatenatingMediaSource = ConcatenatingMediaSource() + private fun onCreate(){ + player.createPlayer() + disposable.add(player.trackTitle.observable.subscribe { + _trackTitle.value = it + }) - Timber.d("Building media list") - for (sample in playlist) { - val mediaSource = ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(ArchiveUtils.getRemoteFilePath(sample.filename,bookId).toUri()) - concatenatingMediaSource.addMediaSource(mediaSource) - } + disposable.add(player.nextTrackEvent.observable.subscribe { + nextTrackEvent.value = it + }) - return concatenatingMediaSource - } + disposable.add(player.errorEvent.observable.subscribe { + errorEvent.value = it + }) - private fun onCreate(){ - Timber.d("Created") - this.exoPlayer = ExoPlayerFactory.newSimpleInstance(context, DefaultTrackSelector()).apply { - addListener(playerEventListener) - Timber.d("Listener attached") - } - Timber.d("Player created") + disposable.add(player.isPlayerReadyEvent.observable.subscribe{ + isPlayerReadyEvent.value = it + }) } fun onUnbind() { - Timber.i("Destroyed") - exoPlayer?.run { - removeListener(playerEventListener) - release() - Timber.d("Release player") - } - - exoPlayer = null + player.destroyPlayer() + disposable.dispose() } fun initializeAndPlay(currentPos: Int) { - if (exoPlayer == null){ + if (!player.isPlayerInitialized()){ Timber.d("Player is not yet created. starting to create") onCreate() } @@ -190,83 +71,53 @@ class AudioServiceBinder(application: Application) : Binder(){ } fun goToPreviousOrBeginning() { - Timber.d("Previous called") - exoPlayer?.run { - if (hasPrevious()) { - this.playWhenReady = true - previous() - if(this.currentWindowIndex>=0){ - _trackTitle.value = trackList[this.currentWindowIndex].title?:"NA" - } - Timber.d("Title: ${trackTitle.value}") - } else { - seekToDefaultPosition() - Timber.d("default Title: ${trackTitle.value}") - } + if(player.isPlayerInitialized()){ + Timber.d("Previous called") + player.goToPreviousOrBeginning() } } fun goToNext() { - Timber.d("Next called") - exoPlayer?.let { - if(it.hasNext()){ - it.playWhenReady = true - it.next() - if(it.currentWindowIndex< trackList.size) - { - _trackTitle.value = trackList[it.currentWindowIndex].title?:"NA" - } - Timber.d("Title: ${trackTitle.value}") - }else{ - Timber.d("Track completed playing") - } + if(player.isPlayerInitialized()){ + Timber.d("Next called") + player.goToNext() } } fun pause(){ - exoPlayer?.apply { - this.playWhenReady = false + if(player.isPlayerInitialized()){ + Timber.d("Player pause") + player.pause() } } fun resume(){ - exoPlayer?.apply { - playWhenReady = true - - if(playbackError!=null){ - Timber.d("Retrying ") - retry() - } + if(player.isPlayerInitialized()){ + Timber.d("Player resumed") + player.resume() } } - fun isPlaying() = exoPlayer?.isPlaying?:false - private fun setTrackPosition(pos:Int){ trackPos = pos - if (isPlaying()){ - exoPlayer?.stop() - Timber.d("Player stopped") - } - - exoPlayer?.let { - it.seekTo(pos, C.TIME_UNSET) - Timber.d("Seek is set to $pos") - it.playWhenReady = true - _trackTitle.value = trackList[it.currentWindowIndex].title?:"NA" - Timber.d("Track title updated and soon will be played") + if(player.isPlayerInitialized()){ + player.stopIfPlaying() + player.playFromPosition(pos) } } fun setBookDetails(id: String, name: String){ bookId = id bookName = name + player.bookDetails(bookId, null) + Timber.d("Book ID is $id") } fun setMultipleTracks(tracks: List){ trackList = tracks + player.bookDetails(null, tracks) Timber.d("Track list set and it's size is ${tracks.size}") } @@ -274,34 +125,20 @@ class AudioServiceBinder(application: Application) : Binder(){ // Return current audio play position. fun getCurrentAudioPosition(): Int { - var ret = 0 - - exoPlayer?.let { - ret = it.currentWindowIndex - } - Timber.d("Current track pos is $ret") - return ret + return player.getCurrentPlayingTrackPosition() } fun getBookId() = bookId fun getBookName() = bookName - fun isInitialized() = exoPlayer!=null + fun isInitialized() = player.isPlayerInitialized() fun getTrackPlayingProgress():Int{ - exoPlayer?.let { - return (it.currentPosition*100/it.duration).toInt() - } - - return 0 + return player.getProgressInPercent() } fun getTrackDurationLeft():Long{ - exoPlayer?.let { - val timeLeft = it.duration - it.currentPosition - return if(timeLeft>0) timeLeft else 0 - } - - return 0 + return player.getTimeLeftInMillis() } + fun isPlaying() = player.isPlaying() } From b979a07c622498057f225ee9b32bd52c0a98480d Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Fri, 24 Apr 2020 22:39:41 +0530 Subject: [PATCH 15/22] AudioPlayer code is segregated from Services --- .../services/audio/utils/AudioBookPlayer.kt | 262 ++++++++++++++++++ 1 file changed, 262 insertions(+) create mode 100644 services/src/main/java/com/allsoftdroid/audiobook/services/audio/utils/AudioBookPlayer.kt diff --git a/services/src/main/java/com/allsoftdroid/audiobook/services/audio/utils/AudioBookPlayer.kt b/services/src/main/java/com/allsoftdroid/audiobook/services/audio/utils/AudioBookPlayer.kt new file mode 100644 index 00000000..3f88d77a --- /dev/null +++ b/services/src/main/java/com/allsoftdroid/audiobook/services/audio/utils/AudioBookPlayer.kt @@ -0,0 +1,262 @@ +package com.allsoftdroid.audiobook.services.audio.utils + +import android.app.Application +import com.allsoftdroid.common.base.extension.AudioPlayListItem +import com.allsoftdroid.common.base.extension.Event +import com.allsoftdroid.common.base.extension.Variable +import com.google.android.exoplayer2.* +import com.google.android.exoplayer2.trackselection.DefaultTrackSelector +import timber.log.Timber + +class AudioBookPlayer(private val context:Application) { + + private val prepareMedia = PrepareMediaHandler(context) + + //current position + private var trackPos:Int = 0 + + private var _trackTitle = Variable("") + val trackTitle : Variable + get() = _trackTitle + + private lateinit var trackList: List + private lateinit var bookId:String + + private var exoPlayer: SimpleExoPlayer? = null + + + val nextTrackEvent = Variable(Event(false)) + val errorEvent = Variable(Event(false)) + val isPlayerReadyEvent = Variable(Event(false)) + + fun createPlayer(){ + Timber.d("Created") + this.exoPlayer = ExoPlayerFactory.newSimpleInstance(context, DefaultTrackSelector()).apply { + addListener(playerEventListener) + Timber.d("Listener attached") + } + Timber.d("Player created") + } + + fun isPlayerInitialized() = exoPlayer != null + + private val playerEventListener = object : Player.EventListener { + + override fun onPlayerError(error: ExoPlaybackException) { + Timber.w(error, "onPlayerError type: ${error.type}") + } + + override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) { + Timber.d("onPlayerStateChanged -> playWhenReady: $playWhenReady, playbackState: $playbackState, playbackError: ${exoPlayer?.playbackError}") + + if (exoPlayer?.playbackError != null) { + Timber.d("Error detected ") + + exoPlayer?.playbackError?.let { + when(it.type){ + ExoPlaybackException.TYPE_SOURCE->{ + Timber.d("Source Error detected :${it.message}") + } + ExoPlaybackException.TYPE_REMOTE->{ + Timber.d("Remote Error detected :${it.message}") + } + ExoPlaybackException.TYPE_OUT_OF_MEMORY->{ + Timber.d("Memory Error detected :${it.message}") + } + ExoPlaybackException.TYPE_RENDERER->{ + Timber.d("Renderer Error detected :${it.message}") + } + ExoPlaybackException.TYPE_UNEXPECTED->{ + Timber.d("Unexpected Error detected :${it.message}") + } + } + } + + errorEvent.value = Event(true) + Timber.d("Is playing :${exoPlayer?.isPlaying}") + isPlayerReadyEvent.value = Event(false) + Timber.d("Player is not ready to play") + return + } + + if (shouldPreparePlayerAgain(playWhenReady, playbackState)) { + if (playbackState != Player.STATE_ENDED){ + Timber.d("Preparing player again") + + if(bookId.isNotEmpty() && trackList.isNotEmpty()){ + preparePlayer(bookId,trackList) + } + } + } + + when(playbackState){ + Player.STATE_ENDED -> { + Timber.d("ENDED") + errorEvent.value = Event(true) + } + + Player.STATE_IDLE -> { + Timber.d("IDLE") + isPlayerReadyEvent.value = Event(false) + Timber.d("Player is not ready to play") + } + Player.STATE_BUFFERING -> { + Timber.d("Buffering") + isPlayerReadyEvent.value = Event(false) + Timber.d("Player is still bufferring") + } + Player.STATE_READY -> { + Timber.d("Ready") + isPlayerReadyEvent.value = Event(true) + Timber.d("Player is ready to play") + } + } + } + + override fun onPositionDiscontinuity(reason: Int) { + + exoPlayer?.let { + Timber.d("Event ended audio about to start new") + if(trackPos != it.currentWindowIndex){ + nextTrackEvent.value= Event(true) + _trackTitle.value = trackList[it.currentWindowIndex].title?:"NA" + trackPos = it.currentWindowIndex + } + } + } + } + + private fun shouldPreparePlayerAgain(playWhenReady: Boolean, playbackState: Int) + = playWhenReady && (playbackState == Player.STATE_IDLE || playbackState == Player.STATE_ENDED) + + private fun preparePlayer(bookId:String,trackList: List) { + + Timber.d("Preparing player") + exoPlayer?.prepare(prepareMedia.createMediaSource(bookId, trackList)) + exoPlayer?.seekTo(trackPos, C.TIME_UNSET) + } + + fun stopIfPlaying(){ + + exoPlayer?.let { + if(it.isPlaying){ + it.stop() + Timber.d("Player stopped") + } + } + } + + fun isPlaying():Boolean{ + return exoPlayer?.isPlaying?:false + } + + fun playFromPosition(pos:Int){ + exoPlayer?.let { + it.seekTo(pos, C.TIME_UNSET) + Timber.d("Seek is set to $pos") + it.playWhenReady = true + + _trackTitle.value = trackList[it.currentWindowIndex].title?:"NA" + Timber.d("Track title updated and soon will be played") + } + } + + fun getTimeLeftInMillis():Long{ + exoPlayer?.let { + val timeLeft = it.duration - it.currentPosition + return if(timeLeft>0) timeLeft else 0 + } + + return 0 + } + + fun getProgressInPercent():Int{ + exoPlayer?.let { + return (it.currentPosition*100/it.duration).toInt() + } + return 0 + } + + fun getCurrentPlayingTrackPosition():Int{ + var ret = 0 + exoPlayer?.let { + ret = it.currentWindowIndex + } + + Timber.d("Current track pos is $ret") + return ret + } + + fun goToPreviousOrBeginning() { + Timber.d("Previous called") + exoPlayer?.run { + if (hasPrevious()) { + this.playWhenReady = true + previous() + if(this.currentWindowIndex>=0){ + _trackTitle.value = trackList[this.currentWindowIndex].title?:"NA" + } + Timber.d("Title: ${trackTitle.value}") + } else { + seekToDefaultPosition() + Timber.d("default Title: ${trackTitle.value}") + } + } + } + + fun goToNext() { + Timber.d("Next called") + exoPlayer?.let { + if(it.hasNext()){ + it.playWhenReady = true + it.next() + if(it.currentWindowIndex< trackList.size) + { + _trackTitle.value = trackList[it.currentWindowIndex].title?:"NA" + } + Timber.d("Title: ${trackTitle.value}") + }else{ + Timber.d("Track completed playing") + } + } + } + + fun pause(){ + exoPlayer?.apply { + this.playWhenReady = false + } + } + + fun resume(){ + exoPlayer?.apply { + playWhenReady = true + + if(playbackError!=null){ + Timber.d("Retrying ") + retry() + } + } + } + + fun destroyPlayer(){ + Timber.i("Destroyed") + exoPlayer?.run { + removeListener(playerEventListener) + release() + Timber.d("Release player") + } + + exoPlayer = null + } + + fun bookDetails(bookId: String?,trackList: List?){ + + bookId?.let { + this.bookId = bookId + } + + trackList?.let { + this.trackList = trackList + } + } +} \ No newline at end of file From 50e90923ed00139d89a40b11a4805067b362f5e7 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Fri, 24 Apr 2020 22:41:42 +0530 Subject: [PATCH 16/22] MediaSource creation is segregated from Service for Player --- .../audio/utils/PrepareMediaHandler.kt | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 services/src/main/java/com/allsoftdroid/audiobook/services/audio/utils/PrepareMediaHandler.kt diff --git a/services/src/main/java/com/allsoftdroid/audiobook/services/audio/utils/PrepareMediaHandler.kt b/services/src/main/java/com/allsoftdroid/audiobook/services/audio/utils/PrepareMediaHandler.kt new file mode 100644 index 00000000..a8981ecf --- /dev/null +++ b/services/src/main/java/com/allsoftdroid/audiobook/services/audio/utils/PrepareMediaHandler.kt @@ -0,0 +1,31 @@ +package com.allsoftdroid.audiobook.services.audio.utils + +import android.app.Application +import androidx.core.net.toUri +import com.allsoftdroid.audiobook.services.R +import com.allsoftdroid.common.base.extension.AudioPlayListItem +import com.allsoftdroid.common.base.network.ArchiveUtils +import com.google.android.exoplayer2.source.ConcatenatingMediaSource +import com.google.android.exoplayer2.source.ExtractorMediaSource +import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory +import com.google.android.exoplayer2.util.Util +import timber.log.Timber + +class PrepareMediaHandler(private val context:Application) { + + fun createMediaSource(bookId:String,playlist : List): ConcatenatingMediaSource { + Timber.d("Create media source called") + val dataSourceFactory = DefaultDataSourceFactory(context, Util.getUserAgent(context, context.getString( + R.string.audio_player_service))) + val concatenatingMediaSource = ConcatenatingMediaSource() + + Timber.d("Building media list") + for (sample in playlist) { + val mediaSource = ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource( + ArchiveUtils.getRemoteFilePath(sample.filename,bookId).toUri()) + concatenatingMediaSource.addMediaSource(mediaSource) + } + + return concatenatingMediaSource + } +} \ No newline at end of file From aadade412e9256b5c387bfa15f4c6116b45c5c10 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Sat, 25 Apr 2020 00:26:16 +0530 Subject: [PATCH 17/22] todos removed --- .../audiobook/feature_downloader/data/Downloader.java | 1 - 1 file changed, 1 deletion(-) diff --git a/feature_downloader/src/main/java/com/allsoftdroid/audiobook/feature_downloader/data/Downloader.java b/feature_downloader/src/main/java/com/allsoftdroid/audiobook/feature_downloader/data/Downloader.java index c92628ba..81393c40 100644 --- a/feature_downloader/src/main/java/com/allsoftdroid/audiobook/feature_downloader/data/Downloader.java +++ b/feature_downloader/src/main/java/com/allsoftdroid/audiobook/feature_downloader/data/Downloader.java @@ -191,7 +191,6 @@ public void updateProgress(String mUrl,String mBookId,int mChapterIndex,long pro private long download(String URL, String name, String description, String subPath){ - //TODO: user defined path for download path can be in default path for DIRECTORY_DOWNLOADS String downloadFolder = ArchiveUtils.Companion.getDownloadsRootFolder(mContext.getApplication()); //store downloadId to database for own reference From 2aa200b7721fef2ca72e13442546a1787613781f Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Sat, 25 Apr 2020 00:27:00 +0530 Subject: [PATCH 18/22] legacy external storage support enabled --- app/src/main/AndroidManifest.xml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3f69dedc..53d7c21b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -13,11 +13,13 @@ + android:theme="@style/AppTheme" + tools:targetApi="q"> Date: Sat, 25 Apr 2020 00:28:39 +0530 Subject: [PATCH 19/22] LocalFilesForBook.kt added to parse local and online files together --- .../services/audio/utils/LocalFilesForBook.kt | 56 +++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 services/src/main/java/com/allsoftdroid/audiobook/services/audio/utils/LocalFilesForBook.kt diff --git a/services/src/main/java/com/allsoftdroid/audiobook/services/audio/utils/LocalFilesForBook.kt b/services/src/main/java/com/allsoftdroid/audiobook/services/audio/utils/LocalFilesForBook.kt new file mode 100644 index 00000000..f0ca06ef --- /dev/null +++ b/services/src/main/java/com/allsoftdroid/audiobook/services/audio/utils/LocalFilesForBook.kt @@ -0,0 +1,56 @@ +package com.allsoftdroid.audiobook.services.audio.utils + +import android.app.Application +import android.net.Uri +import android.os.Environment +import androidx.core.net.toUri +import com.allsoftdroid.common.base.extension.AudioPlayListItem +import com.allsoftdroid.common.base.network.ArchiveUtils +import timber.log.Timber +import java.io.File +import java.util.* + +class LocalFilesForBook(private val app:Application) { + + private fun getDownloadedFilesList(bookId:String):List?{ + val directory = Environment.getExternalStoragePublicDirectory(ArchiveUtils.getDownloadsRootFolder(context = app)) + + val path = directory.toString() + ArchiveUtils.getLocalSavePath(bookId) + Timber.d("Path: $path") + val dir = File(path) + + return dir.listFiles()?.let { + it.map { file -> + file.absolutePath + } + } + } + + fun getListHavingOnlineAndOfflineUrl(bookId: String,trackList:List):List{ + val localList = getDownloadedFilesList(bookId) + Timber.d("Local Files: ${localList.toString()}") + + val returnList = trackList.map { + ArchiveUtils.getRemoteFilePath(it.filename,bookId).toUri() + }.toMutableList() + + Timber.d("Remote Files: $returnList") + + //return original list if no file found locally + if (localList != null) { + + for(localFile in localList){ + val name = localFile.split("/").last() + for (i in trackList.indices){ + if(trackList[i].filename.toLowerCase(Locale.ROOT) == name.toLowerCase(Locale.ROOT)) { + returnList.removeAt(i) + returnList.add(i,Uri.parse(localFile)) + } + } + } + } + + Timber.d("Merged Results: $returnList") + return returnList + } +} \ No newline at end of file From 9cdfb67f2035e4fe44605c134a50d84c88fc27e3 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Sat, 25 Apr 2020 00:29:12 +0530 Subject: [PATCH 20/22] local file playing support added --- .../services/audio/utils/PrepareMediaHandler.kt | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/services/src/main/java/com/allsoftdroid/audiobook/services/audio/utils/PrepareMediaHandler.kt b/services/src/main/java/com/allsoftdroid/audiobook/services/audio/utils/PrepareMediaHandler.kt index a8981ecf..fd704d7c 100644 --- a/services/src/main/java/com/allsoftdroid/audiobook/services/audio/utils/PrepareMediaHandler.kt +++ b/services/src/main/java/com/allsoftdroid/audiobook/services/audio/utils/PrepareMediaHandler.kt @@ -1,10 +1,8 @@ package com.allsoftdroid.audiobook.services.audio.utils import android.app.Application -import androidx.core.net.toUri import com.allsoftdroid.audiobook.services.R import com.allsoftdroid.common.base.extension.AudioPlayListItem -import com.allsoftdroid.common.base.network.ArchiveUtils import com.google.android.exoplayer2.source.ConcatenatingMediaSource import com.google.android.exoplayer2.source.ExtractorMediaSource import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory @@ -13,6 +11,8 @@ import timber.log.Timber class PrepareMediaHandler(private val context:Application) { + private val localStorageFiles = LocalFilesForBook(context) + fun createMediaSource(bookId:String,playlist : List): ConcatenatingMediaSource { Timber.d("Create media source called") val dataSourceFactory = DefaultDataSourceFactory(context, Util.getUserAgent(context, context.getString( @@ -20,9 +20,10 @@ class PrepareMediaHandler(private val context:Application) { val concatenatingMediaSource = ConcatenatingMediaSource() Timber.d("Building media list") - for (sample in playlist) { - val mediaSource = ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource( - ArchiveUtils.getRemoteFilePath(sample.filename,bookId).toUri()) + val files = localStorageFiles.getListHavingOnlineAndOfflineUrl(bookId,playlist) + + for (file in files) { + val mediaSource = ExtractorMediaSource.Factory(dataSourceFactory).createMediaSource(file) concatenatingMediaSource.addMediaSource(mediaSource) } From 3ddd4c6f70da6175decdebd1db55c314a6dc0471 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Sat, 25 Apr 2020 18:56:48 +0530 Subject: [PATCH 21/22] modified to emit event --- .../common/base/network/ConnectionLiveData.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/com/allsoftdroid/common/base/network/ConnectionLiveData.kt b/common/src/main/java/com/allsoftdroid/common/base/network/ConnectionLiveData.kt index 30690ae5..2189ac13 100644 --- a/common/src/main/java/com/allsoftdroid/common/base/network/ConnectionLiveData.kt +++ b/common/src/main/java/com/allsoftdroid/common/base/network/ConnectionLiveData.kt @@ -15,8 +15,9 @@ import android.net.NetworkRequest import android.os.Build import androidx.annotation.RequiresApi import androidx.lifecycle.LiveData +import com.allsoftdroid.common.base.extension.Event -class ConnectionLiveData(private val context: Context) : LiveData(){ +class ConnectionLiveData(private val context: Context) : LiveData>(){ private var intentFilter = IntentFilter(CONNECTIVITY_ACTION) private var connectivityManager = context.getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager @@ -64,17 +65,17 @@ class ConnectionLiveData(private val context: Context) : LiveData(){ fun updateConnection() { val activeNetwork: NetworkInfo? = connectivityManager.activeNetworkInfo - postValue(activeNetwork?.isConnectedOrConnecting == true) + postValue(Event(activeNetwork?.isConnectedOrConnecting == true)) } @RequiresApi(Build.VERSION_CODES.LOLLIPOP) class NetworkCallback(private val liveData : ConnectionLiveData) : ConnectivityManager.NetworkCallback() { override fun onAvailable(network: Network?) { - liveData.postValue(true) + liveData.postValue(Event(true)) } override fun onLost(network: Network?) { - liveData.postValue(false) + liveData.postValue(Event(false)) } } } \ No newline at end of file From e3f083b42951f35f1e4ac2ee012e078f3dfd3159 Mon Sep 17 00:00:00 2001 From: Pravinyo Date: Sat, 25 Apr 2020 18:57:48 +0530 Subject: [PATCH 22/22] implementation changed as per new modification of connectionLD --- .../audiobook/presentation/MainActivity.kt | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/allsoftdroid/audiobook/presentation/MainActivity.kt b/app/src/main/java/com/allsoftdroid/audiobook/presentation/MainActivity.kt index 68811583..7cfecb2d 100644 --- a/app/src/main/java/com/allsoftdroid/audiobook/presentation/MainActivity.kt +++ b/app/src/main/java/com/allsoftdroid/audiobook/presentation/MainActivity.kt @@ -96,8 +96,8 @@ class MainActivity : BaseActivity() { "bookName" to lastPlayedTrack.bookName, "trackNumber" to lastPlayedTrack.position) - connectionListener.value?.let { connected-> - if(connected){ + connectionListener.value?.let { connectedEvent-> + if(connectedEvent.peekContent()){ Navigation.findNavController(this,R.id.navHostFragment) .navigate(com.allsoftdroid.feature_book.R.id.action_AudioBookListFragment_to_AudioBookDetailsFragment,bundle) mainActivityViewModel.clearSharedPref() @@ -121,7 +121,7 @@ class MainActivity : BaseActivity() { mainActivityViewModel.bindAudioService() connectionListener.observe(this, Observer {isConnected -> - showNetworkMessage(isConnected) + showNetworkMessage(isConnected.peekContent()) }) Timber.d("Main Activity start") @@ -134,11 +134,15 @@ class MainActivity : BaseActivity() { mainActivityViewModel.playerEvent.observeForever { it.getContentIfNotHandled()?.let {audioPlayerEvent -> - connectionListener.value?.let { isConnected -> - Timber.d("Event is new and is being handled") - if(!isConnected) Toast.makeText(this,"Please Connect to Internet",Toast.LENGTH_SHORT).show() - performAction(audioPlayerEvent) - } + +// connectionListener.value?.let { isConnectedEvent -> +// isConnectedEvent.getContentIfNotHandled()?.let {isConnected -> +// if(!isConnected) Toast.makeText(this,"Please Connect to Internet",Toast.LENGTH_SHORT).show() +// } +// } + + Timber.d("Event is new and is being handled") + performAction(audioPlayerEvent) } }