From 7cde8ed5383df39bb6660a50e416ffd3cd784c92 Mon Sep 17 00:00:00 2001
From: Kelvin <kelvin@futo.org>
Date: Fri, 1 Dec 2023 16:45:17 +0100
Subject: [PATCH] Filler dev options

---
 .../com/futo/platformplayer/SettingsDev.kt    | 88 ++++++++++++++++++-
 .../activities/DeveloperActivity.kt           | 22 +++++
 .../platformplayer/states/StateHistory.kt     |  4 +-
 .../platformplayer/views/buttons/BigButton.kt | 17 ++++
 .../views/fields/ButtonField.kt               |  2 +
 app/src/main/res/values/strings.xml           |  1 +
 6 files changed, 131 insertions(+), 3 deletions(-)

diff --git a/app/src/main/java/com/futo/platformplayer/SettingsDev.kt b/app/src/main/java/com/futo/platformplayer/SettingsDev.kt
index 111911f1..ef4f9495 100644
--- a/app/src/main/java/com/futo/platformplayer/SettingsDev.kt
+++ b/app/src/main/java/com/futo/platformplayer/SettingsDev.kt
@@ -13,9 +13,11 @@ import androidx.work.WorkManager
 import androidx.work.WorkerParameters
 import com.caoccao.javet.values.primitive.V8ValueInteger
 import com.caoccao.javet.values.primitive.V8ValueString
+import com.futo.platformplayer.activities.DeveloperActivity
 import com.futo.platformplayer.activities.SettingsActivity
 import com.futo.platformplayer.api.http.ManagedHttpClient
 import com.futo.platformplayer.api.media.models.contents.IPlatformContent
+import com.futo.platformplayer.api.media.models.video.IPlatformVideo
 import com.futo.platformplayer.api.media.platforms.js.JSClient
 import com.futo.platformplayer.api.media.platforms.js.SourcePluginConfig
 import com.futo.platformplayer.api.media.platforms.js.SourcePluginDescriptor
@@ -29,9 +31,13 @@ import com.futo.platformplayer.states.StateApp
 import com.futo.platformplayer.states.StateCache
 import com.futo.platformplayer.states.StateDeveloper
 import com.futo.platformplayer.states.StateDownloads
+import com.futo.platformplayer.states.StateHistory
+import com.futo.platformplayer.states.StatePlatform
 import com.futo.platformplayer.states.StateSubscriptions
 import com.futo.platformplayer.stores.FragmentedStorage
 import com.futo.platformplayer.stores.FragmentedStorageFileJson
+import com.futo.platformplayer.stores.db.types.DBHistory
+import com.futo.platformplayer.views.fields.ButtonField
 import com.futo.platformplayer.views.fields.FieldForm
 import com.futo.platformplayer.views.fields.FormField
 import kotlinx.coroutines.CoroutineScope
@@ -40,6 +46,7 @@ import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
 import kotlinx.serialization.*
 import kotlinx.serialization.json.*
+import java.time.OffsetDateTime
 import java.util.UUID
 import java.util.concurrent.TimeUnit
 import java.util.stream.IntStream.range
@@ -89,8 +96,16 @@ class SettingsDev : FragmentedStorageFileJson() {
     @Serializable
     class Cache {
 
-        @FormField(R.string.subscriptions_cache_5000, FieldForm.BUTTON, -1, 1)
+        @FormField(R.string.subscriptions_cache_5000, FieldForm.BUTTON, -1, 1, "subscription_cache_button")
         fun subscriptionsCache5000() {
+            Logger.i("SettingsDev", "Started caching 5000 sub items");
+            UIDialogs.toast(
+                SettingsActivity.getActivity()!!,
+                "Started caching 5000 sub items"
+            );
+            val button = DeveloperActivity.getActivity()?.getField("subscription_cache_button");
+            if(button is ButtonField)
+                button.setButtonEnabled(false);
             StateApp.instance.scope.launch(Dispatchers.IO) {
                 try {
                     val subsCache =
@@ -127,6 +142,77 @@ class SettingsDev : FragmentedStorageFileJson() {
                     Logger.e("SettingsDev", ex.message, ex);
                     Logger.i("SettingsDev", "Failed: ${ex.message}");
                 }
+                finally {
+                    withContext(Dispatchers.Main) {
+                        if(button is ButtonField)
+                            button.setButtonEnabled(true);
+                    }
+                }
+            }
+        }
+
+        @FormField(R.string.history_cache_100, FieldForm.BUTTON, -1, 1, "history_cache_button")
+        fun historyCache100() {
+            Logger.i("SettingsDev", "Started caching 100 history items (from home)");
+            UIDialogs.toast(
+                SettingsActivity.getActivity()!!,
+                "Started caching 100 history items (from home)"
+            );
+            val button = DeveloperActivity.getActivity()?.getField("history_cache_button");
+            if(button is ButtonField)
+                button.setButtonEnabled(false);
+            StateApp.instance.scope.launch(Dispatchers.IO) {
+                try {
+                    val subsCache = StatePlatform.instance.getHome();
+
+                    var num = 0;
+                    for(item in subsCache.getResults().filterIsInstance<IPlatformVideo>()) {
+                        StateHistory.instance.getHistoryByVideo(item, true, OffsetDateTime.now().minusHours(num.toLong() * 4))
+                        num++;
+                    }
+
+                    var total = 0;
+                    var page = 0;
+                    var lastToast = System.currentTimeMillis();
+                    while(subsCache!!.hasMorePages() && total < 5000) {
+                        subsCache!!.nextPage();
+                        total += subsCache!!.getResults().size;
+                        page++;
+
+                        for(item in subsCache.getResults().filterIsInstance<IPlatformVideo>()) {
+                            StateHistory.instance.getHistoryByVideo(item, true, OffsetDateTime.now().minusHours(num.toLong() * 4))
+                            num++;
+                        }
+
+                        if(page % 4 == 0)
+                            withContext(Dispatchers.Main) {
+                                val diff = System.currentTimeMillis() - lastToast;
+                                lastToast = System.currentTimeMillis();
+                                UIDialogs.toast(
+                                    SettingsActivity.getActivity()!!,
+                                    "Page: ${page}, Total: ${total}, Speed: ${diff}ms"
+                                );
+                            }
+                        Thread.sleep(500);
+                    }
+
+                    withContext(Dispatchers.Main) {
+                        UIDialogs.toast(
+                            SettingsActivity.getActivity()!!,
+                            "FINISHED Page: ${page}, Total: ${total}"
+                        );
+                    }
+                }
+                catch(ex: Throwable) {
+                    Logger.e("SettingsDev", ex.message, ex);
+                    Logger.i("SettingsDev", "Failed: ${ex.message}");
+                }
+                finally {
+                    withContext(Dispatchers.Main) {
+                        if(button is ButtonField)
+                            button.setButtonEnabled(true);
+                    }
+                }
             }
         }
     }
diff --git a/app/src/main/java/com/futo/platformplayer/activities/DeveloperActivity.kt b/app/src/main/java/com/futo/platformplayer/activities/DeveloperActivity.kt
index 53215522..f714f880 100644
--- a/app/src/main/java/com/futo/platformplayer/activities/DeveloperActivity.kt
+++ b/app/src/main/java/com/futo/platformplayer/activities/DeveloperActivity.kt
@@ -1,17 +1,24 @@
 package com.futo.platformplayer.activities
 
+import android.annotation.SuppressLint
 import android.os.Bundle
 import android.widget.ImageButton
 import androidx.appcompat.app.AppCompatActivity
 import com.futo.platformplayer.*
 import com.futo.platformplayer.views.fields.FieldForm
+import com.futo.platformplayer.views.fields.IField
 
 class DeveloperActivity : AppCompatActivity() {
     private lateinit var _form: FieldForm;
     private lateinit var _buttonBack: ImageButton;
 
+    fun getField(id: String): IField? {
+        return _form.findField(id);
+    }
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState);
+        DeveloperActivity._lastActivity = this;
         setContentView(R.layout.activity_dev);
         setNavigationBarColorAndIcons();
 
@@ -33,4 +40,19 @@ class DeveloperActivity : AppCompatActivity() {
         super.finish()
         overridePendingTransition(R.anim.slide_lighten, R.anim.slide_out_up)
     }
+
+
+
+    companion object {
+        //TODO: Temporary for solving Settings issues
+        @SuppressLint("StaticFieldLeak")
+        private var _lastActivity: DeveloperActivity? = null;
+
+        fun getActivity(): DeveloperActivity? {
+            val act = _lastActivity;
+            if(act != null)
+                return act;
+            return null;
+        }
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/futo/platformplayer/states/StateHistory.kt b/app/src/main/java/com/futo/platformplayer/states/StateHistory.kt
index 0a03ade4..b60e22be 100644
--- a/app/src/main/java/com/futo/platformplayer/states/StateHistory.kt
+++ b/app/src/main/java/com/futo/platformplayer/states/StateHistory.kt
@@ -105,12 +105,12 @@ class StateHistory {
     fun getHistoryIndexByUrl(url: String): DBHistory.Index? {
         return historyIndex[url];
     }
-    fun getHistoryByVideo(video: IPlatformVideo, create: Boolean = false): DBHistory.Index? {
+    fun getHistoryByVideo(video: IPlatformVideo, create: Boolean = false, watchDate: OffsetDateTime? = null): DBHistory.Index? {
         val existing = historyIndex[video.url];
         if(existing != null)
             return _historyDBStore.get(existing.id!!);
         else if(create) {
-            val newHistItem = HistoryVideo(SerializedPlatformVideo.fromVideo(video), 0, OffsetDateTime.now());
+            val newHistItem = HistoryVideo(SerializedPlatformVideo.fromVideo(video), 0, watchDate ?: OffsetDateTime.now());
             val id = _historyDBStore.insert(newHistItem);
             return _historyDBStore.get(id);
         }
diff --git a/app/src/main/java/com/futo/platformplayer/views/buttons/BigButton.kt b/app/src/main/java/com/futo/platformplayer/views/buttons/BigButton.kt
index 6d5e30e8..61f8013a 100644
--- a/app/src/main/java/com/futo/platformplayer/views/buttons/BigButton.kt
+++ b/app/src/main/java/com/futo/platformplayer/views/buttons/BigButton.kt
@@ -40,6 +40,8 @@ open class BigButton : LinearLayout {
         _root.apply {
             isClickable = true;
             setOnClickListener {
+                if(!isEnabled)
+                    return@setOnClickListener;
                 action();
                 onClick.emit();
             };
@@ -54,6 +56,8 @@ open class BigButton : LinearLayout {
         _root.apply {
             isClickable = true;
             setOnClickListener {
+                if(!isEnabled)
+                    return@setOnClickListener;
                 onClick.emit();
             };
         }
@@ -144,4 +148,17 @@ open class BigButton : LinearLayout {
 
         return this;
     }
+
+    fun setButtonEnabled(enabled: Boolean) {
+        if(enabled) {
+            alpha = 1f;
+            isEnabled = true;
+            isClickable = true;
+        }
+        else {
+            alpha = 0.5f;
+            isEnabled = false;
+            isClickable = false;
+        }
+    }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/futo/platformplayer/views/fields/ButtonField.kt b/app/src/main/java/com/futo/platformplayer/views/fields/ButtonField.kt
index 6996005c..03af1ee8 100644
--- a/app/src/main/java/com/futo/platformplayer/views/fields/ButtonField.kt
+++ b/app/src/main/java/com/futo/platformplayer/views/fields/ButtonField.kt
@@ -57,6 +57,8 @@ class ButtonField : BigButton, IField {
         };
 
         super.onClick.subscribe {
+            if(!isEnabled)
+                return@subscribe;
             if(_method?.parameterCount == 1)
                 _method?.invoke(_obj, context);
             else if(_method?.parameterCount == 2)
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 583192bc..12b56994 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -435,6 +435,7 @@
     <string name="settings_related_to_development_server_be_careful_as_it_may_open_your_phone_to_security_vulnerabilities">Settings related to development server, be careful as it may open your phone to security vulnerabilities</string>
     <string name="start_server">Start Server</string>
     <string name="subscriptions_cache_5000">Subscriptions Cache 5000</string>
+    <string name="history_cache_100">History Cache 100</string>
     <string name="start_server_on_boot">Start Server on boot</string>
     <string name="starts_a_devServer_on_port_11337_may_expose_vulnerabilities">Starts a DevServer on port 11337, may expose vulnerabilities.</string>
     <string name="test_v8_communication_speed">Test V8 Communication speed</string>
-- 
GitLab