diff --git a/common/src/main/java/de/nicidienase/chaosflix/common/OfflineItemManager.kt b/common/src/main/java/de/nicidienase/chaosflix/common/OfflineItemManager.kt index c9607ad7..0a4b13ed 100644 --- a/common/src/main/java/de/nicidienase/chaosflix/common/OfflineItemManager.kt +++ b/common/src/main/java/de/nicidienase/chaosflix/common/OfflineItemManager.kt @@ -147,6 +147,12 @@ class OfflineItemManager(context: Context, } } + fun deleteOfflineItem(guid: String){ + offlineEventDao.getByEventGuidSync(guid)?.let { + deleteOfflineItem(it) + } + } + fun deleteOfflineItem(item: OfflineEvent) { downloadManager.remove(item.downloadReference) val file = File(item.localPath) diff --git a/common/src/main/java/de/nicidienase/chaosflix/common/ResourcesFacade.kt b/common/src/main/java/de/nicidienase/chaosflix/common/ResourcesFacade.kt new file mode 100644 index 00000000..fcbdfdee --- /dev/null +++ b/common/src/main/java/de/nicidienase/chaosflix/common/ResourcesFacade.kt @@ -0,0 +1,11 @@ +package de.nicidienase.chaosflix.common + +import android.content.Context +import android.content.res.Resources +import android.support.annotation.StringRes + +class ResourcesFacade(context: Context) { + private val resources: Resources = context.applicationContext.resources + + fun getString(@StringRes id: Int, vararg any: Any): String = resources.getString(id,any) +} \ No newline at end of file diff --git a/common/src/main/java/de/nicidienase/chaosflix/common/viewmodel/BrowseViewModel.kt b/common/src/main/java/de/nicidienase/chaosflix/common/viewmodel/BrowseViewModel.kt index e60cea70..d2cb34a1 100644 --- a/common/src/main/java/de/nicidienase/chaosflix/common/viewmodel/BrowseViewModel.kt +++ b/common/src/main/java/de/nicidienase/chaosflix/common/viewmodel/BrowseViewModel.kt @@ -3,9 +3,11 @@ package de.nicidienase.chaosflix.common.viewmodel import android.arch.lifecycle.LiveData import android.arch.lifecycle.MutableLiveData import android.arch.lifecycle.ViewModel +import de.nicidienase.chaosflix.R import de.nicidienase.chaosflix.common.ChaosflixDatabase import de.nicidienase.chaosflix.common.OfflineItemManager import de.nicidienase.chaosflix.common.PreferencesManager +import de.nicidienase.chaosflix.common.ResourcesFacade import de.nicidienase.chaosflix.common.mediadata.entities.recording.persistence.ConferenceGroup import de.nicidienase.chaosflix.common.mediadata.entities.recording.persistence.Conference import de.nicidienase.chaosflix.common.mediadata.entities.recording.persistence.Event @@ -16,6 +18,7 @@ import de.nicidienase.chaosflix.common.mediadata.sync.Downloader import de.nicidienase.chaosflix.common.userdata.entities.download.OfflineEvent import de.nicidienase.chaosflix.common.util.LiveDataMerger import de.nicidienase.chaosflix.common.util.LiveEvent +import de.nicidienase.chaosflix.common.util.SingleLiveEvent import de.nicidienase.chaosflix.common.util.ThreadHandler import retrofit2.Response import java.io.IOException @@ -25,9 +28,16 @@ class BrowseViewModel( val database: ChaosflixDatabase, recordingApi: RecordingService, val streamingApi: StreamingService, - val preferencesManager: PreferencesManager + val preferencesManager: PreferencesManager, + private val resources: ResourcesFacade ) : ViewModel() { + val state: SingleLiveEvent> = SingleLiveEvent() + + enum class State { + ShowEventDetails + } + val downloader = Downloader(recordingApi, database) private val handler = ThreadHandler() @@ -151,6 +161,22 @@ class BrowseViewModel( } } + fun showDetailsForEvent(guid: String) { + handler.runOnBackgroundThread { + val event = database.eventDao().findEventByGuidSync(guid) + if(event != null){ + state.postValue(LiveEvent(State.ShowEventDetails,event)) + } else { + state.postValue(LiveEvent(State.ShowEventDetails,error = resources.getString(R.string.error_event_not_found))) + } + } + } + + fun deleteOfflineItem(guid: String) { + handler.runOnBackgroundThread { + offlineItemManager.deleteOfflineItem(guid) + } + } fun getAutoselectStream() = preferencesManager.getAutoselectStream() } diff --git a/common/src/main/java/de/nicidienase/chaosflix/common/viewmodel/ViewModelFactory.kt b/common/src/main/java/de/nicidienase/chaosflix/common/viewmodel/ViewModelFactory.kt index c26cc956..9e4924ca 100644 --- a/common/src/main/java/de/nicidienase/chaosflix/common/viewmodel/ViewModelFactory.kt +++ b/common/src/main/java/de/nicidienase/chaosflix/common/viewmodel/ViewModelFactory.kt @@ -8,27 +8,29 @@ import android.preference.PreferenceManager import de.nicidienase.chaosflix.common.DatabaseFactory import de.nicidienase.chaosflix.common.OfflineItemManager import de.nicidienase.chaosflix.common.PreferencesManager +import de.nicidienase.chaosflix.common.ResourcesFacade import de.nicidienase.chaosflix.common.mediadata.network.ApiFactory import de.nicidienase.chaosflix.common.mediadata.sync.Downloader class ViewModelFactory(context: Context) : ViewModelProvider.Factory { - val apiFactory = ApiFactory(context.resources) + private val apiFactory = ApiFactory(context.resources) - val database = DatabaseFactory.getInstance(context) - val recordingApi = apiFactory.recordingApi - val streamingApi = apiFactory.streamingApi - val preferencesManager = + private val database by lazy { DatabaseFactory.getInstance(context) } + private val recordingApi = apiFactory.recordingApi + private val streamingApi = apiFactory.streamingApi + private val preferencesManager = PreferencesManager(PreferenceManager.getDefaultSharedPreferences(context.applicationContext)) - val offlineItemManager = + private val offlineItemManager = OfflineItemManager(context.applicationContext, database.offlineEventDao(),preferencesManager) - val downloader by lazy { Downloader(recordingApi, database) } - val externalFilesDir = Environment.getExternalStorageDirectory() + private val downloader by lazy { Downloader(recordingApi, database) } + private val externalFilesDir = Environment.getExternalStorageDirectory() + private val resourcesFacade by lazy { ResourcesFacade(context) } @Suppress("UNCHECKED_CAST") override fun create(modelClass: Class): T { if (modelClass.isAssignableFrom(BrowseViewModel::class.java)) { - return BrowseViewModel(offlineItemManager, database, recordingApi, streamingApi, preferencesManager) as T + return BrowseViewModel(offlineItemManager, database, recordingApi, streamingApi, preferencesManager,resourcesFacade) as T } else if (modelClass.isAssignableFrom(PlayerViewModel::class.java)) { return PlayerViewModel(database) as T } else if (modelClass.isAssignableFrom(DetailsViewModel::class.java)) { @@ -38,7 +40,7 @@ class ViewModelFactory(context: Context) : ViewModelProvider.Factory { } else { throw UnsupportedOperationException("The requested ViewModel is currently unsupported. " + "Please make sure to implement are correct creation of it. " + - " Request: ${modelClass.getCanonicalName()}"); + " Request: ${modelClass.canonicalName}"); } } diff --git a/common/src/main/res/values/strings.xml b/common/src/main/res/values/strings.xml index 068cdbfb..438bff7c 100644 --- a/common/src/main/res/values/strings.xml +++ b/common/src/main/res/values/strings.xml @@ -48,4 +48,5 @@ Automatically choose recording Export Favorites Import Favorites + Event not found diff --git a/touch/src/main/java/de/nicidienase/chaosflix/touch/browse/BrowseActivity.kt b/touch/src/main/java/de/nicidienase/chaosflix/touch/browse/BrowseActivity.kt index 121fb2d2..83eec76e 100644 --- a/touch/src/main/java/de/nicidienase/chaosflix/touch/browse/BrowseActivity.kt +++ b/touch/src/main/java/de/nicidienase/chaosflix/touch/browse/BrowseActivity.kt @@ -1,5 +1,6 @@ package de.nicidienase.chaosflix.touch.browse +import android.arch.lifecycle.Observer import android.arch.lifecycle.ViewModelProviders import android.content.Context import android.content.DialogInterface @@ -86,6 +87,23 @@ class BrowseActivity : AppCompatActivity(), showConferencesFragment() } viewModel = ViewModelProviders.of(this, ViewModelFactory(this)).get(BrowseViewModel::class.java) + + viewModel.state.observe(this, Observer { event -> + if(event == null){ + return@Observer + } + val errorMessage = event.error + if(errorMessage != null){ + Snackbar.make(binding.root, errorMessage, Snackbar.LENGTH_SHORT).show() + } + when(event.state){ + BrowseViewModel.State.ShowEventDetails -> { + event.data?.let { + EventDetailsActivity.launch(this, it) + } + } + } + }) } fun setupDrawerToggle(toolbar: Toolbar?) { diff --git a/touch/src/main/java/de/nicidienase/chaosflix/touch/browse/download/DownloadsListFragment.kt b/touch/src/main/java/de/nicidienase/chaosflix/touch/browse/download/DownloadsListFragment.kt index 0f88c4b2..df8d9949 100644 --- a/touch/src/main/java/de/nicidienase/chaosflix/touch/browse/download/DownloadsListFragment.kt +++ b/touch/src/main/java/de/nicidienase/chaosflix/touch/browse/download/DownloadsListFragment.kt @@ -32,7 +32,7 @@ class DownloadsListFragment : BrowseFragment() { setupToolbar(incToolbar.toolbar, R.string.downloads) overlay = incOverlay.loadingOverlay val offlineEventAdapter = OfflineEventAdapter(viewModel.offlineItemManager, viewModel::deleteOfflineItem) { - EventDetailsActivity.launch(requireContext(), it) + viewModel.showDetailsForEvent(it) } list.adapter = offlineEventAdapter if (columnCount <= 1) { @@ -40,16 +40,10 @@ class DownloadsListFragment : BrowseFragment() { } else { list.layoutManager = GridLayoutManager(context, columnCount - 1) } -// viewModel.getOfflineEvents().observe(this@DownloadsListFragment, Observer { events -> -// if (events != null) { -// offlineEventAdapter.items = viewModel.mapOfflineEvents(events) -// } else { -// offlineEventAdapter.items = emptyList() -// } -// setLoadingOverlayVisibility(false) -// }) viewModel.getOfflineDisplayEvents().observe(this@DownloadsListFragment, Observer { - Log.d(TAG,"size: ${it?.size}") + if (it != null){ + offlineEventAdapter.items = it + } }) return root } diff --git a/touch/src/main/java/de/nicidienase/chaosflix/touch/browse/download/OfflineEventAdapter.kt b/touch/src/main/java/de/nicidienase/chaosflix/touch/browse/download/OfflineEventAdapter.kt index 5cd1cd79..c75b41a8 100644 --- a/touch/src/main/java/de/nicidienase/chaosflix/touch/browse/download/OfflineEventAdapter.kt +++ b/touch/src/main/java/de/nicidienase/chaosflix/touch/browse/download/OfflineEventAdapter.kt @@ -9,18 +9,15 @@ import com.bumptech.glide.Glide import com.bumptech.glide.request.RequestOptions import de.nicidienase.chaosflix.common.OfflineItemManager import de.nicidienase.chaosflix.touch.R -import de.nicidienase.chaosflix.common.mediadata.entities.recording.persistence.Event -import de.nicidienase.chaosflix.common.userdata.entities.download.OfflineEvent +import de.nicidienase.chaosflix.common.userdata.entities.download.OfflineEventView import de.nicidienase.chaosflix.touch.databinding.ItemOfflineEventBinding -import de.nicidienase.chaosflix.touch.OnEventSelectedListener -import de.nicidienase.chaosflix.common.viewmodel.BrowseViewModel class OfflineEventAdapter(private val offlineItemManager: OfflineItemManager, - private val eventDeleteListener: (OfflineEvent) -> Unit, - private val eventSelectedListener: (Event)->Unit) : + private val eventDeleteListener: (String) -> Unit, + private val eventSelectedListener: (String)->Unit) : RecyclerView.Adapter() { - var items: List> = emptyList() + var items: List = emptyList() set(value) { field = value notifyDataSetChanged() @@ -29,19 +26,19 @@ class OfflineEventAdapter(private val offlineItemManager: OfflineItemManager, override fun onBindViewHolder(holder: ViewHolder, position: Int) { val item = items[position] - holder.binding.event = item.second + holder.binding.item = item Glide.with(holder.thumbnail) - .load(item.second.thumbUrl) + .load(item.thumbUrl) .apply(RequestOptions().fitCenter()) .into(holder.thumbnail) with(holder.binding){ - downloadStatus = offlineItemManager.downloadStatus[item.first.downloadReference] + downloadStatus = offlineItemManager.downloadStatus[item.downloadReference] buttonDelete.setOnClickListener { - eventDeleteListener(item.first) + eventDeleteListener(item.eventGuid) } content?.setOnClickListener { _ -> - eventSelectedListener(item.second) + eventSelectedListener(item.eventGuid) } } } diff --git a/touch/src/main/java/de/nicidienase/chaosflix/touch/eventdetails/EventDetailsActivity.kt b/touch/src/main/java/de/nicidienase/chaosflix/touch/eventdetails/EventDetailsActivity.kt index 74496c2f..a30669b3 100644 --- a/touch/src/main/java/de/nicidienase/chaosflix/touch/eventdetails/EventDetailsActivity.kt +++ b/touch/src/main/java/de/nicidienase/chaosflix/touch/eventdetails/EventDetailsActivity.kt @@ -214,6 +214,7 @@ class EventDetailsActivity : AppCompatActivity(), private const val EXTRA_EVENT = "extra_event" private const val EXTRA_URI = "extra_uri" + private const val EXTRA_GUID = "extra_guid" private const val WRITE_PERMISSION_REQUEST = 23 private val TAG = EventDetailsActivity::class.java.simpleName diff --git a/touch/src/main/res/layout/item_offline_event.xml b/touch/src/main/res/layout/item_offline_event.xml index 0c0ff2a6..84e21a69 100644 --- a/touch/src/main/res/layout/item_offline_event.xml +++ b/touch/src/main/res/layout/item_offline_event.xml @@ -7,12 +7,12 @@ + name="item" + type="de.nicidienase.chaosflix.common.userdata.entities.download.OfflineEventView"/> + name="downloadStatus" + type="de.nicidienase.chaosflix.common.OfflineItemManager.DownloadStatus"/> @@ -71,7 +71,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" - android:text="@{event.subtitle}" + android:text="@{item.subtitle}" android:textAppearance="@style/Base.TextAppearance.AppCompat.Small" tools:text="Subtitle"/>