#770 Show extended detail for a book in a bottom sheet - add buttons - improve constraint Flow

This commit is contained in:
Sean Mac Gillicuddy 2020-05-01 11:59:30 +01:00
parent bac4fa4e4d
commit 21554b99ca
15 changed files with 376 additions and 132 deletions

View File

@ -51,14 +51,16 @@ import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BooksOnDis
import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BooksOnDiskListItem.BookOnDisk
import org.kiwix.kiwixmobile.zim_manager.Fat32Checker.FileSystemState
import org.kiwix.kiwixmobile.zim_manager.NetworkState.CONNECTED
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions.MultiModeFinished
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions.RequestDeleteMultiSelection
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions.RequestMultiSelection
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions.RequestOpen
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions.RequestSelect
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions.RequestShareMultiSelection
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions.RequestShowInfo
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions.RestartActionMode
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.MultiModeFinished
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.RequestDelete
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.RequestDeleteMultiSelection
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.RequestMultiSelection
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.RequestOpen
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.RequestSelect
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.RequestShare
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.RequestShareMultiSelection
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.RequestShowInfo
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.RestartActionMode
import org.kiwix.kiwixmobile.zim_manager.fileselect_view.FileSelectListState
import org.kiwix.kiwixmobile.zim_manager.fileselect_view.effects.DeleteFiles
import org.kiwix.kiwixmobile.zim_manager.fileselect_view.effects.None
@ -89,15 +91,17 @@ class ZimManageViewModel @Inject constructor(
private val defaultLanguageProvider: DefaultLanguageProvider,
private val dataSource: DataSource
) : ViewModel() {
sealed class FileSelectActions {
data class RequestOpen(val bookOnDisk: BookOnDisk) : FileSelectActions()
data class RequestShowInfo(val bookOnDisk: BookOnDisk) : FileSelectActions()
data class RequestSelect(val bookOnDisk: BookOnDisk) : FileSelectActions()
data class RequestMultiSelection(val bookOnDisk: BookOnDisk) : FileSelectActions()
object RequestDeleteMultiSelection : FileSelectActions()
object RequestShareMultiSelection : FileSelectActions()
object MultiModeFinished : FileSelectActions()
object RestartActionMode : FileSelectActions()
sealed class DeviceTabActions {
data class RequestOpen(val bookOnDisk: BookOnDisk) : DeviceTabActions()
data class RequestShare(val bookOnDisk: BookOnDisk) : DeviceTabActions()
data class RequestDelete(val bookOnDisk: BookOnDisk) : DeviceTabActions()
data class RequestShowInfo(val bookOnDisk: BookOnDisk) : DeviceTabActions()
data class RequestSelect(val bookOnDisk: BookOnDisk) : DeviceTabActions()
data class RequestMultiSelection(val bookOnDisk: BookOnDisk) : DeviceTabActions()
object RequestDeleteMultiSelection : DeviceTabActions()
object RequestShareMultiSelection : DeviceTabActions()
object MultiModeFinished : DeviceTabActions()
object RestartActionMode : DeviceTabActions()
}
val sideEffects = PublishProcessor.create<SideEffect<Any?>>()
@ -109,7 +113,7 @@ class ZimManageViewModel @Inject constructor(
val networkStates = MutableLiveData<NetworkState>()
val requestFileSystemCheck = PublishProcessor.create<Unit>()
val fileSelectActions = PublishProcessor.create<FileSelectActions>()
val deviceTabActions = PublishProcessor.create<DeviceTabActions>()
val requestDownloadLibrary = BehaviorProcessor.createDefault(Unit)
val requestFiltering = BehaviorProcessor.createDefault("")
val currentPage = PublishProcessor.create<Int>()
@ -150,7 +154,7 @@ class ZimManageViewModel @Inject constructor(
)
}
private fun fileSelectActions() = fileSelectActions.subscribe({
private fun fileSelectActions() = deviceTabActions.subscribe({
sideEffects.offer(
when (it) {
is RequestOpen -> OpenFile(it.bookOnDisk)
@ -159,11 +163,19 @@ class ZimManageViewModel @Inject constructor(
RequestShareMultiSelection -> ShareFiles(selectionsFromState())
MultiModeFinished -> noSideEffectAndClearSelectionState()
is RequestSelect -> noSideEffectSelectBook(it.bookOnDisk)
RestartActionMode -> StartMultiSelection(fileSelectActions)
RestartActionMode -> StartMultiSelection(deviceTabActions)
is RequestShowInfo -> {
selectedInfoItem.postValue(it.bookOnDisk)
ShowInfo()
}
is RequestShare -> {
selectedInfoItem.postValue(null)
ShareFiles(listOf(it.bookOnDisk))
}
is RequestDelete -> {
selectedInfoItem.postValue(null)
DeleteFiles(listOf(it.bookOnDisk))
}
}
)
}, Throwable::printStackTrace)
@ -179,7 +191,7 @@ class ZimManageViewModel @Inject constructor(
)
)
}
return StartMultiSelection(fileSelectActions)
return StartMultiSelection(deviceTabActions)
}
private fun selectBook(

View File

@ -24,6 +24,7 @@ import android.view.View
import android.view.ViewGroup
import androidx.lifecycle.Observer
import androidx.lifecycle.ViewModelProvider
import com.google.android.material.bottomsheet.BottomSheetDialog
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import kotlinx.android.synthetic.main.sheet_book_info.detail_article_count
import kotlinx.android.synthetic.main.sheet_book_info.detail_creator
@ -36,8 +37,11 @@ import kotlinx.android.synthetic.main.sheet_book_info.detail_publisher
import kotlinx.android.synthetic.main.sheet_book_info.detail_size
import kotlinx.android.synthetic.main.sheet_book_info.detail_tags
import kotlinx.android.synthetic.main.sheet_book_info.detail_url
import kotlinx.android.synthetic.main.sheet_book_info.info_sheet_delete
import kotlinx.android.synthetic.main.sheet_book_info.info_sheet_description
import kotlinx.android.synthetic.main.sheet_book_info.info_sheet_favicon
import kotlinx.android.synthetic.main.sheet_book_info.info_sheet_open
import kotlinx.android.synthetic.main.sheet_book_info.info_sheet_share
import kotlinx.android.synthetic.main.sheet_book_info.info_sheet_title
import org.kiwix.kiwixmobile.R
import org.kiwix.kiwixmobile.core.downloader.model.Base64String
@ -47,6 +51,9 @@ import org.kiwix.kiwixmobile.core.extensions.setBitmap
import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BooksOnDiskListItem.BookOnDisk
import org.kiwix.kiwixmobile.zim_manager.ZimManageActivity
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.RequestDelete
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.RequestOpen
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.RequestShare
import javax.inject.Inject
class BookInfoBottomSheetDialog : BottomSheetDialogFragment() {
@ -60,7 +67,9 @@ class BookInfoBottomSheetDialog : BottomSheetDialogFragment() {
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View = inflater.inflate(R.layout.sheet_book_info, container, false)
): View = inflater.inflate(R.layout.sheet_book_info, container, false).also {
(dialog as BottomSheetDialog).dismissWithAnimation = true
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
@ -72,7 +81,16 @@ class BookInfoBottomSheetDialog : BottomSheetDialogFragment() {
bookOnDisk?.let {
render(it.book)
detail_file.setDetail(it.file.absolutePath)
}
info_sheet_open.setOnClickListener {
zimManageViewModel.deviceTabActions.offer(RequestOpen(bookOnDisk))
}
info_sheet_share.setOnClickListener {
zimManageViewModel.deviceTabActions.offer(RequestShare(bookOnDisk))
}
info_sheet_delete.setOnClickListener {
zimManageViewModel.deviceTabActions.offer(RequestDelete(bookOnDisk))
}
} ?: dismiss()
}
private fun render(book: Book) {

View File

@ -40,19 +40,19 @@ import org.kiwix.kiwixmobile.core.base.BaseActivity
import org.kiwix.kiwixmobile.core.base.BaseFragment
import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.viewModel
import org.kiwix.kiwixmobile.core.extensions.toast
import org.kiwix.kiwixmobile.core.utils.REQUEST_STORAGE_PERMISSION
import org.kiwix.kiwixmobile.core.utils.LanguageUtils
import org.kiwix.kiwixmobile.core.utils.REQUEST_STORAGE_PERMISSION
import org.kiwix.kiwixmobile.core.utils.SharedPreferenceUtil
import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BookOnDiskDelegate.BookDelegate
import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BookOnDiskDelegate.LanguageDelegate
import org.kiwix.kiwixmobile.core.zim_manager.fileselect_view.adapter.BooksOnDiskAdapter
import org.kiwix.kiwixmobile.zim_manager.ZimManageActivity
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions.RequestMultiSelection
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions.RequestOpen
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions.RequestSelect
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions.RequestShowInfo
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.RequestMultiSelection
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.RequestOpen
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.RequestSelect
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.RequestShowInfo
import javax.inject.Inject
private const val WAS_IN_ACTION_MODE = "WAS_IN_ACTION_MODE"
@ -111,7 +111,7 @@ class ZimFileSelectFragment : BaseFragment() {
zim_swiperefresh.isRefreshing = it!!
})
if (savedInstanceState != null && savedInstanceState.getBoolean(WAS_IN_ACTION_MODE)) {
zimManageViewModel.fileSelectActions.offer(FileSelectActions.RestartActionMode)
zimManageViewModel.deviceTabActions.offer(DeviceTabActions.RestartActionMode)
}
disposable.add(zimManageViewModel.libraryTabIsVisible.subscribe { finishActionMode() })
@ -154,9 +154,9 @@ class ZimFileSelectFragment : BaseFragment() {
}
private fun offerAction(
action: FileSelectActions
action: DeviceTabActions
) {
zimManageViewModel.fileSelectActions.offer(action)
zimManageViewModel.deviceTabActions.offer(action)
}
private fun checkPermissions() {

View File

@ -24,20 +24,20 @@ import io.reactivex.processors.PublishProcessor
import org.kiwix.kiwixmobile.R
import org.kiwix.kiwixmobile.core.base.SideEffect
import org.kiwix.kiwixmobile.core.extensions.ActivityExtensions.startActionMode
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions.MultiModeFinished
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions.RequestDeleteMultiSelection
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions.RequestShareMultiSelection
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.MultiModeFinished
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.RequestDeleteMultiSelection
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.RequestShareMultiSelection
data class StartMultiSelection(
val fileSelectActions: PublishProcessor<FileSelectActions>
val deviceTabActions: PublishProcessor<DeviceTabActions>
) : SideEffect<ActionMode?> {
override fun invokeWith(activity: AppCompatActivity): ActionMode? =
activity.startActionMode(
R.menu.menu_zim_files_contextual,
mapOf(
R.id.zim_file_delete_item to { fileSelectActions.offer(RequestDeleteMultiSelection) },
R.id.zim_file_share_item to { fileSelectActions.offer(RequestShareMultiSelection) }
R.id.zim_file_delete_item to { deviceTabActions.offer(RequestDeleteMultiSelection) },
R.id.zim_file_share_item to { deviceTabActions.offer(RequestShareMultiSelection) }
)
) { fileSelectActions.offer(MultiModeFinished) }
) { deviceTabActions.offer(MultiModeFinished) }
}

View File

@ -0,0 +1,27 @@
<!--
~ Kiwix Android
~ Copyright (c) 2020 Kiwix <android.kiwix.org>
~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation, either version 3 of the License, or
~ (at your option) any later version.
~
~ This program is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
~
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z"
android:fillColor="#ffffff"/>
</vector>

View File

@ -0,0 +1,27 @@
<!--
~ Kiwix Android
~ Copyright (c) 2020 Kiwix <android.kiwix.org>
~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation, either version 3 of the License, or
~ (at your option) any later version.
~
~ This program is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
~
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M19,19H5V5h7V3H5c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2v-7h-2v7zM14,3v2h3.59l-9.83,9.83 1.41,1.41L19,6.41V10h2V3h-7z"
android:fillColor="#ffffff"/>
</vector>

View File

@ -0,0 +1,27 @@
<!--
~ Kiwix Android
~ Copyright (c) 2020 Kiwix <android.kiwix.org>
~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation, either version 3 of the License, or
~ (at your option) any later version.
~
~ This program is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
~
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z"
android:fillColor="#ffffff"/>
</vector>

View File

@ -0,0 +1,27 @@
<!--
~ Kiwix Android
~ Copyright (c) 2020 Kiwix <android.kiwix.org>
~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation, either version 3 of the License, or
~ (at your option) any later version.
~
~ This program is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
~
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M6,19c0,1.1 0.9,2 2,2h8c1.1,0 2,-0.9 2,-2V7H6v12zM19,4h-3.5l-1,-1h-5l-1,1H5v2h14V4z"
android:fillColor="#000000"/>
</vector>

View File

@ -0,0 +1,27 @@
<!--
~ Kiwix Android
~ Copyright (c) 2020 Kiwix <android.kiwix.org>
~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation, either version 3 of the License, or
~ (at your option) any later version.
~
~ This program is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
~
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M19,19H5V5h7V3H5c-1.11,0 -2,0.9 -2,2v14c0,1.1 0.89,2 2,2h14c1.1,0 2,-0.9 2,-2v-7h-2v7zM14,3v2h3.59l-9.83,9.83 1.41,1.41L19,6.41V10h2V3h-7z"
android:fillColor="#000000"/>
</vector>

View File

@ -0,0 +1,27 @@
<!--
~ Kiwix Android
~ Copyright (c) 2020 Kiwix <android.kiwix.org>
~ This program is free software: you can redistribute it and/or modify
~ it under the terms of the GNU General Public License as published by
~ the Free Software Foundation, either version 3 of the License, or
~ (at your option) any later version.
~
~ This program is distributed in the hope that it will be useful,
~ but WITHOUT ANY WARRANTY; without even the implied warranty of
~ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
~ GNU General Public License for more details.
~
~ You should have received a copy of the GNU General Public License
~ along with this program. If not, see <http://www.gnu.org/licenses/>.
~
-->
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z"
android:fillColor="#000000"/>
</vector>

View File

@ -12,5 +12,6 @@
android:id="@+id/detail"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?textAppearanceBody2" />
android:textAppearance="?textAppearanceBody2"
android:textIsSelectable="true" />
</merge>

View File

@ -2,9 +2,9 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="@dimen/activity_horizontal_margin">
android:paddingTop="@dimen/activity_horizontal_margin">
<TextView
android:id="@+id/info_sheet_title"
@ -31,6 +31,8 @@
android:id="@+id/info_sheet_description"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:paddingStart="@dimen/activity_horizontal_margin"
android:paddingEnd="@dimen/activity_horizontal_margin"
android:gravity="center"
android:textAppearance="?textAppearanceBody1"
app:layout_constraintEnd_toEndOf="parent"
@ -38,91 +40,129 @@
app:layout_constraintTop_toBottomOf="@+id/info_sheet_favicon"
tools:text="Description placeholder, I imagine this could be quite long so blah blah blah" />
<androidx.constraintlayout.helper.widget.Flow
android:layout_width="0dp"
<!--Without this I couldn't get the flow to respect padding/margins. Also tried with guidelines-->
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/flow_container"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:constraint_referenced_ids="detail_language,detail_creator,detail_publisher,detail_date,detail_article_count,detail_media_count,detail_size,detail_name,detail_url,detail_tags,detail_file"
app:flow_wrapMode="aligned"
android:paddingStart="@dimen/activity_horizontal_margin"
android:paddingEnd="@dimen/activity_horizontal_margin"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/info_sheet_description" />
app:layout_constraintTop_toBottomOf="@id/info_sheet_description">
<org.kiwix.kiwixmobile.zim_manager.fileselect_view.DetailChip
android:id="@+id/detail_creator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:label="@string/creator"
tools:ignore="MissingConstraints" />
<androidx.constraintlayout.helper.widget.Flow
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:constraint_referenced_ids="detail_language,detail_creator,detail_publisher,detail_date,detail_article_count,detail_media_count,detail_size,detail_name,detail_url,detail_tags,detail_file"
app:flow_horizontalGap="5dp"
app:flow_horizontalStyle="spread"
app:flow_wrapMode="chain"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<org.kiwix.kiwixmobile.zim_manager.fileselect_view.DetailChip
android:id="@+id/detail_language"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:label="@string/pref_language_title"
tools:ignore="MissingConstraints" />
<org.kiwix.kiwixmobile.zim_manager.fileselect_view.DetailChip
android:id="@+id/detail_creator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:label="@string/creator"
tools:ignore="MissingConstraints" />
<org.kiwix.kiwixmobile.zim_manager.fileselect_view.DetailChip
android:id="@+id/detail_publisher"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:label="@string/publisher"
tools:ignore="MissingConstraints" />
<org.kiwix.kiwixmobile.zim_manager.fileselect_view.DetailChip
android:id="@+id/detail_language"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:label="@string/pref_language_title"
tools:ignore="MissingConstraints" />
<org.kiwix.kiwixmobile.zim_manager.fileselect_view.DetailChip
android:id="@+id/detail_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:label="@string/date"
tools:ignore="MissingConstraints" />
<org.kiwix.kiwixmobile.zim_manager.fileselect_view.DetailChip
android:id="@+id/detail_publisher"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:label="@string/publisher"
tools:ignore="MissingConstraints" />
<org.kiwix.kiwixmobile.zim_manager.fileselect_view.DetailChip
android:id="@+id/detail_article_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:label="@string/article_count"
tools:ignore="MissingConstraints" />
<org.kiwix.kiwixmobile.zim_manager.fileselect_view.DetailChip
android:id="@+id/detail_date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:label="@string/date"
tools:ignore="MissingConstraints" />
<org.kiwix.kiwixmobile.zim_manager.fileselect_view.DetailChip
android:id="@+id/detail_media_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:label="@string/media_count"
tools:ignore="MissingConstraints" />
<org.kiwix.kiwixmobile.zim_manager.fileselect_view.DetailChip
android:id="@+id/detail_article_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:label="@string/article_count"
tools:ignore="MissingConstraints" />
<org.kiwix.kiwixmobile.zim_manager.fileselect_view.DetailChip
android:id="@+id/detail_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:label="@string/size"
tools:ignore="MissingConstraints" />
<org.kiwix.kiwixmobile.zim_manager.fileselect_view.DetailChip
android:id="@+id/detail_media_count"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:label="@string/media_count"
tools:ignore="MissingConstraints" />
<org.kiwix.kiwixmobile.zim_manager.fileselect_view.DetailChip
android:id="@+id/detail_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:label="@string/name"
tools:ignore="MissingConstraints" />
<org.kiwix.kiwixmobile.zim_manager.fileselect_view.DetailChip
android:id="@+id/detail_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:label="@string/size"
tools:ignore="MissingConstraints" />
<org.kiwix.kiwixmobile.zim_manager.fileselect_view.DetailChip
android:id="@+id/detail_url"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:label="@string/url"
tools:ignore="MissingConstraints" />
<org.kiwix.kiwixmobile.zim_manager.fileselect_view.DetailChip
android:id="@+id/detail_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:label="@string/name"
tools:ignore="MissingConstraints" />
<org.kiwix.kiwixmobile.zim_manager.fileselect_view.DetailChip
android:id="@+id/detail_tags"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:label="@string/tags"
tools:ignore="MissingConstraints" />
<org.kiwix.kiwixmobile.zim_manager.fileselect_view.DetailChip
android:id="@+id/detail_url"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:label="@string/url"
tools:ignore="MissingConstraints" />
<org.kiwix.kiwixmobile.zim_manager.fileselect_view.DetailChip
android:id="@+id/detail_file"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:label="@string/path"
tools:ignore="MissingConstraints" />
<org.kiwix.kiwixmobile.zim_manager.fileselect_view.DetailChip
android:id="@+id/detail_tags"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:label="@string/tags"
tools:ignore="MissingConstraints" />
<org.kiwix.kiwixmobile.zim_manager.fileselect_view.DetailChip
android:id="@+id/detail_file"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:label="@string/path"
tools:ignore="MissingConstraints" />
</androidx.constraintlayout.widget.ConstraintLayout>
<TextView
android:id="@+id/info_sheet_open"
style="@style/info_sheet_button"
android:drawableStart="@drawable/ic_open_24dp"
android:text="@string/open"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/flow_container" />
<TextView
android:id="@+id/info_sheet_share"
style="@style/info_sheet_button"
android:drawableStart="@drawable/ic_share_24dp"
android:text="@string/share"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/info_sheet_open" />
<TextView
android:id="@+id/info_sheet_delete"
style="@style/info_sheet_button"
android:drawableStart="@drawable/ic_delete_24dp"
android:text="@string/delete"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/info_sheet_share" />
</androidx.constraintlayout.widget.ConstraintLayout>

View File

@ -28,4 +28,15 @@
<item name="layout_constraintTop_toTopOf">parent</item>
<item name="layout_constraintBottom_toBottomOf">parent</item>
</style>
<style name="info_sheet_button">
<item name="android:layout_width">match_parent</item>
<item name="android:layout_height">56dp</item>
<item name="android:background">?selectableItemBackground</item>
<item name="android:drawablePadding">32dp</item>
<item name="android:gravity">center_vertical</item>
<item name="android:paddingStart">16dp</item>
<item name="android:paddingEnd">16dp</item>
<item name="android:textAppearance">?textAppearanceBody1</item>
</style>
</resources>

View File

@ -53,13 +53,13 @@ import org.kiwix.kiwixmobile.zim_manager.Fat32Checker.FileSystemState.CanWrite4G
import org.kiwix.kiwixmobile.zim_manager.Fat32Checker.FileSystemState.CannotWrite4GbFile
import org.kiwix.kiwixmobile.zim_manager.NetworkState.CONNECTED
import org.kiwix.kiwixmobile.zim_manager.NetworkState.NOT_CONNECTED
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions.MultiModeFinished
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions.RequestDeleteMultiSelection
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions.RequestMultiSelection
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions.RequestOpen
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions.RequestSelect
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions.RequestShareMultiSelection
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.FileSelectActions.RestartActionMode
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.MultiModeFinished
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.RequestDeleteMultiSelection
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.RequestMultiSelection
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.RequestOpen
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.RequestSelect
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.RequestShareMultiSelection
import org.kiwix.kiwixmobile.zim_manager.ZimManageViewModel.DeviceTabActions.RestartActionMode
import org.kiwix.kiwixmobile.zim_manager.fileselect_view.FileSelectListState
import org.kiwix.kiwixmobile.zim_manager.fileselect_view.effects.DeleteFiles
import org.kiwix.kiwixmobile.zim_manager.fileselect_view.effects.None
@ -424,7 +424,7 @@ class ZimManageViewModelTest {
fun `RequestOpen offers OpenFile`() {
val bookOnDisk = bookOnDisk()
viewModel.sideEffects.test()
.also { viewModel.fileSelectActions.offer(RequestOpen(bookOnDisk)) }
.also { viewModel.deviceTabActions.offer(RequestOpen(bookOnDisk)) }
.assertValues(OpenFile(bookOnDisk))
}
@ -440,8 +440,8 @@ class ZimManageViewModelTest {
NORMAL
)
viewModel.sideEffects.test()
.also { viewModel.fileSelectActions.offer(RequestMultiSelection(bookToSelect)) }
.assertValues(StartMultiSelection(viewModel.fileSelectActions))
.also { viewModel.deviceTabActions.offer(RequestMultiSelection(bookToSelect)) }
.assertValues(StartMultiSelection(viewModel.deviceTabActions))
viewModel.fileSelectListStates.test()
.assertValue(
FileSelectListState(
@ -457,7 +457,7 @@ class ZimManageViewModelTest {
viewModel.fileSelectListStates.value =
FileSelectListState(listOf(selectedBook, bookOnDisk()), NORMAL)
viewModel.sideEffects.test()
.also { viewModel.fileSelectActions.offer(RequestDeleteMultiSelection) }
.also { viewModel.deviceTabActions.offer(RequestDeleteMultiSelection) }
.assertValues(DeleteFiles(listOf(selectedBook)))
}
@ -467,7 +467,7 @@ class ZimManageViewModelTest {
viewModel.fileSelectListStates.value =
FileSelectListState(listOf(selectedBook, bookOnDisk()), NORMAL)
viewModel.sideEffects.test()
.also { viewModel.fileSelectActions.offer(RequestShareMultiSelection) }
.also { viewModel.deviceTabActions.offer(RequestShareMultiSelection) }
.assertValues(ShareFiles(listOf(selectedBook)))
}
@ -477,7 +477,7 @@ class ZimManageViewModelTest {
viewModel.fileSelectListStates.value =
FileSelectListState(listOf(selectedBook, bookOnDisk()), NORMAL)
viewModel.sideEffects.test()
.also { viewModel.fileSelectActions.offer(MultiModeFinished) }
.also { viewModel.deviceTabActions.offer(MultiModeFinished) }
.assertValues(None)
viewModel.fileSelectListStates.test().assertValue(
FileSelectListState(
@ -495,7 +495,7 @@ class ZimManageViewModelTest {
viewModel.fileSelectListStates.value =
FileSelectListState(listOf(selectedBook, bookOnDisk(1L)), NORMAL)
viewModel.sideEffects.test()
.also { viewModel.fileSelectActions.offer(RequestSelect(selectedBook)) }
.also { viewModel.deviceTabActions.offer(RequestSelect(selectedBook)) }
.assertValues(None)
viewModel.fileSelectListStates.test().assertValue(
FileSelectListState(
@ -510,8 +510,8 @@ class ZimManageViewModelTest {
@Test
fun `RestartActionMode offers StartMultiSelection`() {
viewModel.sideEffects.test()
.also { viewModel.fileSelectActions.offer(RestartActionMode) }
.assertValues(StartMultiSelection(viewModel.fileSelectActions))
.also { viewModel.deviceTabActions.offer(RestartActionMode) }
.assertValues(StartMultiSelection(viewModel.deviceTabActions))
}
}

View File

@ -91,7 +91,7 @@ object Versions {
const val kiwixlib: String = "9.1.2"
const val material: String = "1.1.0-beta02" // available: "1.1.0"
const val material: String = "1.1.0"
const val multidex: String = "2.0.1"