diff --git a/app/src/main/java/com/futo/platformplayer/Settings.kt b/app/src/main/java/com/futo/platformplayer/Settings.kt index 6cd51c33..470f8601 100644 --- a/app/src/main/java/com/futo/platformplayer/Settings.kt +++ b/app/src/main/java/com/futo/platformplayer/Settings.kt @@ -603,6 +603,23 @@ class Settings : FragmentedStorageFileJson() { fun export() { StateBackup.startExternalBackup(); } + + + /* + @FormField(R.string.import_data, FieldForm.BUTTON, R.string.import_data_description, 4) + fun import() { + val act = SettingsActivity.getActivity() ?: return; + StateApp.instance.requestFileReadAccess(act, null) { + if(it != null && it.exists()) { + val name = it.name; + val contents = it.readBytes(act); + if(contents != null) { + if(name != null && name.endsWith(".zip", true)) + StateBackup.importZipBytes(act, act.lifecycleScope, contents); + } + } + } + }*/ } @FormField(R.string.payment, FieldForm.GROUP, -1, 14) diff --git a/app/src/main/java/com/futo/platformplayer/activities/MainActivity.kt b/app/src/main/java/com/futo/platformplayer/activities/MainActivity.kt index 322d63f2..5b47e4d3 100644 --- a/app/src/main/java/com/futo/platformplayer/activities/MainActivity.kt +++ b/app/src/main/java/com/futo/platformplayer/activities/MainActivity.kt @@ -753,6 +753,9 @@ class MainActivity : AppCompatActivity, IWithResultLauncher { StateSaved.instance.setVideoToOpenBlocking(null); } + inline fun isFragmentActive(): Boolean { + return fragCurrent is T; + } /** * Navigate takes a MainFragment, and makes them the current main visible view diff --git a/app/src/main/java/com/futo/platformplayer/states/StateApp.kt b/app/src/main/java/com/futo/platformplayer/states/StateApp.kt index 64646005..586ebf20 100644 --- a/app/src/main/java/com/futo/platformplayer/states/StateApp.kt +++ b/app/src/main/java/com/futo/platformplayer/states/StateApp.kt @@ -239,6 +239,25 @@ class StateApp { return state; } + fun requestFileReadAccess(activity: IWithResultLauncher, path: Uri?, handle: (DocumentFile?)->Unit) { + if(activity is Context) { + val intent = Intent(Intent.ACTION_OPEN_DOCUMENT); + if(path != null) + intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, path); + intent.flags = Intent.FLAG_GRANT_WRITE_URI_PERMISSION + .or(Intent.FLAG_GRANT_READ_URI_PERMISSION); + + activity.launchForResult(intent, 98) { + if(it.resultCode == Activity.RESULT_OK) { + val uri = it.data?.data; + if(uri != null) + handle(DocumentFile.fromSingleUri(activity, uri)); + } + else + UIDialogs.showDialogOk(context, R.drawable.ic_security_pred, "No access granted"); + }; + } + } fun requestDirectoryAccess(activity: IWithResultLauncher, name: String, purpose: String? = null, path: Uri?, handle: (Uri?)->Unit) { if(activity is Context) diff --git a/app/src/main/java/com/futo/platformplayer/subscription/SubscriptionsTaskFetchAlgorithm.kt b/app/src/main/java/com/futo/platformplayer/subscription/SubscriptionsTaskFetchAlgorithm.kt index a66c4734..a12584d6 100644 --- a/app/src/main/java/com/futo/platformplayer/subscription/SubscriptionsTaskFetchAlgorithm.kt +++ b/app/src/main/java/com/futo/platformplayer/subscription/SubscriptionsTaskFetchAlgorithm.kt @@ -2,6 +2,7 @@ package com.futo.platformplayer.subscription import com.futo.platformplayer.Settings import com.futo.platformplayer.UIDialogs +import com.futo.platformplayer.activities.MainActivity import com.futo.platformplayer.api.media.models.ResultCapabilities import com.futo.platformplayer.api.media.models.contents.IPlatformContent import com.futo.platformplayer.api.media.platforms.js.JSClient @@ -19,6 +20,7 @@ import com.futo.platformplayer.findNonRuntimeException import com.futo.platformplayer.fragment.mainactivity.main.SubscriptionsFeedFragment import com.futo.platformplayer.logging.Logger import com.futo.platformplayer.models.Subscription +import com.futo.platformplayer.states.StateApp import com.futo.platformplayer.states.StatePlatform import com.futo.platformplayer.states.StateSubscriptions import kotlinx.coroutines.CoroutineScope @@ -55,7 +57,7 @@ abstract class SubscriptionsTaskFetchAlgorithm( for(clientTasks in tasksGrouped) { val clientTaskCount = clientTasks.value.filter { !it.fromCache }.size; val clientCacheCount = clientTasks.value.size - clientTaskCount; - if(clientCacheCount > 0) { + if(clientCacheCount > 0 && StateApp.instance.contextOrNull?.let { it is MainActivity && it.isFragmentActive() } == true) { UIDialogs.toast("[${clientTasks.key.name}] only updating ${clientTaskCount} most urgent channels (rqs). (${clientCacheCount} cached)"); } } diff --git a/app/src/main/res/drawable/background_big_button_black.xml b/app/src/main/res/drawable/background_big_button_black.xml new file mode 100644 index 00000000..0a0c8e05 --- /dev/null +++ b/app/src/main/res/drawable/background_big_button_black.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_encrypted.xml b/app/src/main/res/drawable/ic_encrypted.xml new file mode 100644 index 00000000..6617d54d --- /dev/null +++ b/app/src/main/res/drawable/ic_encrypted.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/drawable/ic_lines.xml b/app/src/main/res/drawable/ic_lines.xml new file mode 100644 index 00000000..5b562bf5 --- /dev/null +++ b/app/src/main/res/drawable/ic_lines.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_zip.xml b/app/src/main/res/drawable/ic_zip.xml new file mode 100644 index 00000000..b5eac77b --- /dev/null +++ b/app/src/main/res/drawable/ic_zip.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/dialog_buttons.xml b/app/src/main/res/layout/dialog_buttons.xml new file mode 100644 index 00000000..c46e3f62 --- /dev/null +++ b/app/src/main/res/layout/dialog_buttons.xml @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_import_options.xml b/app/src/main/res/layout/dialog_import_options.xml new file mode 100644 index 00000000..e4b1df2b --- /dev/null +++ b/app/src/main/res/layout/dialog_import_options.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + + + + + + + +