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.