diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt
index cc2c99de..8d312ceb 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/MainActivity.kt
@@ -134,7 +134,7 @@ import com.lagradost.cloudstream3.utils.AppUtils.loadSearchResult
import com.lagradost.cloudstream3.utils.AppUtils.setDefaultFocus
import com.lagradost.cloudstream3.utils.BackupUtils.backup
import com.lagradost.cloudstream3.utils.BackupUtils.setUpBackup
-import com.lagradost.cloudstream3.utils.BiometricAuthenticator
+import com.lagradost.cloudstream3.utils.BiometricAuthenticator.BiometricCallback
import com.lagradost.cloudstream3.utils.BiometricAuthenticator.biometricPrompt
import com.lagradost.cloudstream3.utils.BiometricAuthenticator.deviceHasPasswordPinLock
import com.lagradost.cloudstream3.utils.BiometricAuthenticator.isAuthEnabled
@@ -186,8 +186,7 @@ import kotlin.system.exitProcess
//https://github.com/jellyfin/jellyfin-android/blob/6cbf0edf84a3da82347c8d59b5d5590749da81a9/app/src/main/java/org/jellyfin/mobile/bridge/ExternalPlayer.kt#L225
-class MainActivity : AppCompatActivity(), ColorPickerDialogListener,
- BiometricAuthenticator.BiometricAuthCallback {
+class MainActivity : AppCompatActivity(), ColorPickerDialogListener, BiometricCallback {
companion object {
const val VLC_PACKAGE = "org.videolan.vlc"
const val MPV_PACKAGE = "is.xyz.mpv"
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountSelectActivity.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountSelectActivity.kt
index 0b0d83db..0da69f9c 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountSelectActivity.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/account/AccountSelectActivity.kt
@@ -23,6 +23,7 @@ import com.lagradost.cloudstream3.ui.settings.Globals.PHONE
import com.lagradost.cloudstream3.ui.settings.Globals.TV
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
import com.lagradost.cloudstream3.utils.BiometricAuthenticator
+import com.lagradost.cloudstream3.utils.BiometricAuthenticator.BiometricCallback
import com.lagradost.cloudstream3.utils.BiometricAuthenticator.biometricPrompt
import com.lagradost.cloudstream3.utils.BiometricAuthenticator.deviceHasPasswordPinLock
import com.lagradost.cloudstream3.utils.BiometricAuthenticator.isAuthEnabled
@@ -33,7 +34,7 @@ import com.lagradost.cloudstream3.utils.DataStoreHelper.selectedKeyIndex
import com.lagradost.cloudstream3.utils.DataStoreHelper.setAccount
import com.lagradost.cloudstream3.utils.UIHelper.colorFromAttribute
-class AccountSelectActivity : AppCompatActivity(), BiometricAuthenticator.BiometricAuthCallback {
+class AccountSelectActivity : AppCompatActivity(), BiometricCallback {
lateinit var viewModel: AccountViewModel
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsAccount.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsAccount.kt
index d227f9f6..67a2a15b 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsAccount.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/SettingsAccount.kt
@@ -51,7 +51,7 @@ import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setTool
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar
import com.lagradost.cloudstream3.utils.AppUtils.html
import com.lagradost.cloudstream3.utils.BackupUtils
-import com.lagradost.cloudstream3.utils.BiometricAuthenticator
+import com.lagradost.cloudstream3.utils.BiometricAuthenticator.BiometricCallback
import com.lagradost.cloudstream3.utils.BiometricAuthenticator.authCallback
import com.lagradost.cloudstream3.utils.BiometricAuthenticator.biometricPrompt
import com.lagradost.cloudstream3.utils.BiometricAuthenticator.deviceHasPasswordPinLock
@@ -68,7 +68,7 @@ import com.lagradost.cloudstream3.utils.UIHelper.toPx
import qrcode.QRCode
import java.io.ByteArrayOutputStream
-class SettingsAccount : PreferenceFragmentCompat(), BiometricAuthenticator.BiometricAuthCallback {
+class SettingsAccount : PreferenceFragmentCompat(), BiometricCallback {
companion object {
/** Used by nginx plugin too */
fun showLoginInfo(
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt
index ebd3260f..1364c376 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/ExtensionsFragment.kt
@@ -33,7 +33,7 @@ import com.lagradost.cloudstream3.ui.settings.Globals.TV
import com.lagradost.cloudstream3.ui.settings.Globals.isLayout
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setToolBarScrollFlags
import com.lagradost.cloudstream3.ui.settings.SettingsFragment.Companion.setUpToolbar
-import com.lagradost.cloudstream3.utils.AppUtils.downloadAllPluginsDialog
+import com.lagradost.cloudstream3.utils.AppUtils.addRepositoryDialog
import com.lagradost.cloudstream3.utils.AppUtils.setDefaultFocus
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
import com.lagradost.cloudstream3.utils.Coroutines.main
@@ -273,9 +273,9 @@ class ExtensionsFragment : Fragment() {
if (plugins.isNullOrEmpty()) {
showToast(R.string.no_plugins_found_error, Toast.LENGTH_LONG)
} else {
- this@ExtensionsFragment.activity?.downloadAllPluginsDialog(
+ this@ExtensionsFragment.activity?.addRepositoryDialog(
+ fixedName,
url,
- fixedName
)
}
}
diff --git a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsFragment.kt b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsFragment.kt
index acfbc584..3bdcb251 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsFragment.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/ui/settings/extensions/PluginsFragment.kt
@@ -10,6 +10,7 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.activityViewModels
import com.lagradost.cloudstream3.APIHolder.getApiProviderLangSettings
import com.lagradost.cloudstream3.AllLanguagesName
+import com.lagradost.cloudstream3.BuildConfig
import com.lagradost.cloudstream3.R
import com.lagradost.cloudstream3.TvType
import com.lagradost.cloudstream3.databinding.FragmentPluginsBinding
@@ -70,6 +71,8 @@ class PluginsFragment : Fragment() {
val name = arguments?.getString(PLUGINS_BUNDLE_NAME)
val url = arguments?.getString(PLUGINS_BUNDLE_URL)
val isLocal = arguments?.getBoolean(PLUGINS_BUNDLE_LOCAL) == true
+ // download all extensions button
+ val downloadAllButton = binding?.settingsToolbar?.menu?.findItem(R.id.download_all)
if (url == null || name == null) {
activity?.onBackPressedDispatcher?.onBackPressed()
@@ -171,7 +174,7 @@ class PluginsFragment : Fragment() {
if (isLocal) {
// No download button and no categories on local
- binding?.settingsToolbar?.menu?.findItem(R.id.download_all)?.isVisible = false
+ downloadAllButton?.isVisible = false
binding?.settingsToolbar?.menu?.findItem(R.id.lang_filter)?.isVisible = false
pluginViewModel.updatePluginListLocal()
@@ -179,6 +182,10 @@ class PluginsFragment : Fragment() {
} else {
pluginViewModel.updatePluginList(context, url)
binding?.tvtypesChipsScroll?.root?.isVisible = true
+ // not needed for users but may be useful for devs
+ downloadAllButton?.isVisible = BuildConfig.DEBUG
+
+
bindChips(
binding?.tvtypesChipsScroll?.tvtypesChips,
diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/AppUtils.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/AppUtils.kt
index ff27b192..626eca12 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/utils/AppUtils.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/utils/AppUtils.kt
@@ -62,7 +62,8 @@ import com.lagradost.cloudstream3.syncproviders.providers.Kitsu
import com.lagradost.cloudstream3.ui.WebviewFragment
import com.lagradost.cloudstream3.ui.result.ResultFragment
import com.lagradost.cloudstream3.ui.settings.Globals
-import com.lagradost.cloudstream3.ui.settings.extensions.PluginsViewModel.Companion.downloadAll
+import com.lagradost.cloudstream3.ui.settings.extensions.ExtensionsFragment
+import com.lagradost.cloudstream3.ui.settings.extensions.PluginsFragment
import com.lagradost.cloudstream3.ui.settings.extensions.RepositoryData
import com.lagradost.cloudstream3.utils.Coroutines.ioSafe
import com.lagradost.cloudstream3.utils.Coroutines.main
@@ -386,7 +387,7 @@ object AppUtils {
)
}
afterRepositoryLoadedEvent.invoke(true)
- downloadAllPluginsDialog(url, repo.name)
+ addRepositoryDialog(repo.name, url)
}
}
@@ -429,25 +430,36 @@ object AppUtils {
}
}
+ fun Activity.addRepositoryDialog(
+ repositoryName: String,
+ repositoryURL: String,
+ ) {
+ val repos = RepositoryManager.getRepositories()
- fun Activity.downloadAllPluginsDialog(repositoryUrl: String, repositoryName: String) {
- runOnUiThread {
- val context = this
- val builder: AlertDialog.Builder = AlertDialog.Builder(this)
- builder.setTitle(
- repositoryName
- )
- builder.setMessage(
- R.string.download_all_plugins_from_repo
- )
- builder.apply {
- setPositiveButton(R.string.download) { _, _ ->
- downloadAll(context, repositoryUrl, null)
- }
-
- setNegativeButton(R.string.no) { _, _ -> }
+ // navigate to newly added repository on pressing Open Repository
+ fun openAddedRepo() {
+ if (repos.isNotEmpty()) {
+ navigate(
+ R.id.global_to_navigation_settings_plugins,
+ PluginsFragment.newInstance(
+ repositoryName,
+ repositoryURL,
+ false,
+ )
+ )
+ }
+ }
+
+ runOnUiThread {
+ AlertDialog.Builder(this).apply {
+ setTitle(repositoryName)
+ setMessage(R.string.download_all_plugins_from_repo)
+ setPositiveButton(R.string.open_downloaded_repo) { _, _ ->
+ openAddedRepo()
+ }
+ setNegativeButton(R.string.dismiss, null)
+ show().setDefaultFocus()
}
- builder.show().setDefaultFocus()
}
}
diff --git a/app/src/main/java/com/lagradost/cloudstream3/utils/BiometricAuthenticator.kt b/app/src/main/java/com/lagradost/cloudstream3/utils/BiometricAuthenticator.kt
index c57600ee..45acbab4 100644
--- a/app/src/main/java/com/lagradost/cloudstream3/utils/BiometricAuthenticator.kt
+++ b/app/src/main/java/com/lagradost/cloudstream3/utils/BiometricAuthenticator.kt
@@ -26,7 +26,7 @@ object BiometricAuthenticator {
private var biometricManager: BiometricManager? = null
var biometricPrompt: BiometricPrompt? = null
var promptInfo: BiometricPrompt.PromptInfo? = null
- var authCallback: BiometricAuthCallback? = null // listen to authentication success
+ var authCallback: BiometricCallback? = null // listen to authentication success
private fun initializeBiometrics(activity: Activity) {
val executor = ContextCompat.getMainExecutor(activity)
@@ -141,14 +141,14 @@ object BiometricAuthenticator {
// function to start authentication in any fragment or activity
fun startBiometricAuthentication(activity: Activity, title: Int, setDeviceCred: Boolean) {
initializeBiometrics(activity)
- authCallback = activity as? BiometricAuthCallback
+ authCallback = activity as? BiometricCallback
if (isBiometricHardWareAvailable()) {
- authCallback = activity as? BiometricAuthCallback
+ authCallback = activity as? BiometricCallback
authenticationDialog(activity, title, setDeviceCred)
promptInfo?.let { biometricPrompt?.authenticate(it) }
} else {
if (deviceHasPasswordPinLock(activity)) {
- authCallback = activity as? BiometricAuthCallback
+ authCallback = activity as? BiometricCallback
authenticationDialog(activity, R.string.password_pin_authentication_title, true)
promptInfo?.let { biometricPrompt?.authenticate(it) }
@@ -165,7 +165,7 @@ object BiometricAuthenticator {
}
}
- interface BiometricAuthCallback {
+ interface BiometricCallback {
fun onAuthenticationSuccess()
fun onAuthenticationError()
}
diff --git a/app/src/main/res/menu/repository.xml b/app/src/main/res/menu/repository.xml
index be99b1a8..7aa1f200 100644
--- a/app/src/main/res/menu/repository.xml
+++ b/app/src/main/res/menu/repository.xml
@@ -21,5 +21,6 @@
android:id="@+id/download_all"
android:icon="@drawable/netflix_download"
android:title="@string/batch_download"
- app:showAsAction="collapseActionView|ifRoom" />
+ app:showAsAction="collapseActionView|ifRoom"
+ android:visible="false"/>
\ No newline at end of file
diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml
index d0df339b..fafb6968 100644
--- a/app/src/main/res/navigation/mobile_navigation.xml
+++ b/app/src/main/res/navigation/mobile_navigation.xml
@@ -111,6 +111,27 @@
app:argType="boolean" />
+
+
+
+
+
+
Livestream
NSFW
Video
+ Music
+ Audio Book
+ Media
Source error
Remote error
Renderer error
@@ -617,7 +620,7 @@
View community repositories
Public list
Uppercase all subtitles
- Download all plugins from this repository?
+ Warning: CloudStream 3 does not take any responsibility for using third-party extensions and does not provide any support for them!
%s (Disabled)
Tracks
Audio tracks
@@ -668,6 +671,8 @@
Yes
No
OK
+ Dismiss
+ Open repository
Disable Battery optimization
To ensure uninterrupted downloads and notifications for subscribed
TV shows, CloudStream needs permission to run in background. By pressing "OK", you\'ll be directed to App info.
@@ -775,11 +780,8 @@
Password/PIN Authentication
Biometric authentication is not supported on this device
Unlock the app with Fingerprint, Face ID, PIN, Pattern and Password.
- This screen was closed due to multiple failed attempts. Please restart the application.
+ After a few failed attempts, the prompt will close. Simply restart the app to try again.
Your CloudStream data has been backed up now. Although the possibility of this is very low, all devices can behave differently. In the rare case, that you get locked out from accessing the app, clear the app data completely and restore from a backup. We are very sorry for any inconvenience arising from this.
- Music
- Audio Book
- Media
Reset
CloudStream Wiki
Visit %s on your smartphone or computer and enter the above code
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index fc2d0f86..2968a1b2 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,6 +1,6 @@
#Fri Apr 30 17:11:15 CEST 2021
distributionBase=GRADLE_USER_HOME
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-bin.zip
distributionPath=wrapper/dists
zipStorePath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME