|
1 | 1 | package org.readium.r2.testapp.audiobook
|
2 | 2 |
|
3 |
| - |
4 |
| -import android.app.ProgressDialog |
5 |
| -import android.content.Intent |
6 |
| -import android.graphics.BitmapFactory |
7 | 3 | import android.os.Bundle
|
8 |
| -import android.view.Menu |
9 |
| -import android.view.MenuItem |
10 |
| -import android.widget.ImageView |
11 |
| -import kotlinx.coroutines.delay |
12 |
| -import kotlinx.coroutines.launch |
13 |
| -import org.jetbrains.anko.indeterminateProgressDialog |
14 |
| -import org.jetbrains.anko.intentFor |
15 |
| -import org.jetbrains.anko.toast |
16 |
| -import org.readium.r2.navigator.Navigator |
17 |
| -import org.readium.r2.navigator.NavigatorDelegate |
| 4 | +import androidx.fragment.app.FragmentResultListener |
| 5 | +import androidx.fragment.app.commit |
| 6 | +import androidx.fragment.app.commitNow |
| 7 | +import androidx.lifecycle.ViewModelProvider |
18 | 8 | import org.readium.r2.navigator.audiobook.R2AudiobookActivity
|
19 |
| -import org.readium.r2.shared.extensions.putPublicationFrom |
20 | 9 | import org.readium.r2.shared.publication.Locator
|
21 |
| -import org.readium.r2.shared.publication.services.isProtected |
22 | 10 | import org.readium.r2.testapp.R
|
23 |
| -import org.readium.r2.testapp.db.Bookmark |
24 |
| -import org.readium.r2.testapp.db.BookmarksDatabase |
25 |
| -import org.readium.r2.testapp.db.BooksDatabase |
26 |
| -import org.readium.r2.testapp.drm.DRMManagementActivity |
27 |
| -import org.readium.r2.testapp.library.LibraryActivity |
28 |
| -import org.readium.r2.testapp.library.activitiesLaunched |
29 |
| -import org.readium.r2.testapp.outline.R2OutlineActivity |
30 |
| -import timber.log.Timber |
31 |
| - |
32 |
| - |
33 |
| -class AudiobookActivity : R2AudiobookActivity(), NavigatorDelegate { |
| 11 | +import org.readium.r2.testapp.drm.DrmManagementContract |
| 12 | +import org.readium.r2.testapp.drm.DrmManagementFragment |
| 13 | +import org.readium.r2.testapp.outline.OutlineContract |
| 14 | +import org.readium.r2.testapp.outline.OutlineFragment |
| 15 | +import org.readium.r2.testapp.reader.AudioReaderFragment |
| 16 | +import org.readium.r2.testapp.reader.ReaderActivity |
| 17 | +import org.readium.r2.testapp.reader.ReaderViewModel |
| 18 | +import org.readium.r2.testapp.reader.ReaderContract |
34 | 19 |
|
35 |
| - override fun locationDidChange(navigator: Navigator?, locator: Locator) { |
36 |
| - Timber.d("locationDidChange $locator") |
37 |
| - booksDB.books.saveProgression(locator, bookId) |
38 |
| - } |
39 |
| - |
40 |
| - private lateinit var booksDB: BooksDatabase |
| 20 | +class AudiobookActivity : R2AudiobookActivity() { |
41 | 21 |
|
42 |
| - private lateinit var bookmarksDB: BookmarksDatabase |
43 |
| - private lateinit var progressDialog: ProgressDialog |
| 22 | + private lateinit var modelFactory: ReaderViewModel.Factory |
| 23 | + private lateinit var readerFragment: AudioReaderFragment |
44 | 24 |
|
45 | 25 | override fun onCreate(savedInstanceState: Bundle?) {
|
46 |
| - if (activitiesLaunched.incrementAndGet() > 1 || !LibraryActivity.isServerStarted) { |
47 |
| - finish() |
48 |
| - } |
| 26 | + val inputData = ReaderContract.parseIntent(this) |
| 27 | + modelFactory = ReaderViewModel.Factory(applicationContext, inputData) |
49 | 28 | super.onCreate(savedInstanceState)
|
50 | 29 |
|
51 |
| - booksDB = BooksDatabase(this) |
52 |
| - bookmarksDB = BookmarksDatabase(this) |
| 30 | + ViewModelProvider(this).get(ReaderViewModel::class.java) |
| 31 | + .channel.receive(this) {handleReaderFragmentEvent(it) } |
53 | 32 |
|
54 |
| - navigatorDelegate = this |
| 33 | + if (savedInstanceState == null) { |
| 34 | + supportFragmentManager.commitNow { |
| 35 | + add(R.id.activity_container, AudioReaderFragment::class.java, Bundle(), ReaderActivity.READER_FRAGMENT_TAG) |
| 36 | + } |
55 | 37 |
|
56 |
| - bookId = intent.getLongExtra("bookId", -1) |
| 38 | + } |
57 | 39 |
|
58 |
| - progressDialog = indeterminateProgressDialog(getString(R.string.progress_wait_while_preparing_audiobook)) |
| 40 | + readerFragment = supportFragmentManager.findFragmentByTag(ReaderActivity.READER_FRAGMENT_TAG) as AudioReaderFragment |
59 | 41 |
|
60 |
| - //Setting cover |
61 |
| - launch { |
62 |
| - delay(100) |
63 |
| - if (intent.hasExtra("cover")) { |
64 |
| - val byteArray = intent.getByteArrayExtra("cover") |
65 |
| - byteArray?.let { |
66 |
| - val bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size) |
67 |
| - findViewById<ImageView>(R.id.imageView).setImageBitmap(bmp) |
68 |
| - } |
| 42 | + supportFragmentManager.setFragmentResultListener( |
| 43 | + OutlineContract.REQUEST_KEY, |
| 44 | + this, |
| 45 | + FragmentResultListener { _, result -> |
| 46 | + val locator = OutlineContract.parseResult(result).destination |
| 47 | + closeOutlineFragment(locator) |
69 | 48 | }
|
70 |
| - menuDrm?.isVisible = publication.isProtected |
71 |
| - } |
72 |
| - mediaPlayer?.progress = progressDialog |
73 |
| - |
| 49 | + ) |
| 50 | + |
| 51 | + supportFragmentManager.setFragmentResultListener( |
| 52 | + DrmManagementContract.REQUEST_KEY, |
| 53 | + this, |
| 54 | + FragmentResultListener { _, result -> |
| 55 | + if (DrmManagementContract.parseResult(result).hasReturned) |
| 56 | + finish() |
| 57 | + } |
| 58 | + ) |
74 | 59 |
|
75 |
| - // Loads the last read location |
76 |
| - booksDB.books.currentLocator(bookId)?.let { |
77 |
| - go(it, false, {}) |
| 60 | + supportFragmentManager.addOnBackStackChangedListener { |
| 61 | + updateActivityTitle() |
78 | 62 | }
|
79 | 63 | }
|
80 | 64 |
|
81 |
| - private var menuDrm: MenuItem? = null |
82 |
| - private var menuToc: MenuItem? = null |
83 |
| - private var menuBmk: MenuItem? = null |
84 |
| - private var menuSettings: MenuItem? = null |
85 |
| - |
86 |
| - override fun onCreateOptionsMenu(menu: Menu?): Boolean { |
87 |
| - menuInflater.inflate(R.menu.menu_audio, menu) |
88 |
| - menuDrm = menu?.findItem(R.id.drm) |
89 |
| - menuToc = menu?.findItem(R.id.toc) |
90 |
| - menuBmk = menu?.findItem(R.id.bookmark) |
91 |
| - menuSettings = menu?.findItem(R.id.settings) |
92 |
| - |
93 |
| - menuSettings?.isVisible = false |
94 |
| - menuDrm?.isVisible = false |
95 |
| - return true |
| 65 | + override fun onStart() { |
| 66 | + super.onStart() |
| 67 | + updateActivityTitle() |
96 | 68 | }
|
97 | 69 |
|
98 |
| - override fun onOptionsItemSelected(item: MenuItem): Boolean { |
99 |
| - when (item.itemId) { |
100 | 70 |
|
101 |
| - R.id.toc -> { |
102 |
| - val intent = Intent(this, R2OutlineActivity::class.java).apply { |
103 |
| - putPublicationFrom(this@AudiobookActivity) |
104 |
| - putExtra("bookId", bookId) |
105 |
| - } |
106 |
| - startActivityForResult(intent, 2) |
107 |
| - return true |
108 |
| - } |
109 |
| - R.id.settings -> { |
110 |
| - // TODO do we need any settings ? |
111 |
| - return true |
112 |
| - } |
113 |
| - R.id.bookmark -> { |
114 |
| - val locator = currentLocator.value |
115 |
| - |
116 |
| - val bookmark = Bookmark(bookId, publicationIdentifier, resourceIndex = currentResource.toLong(), locator = locator) |
117 |
| - bookmarksDB.bookmarks.insert(bookmark)?.let { |
118 |
| - launch { |
119 |
| - toast("Bookmark added") |
120 |
| - } |
121 |
| - } ?: run { |
122 |
| - launch { |
123 |
| - toast("Bookmark already exists") |
124 |
| - } |
125 |
| - } |
126 |
| - |
127 |
| - return true |
128 |
| - } |
129 |
| - R.id.drm -> { |
130 |
| - startActivityForResult(intentFor<DRMManagementActivity>("publication" to publicationPath), 1) |
131 |
| - return true |
132 |
| - } |
133 |
| - |
134 |
| - else -> return false |
| 71 | + private fun updateActivityTitle() { |
| 72 | + title = when (supportFragmentManager.fragments.last()) { |
| 73 | + is OutlineFragment -> publication.metadata.title |
| 74 | + is DrmManagementFragment -> getString(R.string.title_fragment_drm_management) |
| 75 | + else -> null |
135 | 76 | }
|
| 77 | + } |
136 | 78 |
|
| 79 | + override fun getDefaultViewModelProviderFactory(): ViewModelProvider.Factory { |
| 80 | + return modelFactory |
137 | 81 | }
|
138 | 82 |
|
139 |
| - override fun onDestroy() { |
140 |
| - super.onDestroy() |
141 |
| - activitiesLaunched.getAndDecrement() |
| 83 | + private fun handleReaderFragmentEvent(event: ReaderViewModel.Event) { |
| 84 | + when(event) { |
| 85 | + is ReaderViewModel.Event.OpenOutlineRequested -> showOutlineFragment() |
| 86 | + is ReaderViewModel.Event.OpenDrmManagementRequested -> showDrmManagementFragment() |
| 87 | + } |
142 | 88 | }
|
143 | 89 |
|
144 |
| - override fun onStop() { |
145 |
| - super.onStop() |
146 |
| - progressDialog.dismiss() |
| 90 | + private fun showOutlineFragment() { |
| 91 | + supportFragmentManager.commit { |
| 92 | + add(R.id.activity_container, OutlineFragment::class.java, Bundle(), ReaderActivity.OUTLINE_FRAGMENT_TAG) |
| 93 | + hide(readerFragment) |
| 94 | + addToBackStack(null) |
| 95 | + } |
| 96 | + } |
| 97 | + |
| 98 | + private fun closeOutlineFragment(locator: Locator) { |
| 99 | + go(locator) |
| 100 | + supportFragmentManager.popBackStack() |
147 | 101 | }
|
148 | 102 |
|
| 103 | + private fun showDrmManagementFragment() { |
| 104 | + supportFragmentManager.commit { |
| 105 | + add(R.id.activity_container, DrmManagementFragment::class.java, Bundle(), ReaderActivity.DRM_FRAGMENT_TAG) |
| 106 | + hide(readerFragment) |
| 107 | + addToBackStack(null) |
| 108 | + } |
| 109 | + } |
149 | 110 | }
|
150 | 111 |
|
151 | 112 |
|
|
0 commit comments