From a8b41f5b150663640ae6382a900eaa6982d1058c Mon Sep 17 00:00:00 2001 From: MohitMali Date: Thu, 5 Oct 2023 13:12:44 +0530 Subject: [PATCH] Introduce 'MaterialShowCase' feature to provide user education on the file transfer functionality. --- app/detekt_baseline.xml | 1 + .../LocalFileTransferFragment.kt | 51 +++++++++++++++++-- buildSrc/src/main/kotlin/Libs.kt | 5 ++ buildSrc/src/main/kotlin/Versions.kt | 2 + .../kotlin/plugin/AllProjectConfigurer.kt | 1 + core/src/main/res/values/strings.xml | 4 ++ 6 files changed, 61 insertions(+), 3 deletions(-) diff --git a/app/detekt_baseline.xml b/app/detekt_baseline.xml index 77857244b..22d856fb2 100644 --- a/app/detekt_baseline.xml +++ b/app/detekt_baseline.xml @@ -11,6 +11,7 @@ MagicNumber:ShareFiles.kt$ShareFiles$24 MagicNumber:ZimManageViewModel.kt$ZimManageViewModel$5 MagicNumber:ZimManageViewModel.kt$ZimManageViewModel$500 + MagicNumber:LocalFileTransferFragment.kt$LocalFileTransferFragment$500 NestedBlockDepth:LocalLibraryFragment.kt$LocalLibraryFragment$private fun checkPermissions() NestedBlockDepth:PeerGroupHandshake.kt$PeerGroupHandshake$private fun readHandshakeAndExchangeMetaData(): InetAddress? NestedBlockDepth:ReceiverHandShake.kt$ReceiverHandShake$override fun exchangeFileTransferMetadata(inputStream: InputStream, outputStream: OutputStream) diff --git a/app/src/main/java/org/kiwix/kiwixmobile/localFileTransfer/LocalFileTransferFragment.kt b/app/src/main/java/org/kiwix/kiwixmobile/localFileTransfer/LocalFileTransferFragment.kt index d02fe131b..4f12750e9 100644 --- a/app/src/main/java/org/kiwix/kiwixmobile/localFileTransfer/LocalFileTransferFragment.kt +++ b/app/src/main/java/org/kiwix/kiwixmobile/localFileTransfer/LocalFileTransferFragment.kt @@ -33,6 +33,8 @@ import android.net.wifi.p2p.WifiP2pDevice import android.net.wifi.p2p.WifiP2pDeviceList import android.os.Build import android.os.Bundle +import android.os.Handler +import android.os.Looper import android.provider.Settings import android.util.Log import android.view.LayoutInflater @@ -67,6 +69,8 @@ import org.kiwix.kiwixmobile.localFileTransfer.WifiDirectManager.Companion.getDe import org.kiwix.kiwixmobile.localFileTransfer.adapter.WifiP2pDelegate import org.kiwix.kiwixmobile.localFileTransfer.adapter.WifiPeerListAdapter import org.kiwix.kiwixmobile.core.webserver.ZimHostFragment.Companion.PERMISSION_REQUEST_CODE_COARSE_LOCATION +import uk.co.deanwild.materialshowcaseview.MaterialShowcaseSequence +import uk.co.deanwild.materialshowcaseview.ShowcaseConfig import javax.inject.Inject /** @@ -84,6 +88,7 @@ import javax.inject.Inject */ const val URIS_KEY = "uris" +const val SHOWCASE_ID = "MaterialShowcaseId" @SuppressLint("GoogleAppIndexingApiWarning", "Registered") class LocalFileTransferFragment : @@ -104,6 +109,8 @@ class LocalFileTransferFragment : private var fileListAdapter: FileListAdapter? = null private var wifiPeerListAdapter: WifiPeerListAdapter? = null private var fragmentLocalFileTransferBinding: FragmentLocalFileTransferBinding? = null + private var materialShowcaseSequence: MaterialShowcaseSequence? = null + private var searchView: View? = null override fun onCreateView( inflater: LayoutInflater, @@ -139,6 +146,11 @@ class LocalFileTransferFragment : object : MenuProvider { override fun onCreateMenu(menu: Menu, menuInflater: MenuInflater) { menuInflater.inflate(R.menu.wifi_file_share_items, menu) + Handler(Looper.getMainLooper()).post { + searchView = + fragmentLocalFileTransferBinding?.root?.findViewById(R.id.menu_item_search_devices) + showCaseFeatureToUsers() + } } override fun onMenuItemSelected(menuItem: MenuItem): Boolean { @@ -154,8 +166,40 @@ class LocalFileTransferFragment : ) } - private fun onSearchMenuClicked(): Boolean { - return when { + private fun showCaseFeatureToUsers() { + searchView?.let { + materialShowcaseSequence = MaterialShowcaseSequence(activity, SHOWCASE_ID).apply { + val config = ShowcaseConfig().apply { + delay = 500 // half second between each showcase view + } + setConfig(config) + addSequenceItem( + it, + getString(R.string.click_nearby_devices_message), + getString(R.string.got_it) + ) + addSequenceItem( + fragmentLocalFileTransferBinding?.textViewDeviceName, + getString(R.string.your_device_name_message), + getString(R.string.got_it) + ) + addSequenceItem( + fragmentLocalFileTransferBinding?.listPeerDevices, + getString(R.string.nearby_devices_list_message), + getString(R.string.got_it) + ) + addSequenceItem( + fragmentLocalFileTransferBinding?.recyclerViewTransferFiles, + getString(R.string.transfer_zim_files_list_message), + getString(R.string.got_it) + ) + start() + } + } + } + + private fun onSearchMenuClicked(): Boolean = + when { !checkFineLocationAccessPermission() -> true !checkExternalStorageWritePermission() -> @@ -175,7 +219,6 @@ class LocalFileTransferFragment : true } } - } private fun setupPeerDevicesList(activity: CoreMainActivity) { fragmentLocalFileTransferBinding?.listPeerDevices?.apply { @@ -413,6 +456,8 @@ class LocalFileTransferFragment : wifiDirectManager.stopWifiDirectManager() wifiDirectManager.callbacks = null fragmentLocalFileTransferBinding = null + searchView = null + materialShowcaseSequence = null super.onDestroyView() } diff --git a/buildSrc/src/main/kotlin/Libs.kt b/buildSrc/src/main/kotlin/Libs.kt index e91d0203c..c3959acb6 100644 --- a/buildSrc/src/main/kotlin/Libs.kt +++ b/buildSrc/src/main/kotlin/Libs.kt @@ -339,4 +339,9 @@ object Libs { * https://developer.android.com/testing */ const val junit: String = "androidx.test.ext:junit:" + Versions.junit + + /** + * https://github.com/deano2390/MaterialShowcaseView + */ + const val material_show_case_view: String = "com.github.deano2390:MaterialShowcaseView:" + Versions.material_show_case_view } diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index 57e1d713b..c013798c9 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -101,6 +101,8 @@ object Versions { const val webkit: String = "1.3.0" const val junit: String = "1.1.4" + + const val material_show_case_view: String = "1.3.7" } /** diff --git a/buildSrc/src/main/kotlin/plugin/AllProjectConfigurer.kt b/buildSrc/src/main/kotlin/plugin/AllProjectConfigurer.kt index 8144e71cd..251c5c4ad 100644 --- a/buildSrc/src/main/kotlin/plugin/AllProjectConfigurer.kt +++ b/buildSrc/src/main/kotlin/plugin/AllProjectConfigurer.kt @@ -207,6 +207,7 @@ class AllProjectConfigurer { implementation(Libs.rxandroid) implementation(Libs.rxjava) implementation(Libs.preference_ktx) + implementation(Libs.material_show_case_view) } } } diff --git a/core/src/main/res/values/strings.xml b/core/src/main/res/values/strings.xml index a00432b8a..a03068b19 100644 --- a/core/src/main/res/values/strings.xml +++ b/core/src/main/res/values/strings.xml @@ -342,4 +342,8 @@ Go to Settings To perform this action, please grant notification access + Click here to search for nearby devices. + Your device name will appear here. + Here, you\'ll find a list of nearby devices. Tap on a device\'s name to initiate file transfer. + Here, you\'ll find the list of available ZIM files for transfer.