Skip to content

Commit

Permalink
Merge pull request #116 from pravinyo/development
Browse files Browse the repository at this point in the history
Feature added for offline book playing and feature improvement
  • Loading branch information
pravinyo authored May 28, 2020
2 parents e1decbd + 7cfdb4a commit 5e5aeff
Show file tree
Hide file tree
Showing 97 changed files with 1,906 additions and 348 deletions.
1 change: 1 addition & 0 deletions .idea/gradle.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 8 additions & 1 deletion app/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ apply plugin: GradlePluginId.KOTLIN_ANDROID
apply plugin: GradlePluginId.KOTLIN_KAPT
apply plugin: GradlePluginId.KOTLIN_ANDROID_EXTENSIONS
apply plugin: GradlePluginId.OSS_LICENSES

apply plugin: GradlePluginId.GOOGLE_SERVICES
apply plugin: GradlePluginId.FIREBASE_CRASHLYTICS
apply from: 'https://raw.githubusercontent.com/JakeWharton/SdkSearch/master/gradle/projectDependencyGraph.gradle'

android {
Expand Down Expand Up @@ -74,13 +75,19 @@ dependencies {
implementation(project(path: ModuleDependency.FEATURE_PLAYER_FULL_SCREEN))
implementation(project(path: ModuleDependency.FEATURE_SETTINGS))
implementation(project(path: ModuleDependency.FEATURE_LISTEN_LATER_UI))
implementation(project(path: ModuleDependency.FEATURE_MY_BOOKS_UI))
implementation(project(path: ModuleDependency.SERVICES))

implementation(LibraryDependency.KOIN_X_VIEWMODEL)
debugImplementation(LibraryDependency.LEAKY_CANARY)
implementation(LibraryDependency.SUPPORT_V13)
implementation(LibraryDependency.OSS_LICENSES)

//crash analytics report
implementation(LibraryDependency.FIREBASE_ANALYTICS)
implementation(LibraryDependency.FIREBASE_ANALYTICS_KTX)
implementation(LibraryDependency.FIREBASE_CRASHLYTICS)

//test
testImplementation(TestLibraryDependency.JUNIT)
testImplementation(TestLibraryDependency.COROUTINES_TEST)
Expand Down
40 changes: 40 additions & 0 deletions app/google-services.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
{
"project_info": {
"project_number": "263305683750",
"firebase_url": "https://audiobook-a39db.firebaseio.com",
"project_id": "audiobook-a39db",
"storage_bucket": "audiobook-a39db.appspot.com"
},
"client": [
{
"client_info": {
"mobilesdk_app_id": "1:263305683750:android:6118053ea4f7e6be0017e7",
"android_client_info": {
"package_name": "com.allsoftdroid.audiobook"
}
},
"oauth_client": [
{
"client_id": "263305683750-mmc79b4dpohl2t7sajpr4nllostmogut.apps.googleusercontent.com",
"client_type": 3
}
],
"api_key": [
{
"current_key": "AIzaSyAMxyRsA7D-lu6lmm0b95xLF_XaYGa4I_c"
}
],
"services": {
"appinvite_service": {
"other_platform_oauth_client": [
{
"client_id": "263305683750-mmc79b4dpohl2t7sajpr4nllostmogut.apps.googleusercontent.com",
"client_type": 3
}
]
}
}
}
],
"configuration_version": "1"
}
8 changes: 8 additions & 0 deletions app/src/main/java/com/allsoftdroid/audiobook/di/AppModule.kt
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package com.allsoftdroid.audiobook.di

import android.app.Activity
import androidx.lifecycle.SavedStateHandle
import com.allsoftdroid.audiobook.domain.usecase.GetLastPlayedUsecase
import com.allsoftdroid.audiobook.feature_downloader.data.Downloader
import com.allsoftdroid.audiobook.feature_downloader.domain.IDownloaderCore
import com.allsoftdroid.audiobook.presentation.viewModel.MainActivityViewModel
import com.allsoftdroid.audiobook.services.audio.AudioManager
import com.allsoftdroid.common.base.usecase.UseCaseHandler
import com.allsoftdroid.common.base.utils.LocalFilesForBook
import com.allsoftdroid.feature.book_details.data.repository.BookDetailsSharedPreferencesRepositoryImpl
import com.allsoftdroid.feature.book_details.domain.repository.BookDetailsSharedPreferenceRepository
import org.koin.androidx.viewmodel.dsl.viewModel
Expand Down Expand Up @@ -40,7 +42,9 @@ object AppModule {

private val viewModelModule: Module = module{
viewModel {
(state: SavedStateHandle) ->
MainActivityViewModel(
stateHandle = state,
application = get(),
sharedPref = get(),
audioManager = get(),
Expand Down Expand Up @@ -81,5 +85,9 @@ object AppModule {
single<BookDetailsSharedPreferenceRepository> {
BookDetailsSharedPreferencesRepositoryImpl.create(context = get())
}

single {
LocalFilesForBook(app = get())
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import com.allsoftdroid.audiobook.feature_downloader.presentation.DownloadManage
import com.allsoftdroid.audiobook.feature_mini_player.presentation.MiniPlayerFragment
import com.allsoftdroid.audiobook.presentation.viewModel.MainActivityViewModel
import com.allsoftdroid.audiobook.utility.MovableFrameLayout
import com.allsoftdroid.audiobook.utility.StoragePermissionHandler
import com.allsoftdroid.common.base.utils.StoragePermissionHandler
import com.allsoftdroid.common.base.activity.BaseActivity
import com.allsoftdroid.common.base.extension.Event
import com.allsoftdroid.common.base.network.ConnectionLiveData
Expand Down Expand Up @@ -47,7 +47,9 @@ class MainActivity : BaseActivity() {
const val MINI_PLAYER_TAG = "MiniPlayer"
}

private val mainActivityViewModel : MainActivityViewModel by viewModel()
private val mainActivityViewModel : MainActivityViewModel by viewModel{
parametersOf(Bundle(), "vm_main")
}
private val connectionListener: ConnectionLiveData by inject{parametersOf(this)}
private val downloadEventStore:DownloadEventStore by inject()
private val downloader: IDownloaderCore by inject{parametersOf(this)}
Expand Down Expand Up @@ -132,7 +134,7 @@ class MainActivity : BaseActivity() {

Timber.d("Main Activity start")
mainActivityViewModel.showPlayer.observe(this, Observer {
it.peekContent().let { shouldShow ->
it.let { shouldShow ->
Timber.d("Player state event received from view model:shouldShow->$shouldShow")
miniPlayerViewState(shouldShow)
}
Expand Down Expand Up @@ -259,7 +261,6 @@ class MainActivity : BaseActivity() {
layoutParams = layout
}
}

}

private fun performAction(event: AudioPlayerEvent){
Expand Down Expand Up @@ -321,7 +322,6 @@ class MainActivity : BaseActivity() {
stopAudioService()
disposables.dispose()
downloader.Destroy()
AppModule.unloadModule()
}

private fun stopAudioService(){
Expand All @@ -336,29 +336,32 @@ class MainActivity : BaseActivity() {
val controller = findNavController(R.id.navHostFragment)
val playingTrackDetails = mainActivityViewModel.getPlayingTrack()

val bundle = bundleOf(
"bookId" to playingTrackDetails.bookIdentifier,
"bookTitle" to playingTrackDetails.bookTitle,
"trackName" to playingTrackDetails.trackName,
"chapterIndex" to playingTrackDetails.chapterIndex,
"totalChapter" to playingTrackDetails.totalChapter,
"isPlaying" to playingTrackDetails.isPlaying)

controller.currentDestination?.let {
when(it.id){
R.id.AudioBookDetailsFragment ->{
controller.navigate(R.id.action_AudioBookDetailsFragment_to_MainPlayerFragment,bundle)
}
playingTrackDetails?.let {trackDetails ->
val bundle = bundleOf(
"bookId" to trackDetails.bookIdentifier,
"bookTitle" to trackDetails.bookTitle,
"trackName" to trackDetails.trackName,
"chapterIndex" to trackDetails.chapterIndex,
"totalChapter" to trackDetails.totalChapter,
"isPlaying" to trackDetails.isPlaying)

controller.currentDestination?.let {
when(it.id){
R.id.AudioBookDetailsFragment ->{
controller.navigate(R.id.action_AudioBookDetailsFragment_to_MainPlayerFragment,bundle)
}

R.id.AudioBookListFragment ->{
controller.navigate(R.id.action_AudioBookListFragment_to_MainPlayerFragment,bundle)
}
R.id.AudioBookListFragment ->{
controller.navigate(R.id.action_AudioBookListFragment_to_MainPlayerFragment,bundle)
}

else -> {
Timber.d("Operation not allowed")
Toast.makeText(this,"Can't navigate to Player",Toast.LENGTH_SHORT).show()
else -> {
Timber.d("Operation not allowed")
Toast.makeText(this,"Can't navigate to Player",Toast.LENGTH_SHORT).show()
}
}
}
}

}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
package com.allsoftdroid.audiobook.presentation.viewModel

import android.app.Application
import androidx.lifecycle.AndroidViewModel
import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope
import androidx.lifecycle.*
import com.allsoftdroid.audiobook.domain.model.LastPlayedTrack
import com.allsoftdroid.audiobook.domain.usecase.GetLastPlayedUsecase
import com.allsoftdroid.audiobook.feature.feature_playerfullscreen.data.PlayingTrackDetails
Expand All @@ -22,14 +19,19 @@ import kotlinx.coroutines.launch
import timber.log.Timber

class MainActivityViewModel(application : Application,
private val stateHandle : SavedStateHandle,
private val handler: UseCaseHandler,
private val lastPlayedUsecase: GetLastPlayedUsecase,
private val sharedPref: BookDetailsSharedPreferenceRepository,
private val eventStore : AudioPlayerEventStore,
private val audioManager : AudioManager) : AndroidViewModel(application){

companion object{
private const val MINI_PLAYER_KEY = "MiniPlayerKey"
}

private val _showMiniPlayer = MutableLiveData<Event<Boolean>>()
val showPlayer :LiveData<Event<Boolean>> = _showMiniPlayer
val showPlayer :LiveData<Boolean> = stateHandle.getLiveData(MINI_PLAYER_KEY)

private var disposable : Disposable

Expand All @@ -41,10 +43,11 @@ class MainActivityViewModel(application : Application,

private lateinit var _playingTrackDetails:PlayingTrackDetails

fun getPlayingTrack() = _playingTrackDetails
fun getPlayingTrack():PlayingTrackDetails? = _playingTrackDetails

fun playerStatus( showPlayer : Boolean){
_showMiniPlayer.value = Event(showPlayer)
stateHandle.set(MINI_PLAYER_KEY,showPlayer)
}

init {
Expand Down
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ buildscript {
classpath GradleDependency.KOTLIN
classpath GradleDependency.SAFE_ARGS
classpath GradleDependency.OSS_LICENSES
classpath GradleDependency.GOOGLE_SERVICES
classpath GradleDependency.FIREBASE_CRASHLYTICS
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
object GradlePluginVersion {
const val FIREBASE_CRASHLYTICS ="2.1.1"
const val GOOGLE_SERVICES = "4.3.3"
const val ANDROID_GRADLE = "3.5.0"
const val KTLINT_GRADLE = "8.2.0"
const val DETEKT = "1.0.1"
Expand All @@ -17,6 +19,8 @@ object GradlePluginId {
const val GRADLE_VERSION_PLUGIN = "com.github.ben-manes.versions"
const val SAFE_ARGS = "androidx.navigation.safeargs"
const val OSS_LICENSES = "com.google.android.gms.oss-licenses-plugin"
const val GOOGLE_SERVICES ="com.google.gms.google-services"
const val FIREBASE_CRASHLYTICS = "com.google.firebase.crashlytics"
}

object GradleDependency {
Expand All @@ -25,4 +29,6 @@ object GradleDependency {
const val KTLINT_GRADLE = "org.jlleitschuh.gradle:ktlint-gradle:${GradlePluginVersion.KTLINT_GRADLE}"
const val SAFE_ARGS = "androidx.navigation:navigation-safe-args-gradle-plugin:${CoreVersion.NAVIGATION}"
const val OSS_LICENSES = "com.google.android.gms:oss-licenses-plugin:${CoreVersion.OSS_LICENSES}"
const val GOOGLE_SERVICES = "com.google.gms:google-services:${GradlePluginVersion.GOOGLE_SERVICES}"
const val FIREBASE_CRASHLYTICS = "com.google.firebase:firebase-crashlytics-gradle:${GradlePluginVersion.FIREBASE_CRASHLYTICS}"
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ package com.allsoftdroid.buildsrc
import CoreVersion

private object LibraryVersion {
const val TOOL_TIP = "2.0.3"
const val FIREBASE_CRASHLYTICS = "17.0.0"
const val FIREBASE_VERSION = "17.4.2"
const val OSS_LICENSES = "17.0.0"
const val PALETTE = "1.0.0"
const val PREFERENCE = "1.1.1"
Expand Down Expand Up @@ -112,16 +115,17 @@ object LibraryDependency {
const val RX_RELAY = "com.jakewharton.rxrelay2:rxrelay:${LibraryVersion.RX_RELAY}"

const val EXOPLAYER = "com.google.android.exoplayer:exoplayer:${LibraryVersion.EXOPLAYER}"

const val LEAKY_CANARY = "com.squareup.leakcanary:leakcanary-android:${LibraryVersion.LEAKY_CANARY}"

const val MULTISTAGE_TOGGLE_BUTTON = "org.honorato.multistatetogglebutton:multistatetogglebutton:${LibraryVersion.MULTISTAGE_TOGGLE_BTN}"

const val SUPPORT_V13 = "com.android.support:support-v13:${LibraryVersion.SUPPORT_V13}"

const val JSOUP = "org.jsoup:jsoup:${LibraryVersion.JSOUP}"

const val DROPBOX_STORE = "com.dropbox.mobile.store:store4:${LibraryVersion.DROPBOX_STORE}"

const val OSS_LICENSES = "com.google.android.gms:play-services-oss-licenses:${LibraryVersion.OSS_LICENSES}"

const val FIREBASE_ANALYTICS = "com.google.firebase:firebase-analytics:${LibraryVersion.FIREBASE_VERSION}"
const val FIREBASE_ANALYTICS_KTX = "com.google.firebase:firebase-analytics-ktx:${LibraryVersion.FIREBASE_VERSION}"
const val FIREBASE_CRASHLYTICS = "com.google.firebase:firebase-crashlytics:${LibraryVersion.FIREBASE_CRASHLYTICS}"

const val TOOL_TIP = "it.sephiroth.android.library.targettooltip:target-tooltip-library:${LibraryVersion.TOOL_TIP}"
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ object ModuleDependency {
const val FEATURE_PLAYER_FULL_SCREEN = ":feature_playerfullscreen"
const val FEATURE_SETTINGS = ":feature_settings"
const val FEATURE_LISTEN_LATER_UI = ":feature_listen_later_ui"
const val FEATURE_MY_BOOKS_UI = ":feature_mybooks"

const val LIBRARY_COMMON = ":common"

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class ArchiveUtils {

private const val BASE_DOWNLOAD_URL = "https://archive.org/download"
private const val BASE_IMAGE_URL = "https://archive.org/services/img"
const val AppFolderName = "AudioBooks"

/**
* This function generated the file path on the remote server
Expand All @@ -22,7 +23,7 @@ class ArchiveUtils {

fun getThumbnail(imageId: String?) = "$BASE_IMAGE_URL/$imageId/"

fun getLocalSavePath(bookId:String) = "/AudioBooks/$bookId/"
fun getLocalSavePath(bookId:String) = "/$AppFolderName/$bookId/"

fun setDownloadsRootFolder(context: Application, root:String){
val sharedPref = context.getSharedPreferences(context.getString(R.string.downloads_path),Context.MODE_PRIVATE) ?: return
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,4 +59,10 @@ data class PullAndUpdateStatus(
override val chapterIndex: Int=-1,
val downloadId:Long) : DownloadEvent()

data class DownloadNothing(override val bookId: String="",override val chapterIndex: Int=-1) : DownloadEvent()
data class DownloadNothing(override val bookId: String="",override val chapterIndex: Int=-1) : DownloadEvent()

data class MultiDownload(
override val bookId:String="",
override val chapterIndex: Int =-1,
val downloads:List<Download>
) : DownloadEvent()
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.allsoftdroid.audiobook.services.audio.utils
package com.allsoftdroid.common.base.utils

import android.app.Application
import android.net.Uri
Expand All @@ -13,7 +13,6 @@ import java.util.*

class LocalFilesForBook(private val app:Application) {

@VisibleForTesting
fun getDownloadedFilesList(bookId:String):List<String>?{
val directory = Environment.getExternalStoragePublicDirectory(ArchiveUtils.getDownloadsRootFolder(context = app))

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.allsoftdroid.audiobook.utility
package com.allsoftdroid.common.base.utils

import android.Manifest
import android.app.Activity
Expand All @@ -22,7 +22,8 @@ class StoragePermissionHandler {
fun requestPermission(context: Activity){
ActivityCompat.requestPermissions(context,
arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE),
MY_PERMISSIONS_REQUEST_READ_WRITE_STORAGE)
MY_PERMISSIONS_REQUEST_READ_WRITE_STORAGE
)
}

fun isRequestGrantedFor(requestCode:Int,grantResults: IntArray):Boolean{
Expand Down
Loading

0 comments on commit 5e5aeff

Please sign in to comment.