Replace finalize with manual close for jsrequestexecutor, incognito icon change, show explanation for incognito

This commit is contained in:
Kelvin K
2025-12-02 15:21:22 -06:00
parent 09763320dd
commit 1c9becc2ba
10 changed files with 64 additions and 7 deletions
@@ -1052,6 +1052,8 @@ class Settings : FragmentedStorageFileJson() {
@FormField(R.string.polycentric_local_cache, FieldForm.TOGGLE, R.string.polycentric_local_cache_description, 7)
var polycentricLocalCache: Boolean = true;
var showPrivacyModeDialog: Boolean = true;
}
@FormField(R.string.gesture_controls, FieldForm.GROUP, -1, 19)
@@ -17,11 +17,14 @@ import com.futo.platformplayer.getOrThrow
import com.futo.platformplayer.invokeV8
import com.futo.platformplayer.invokeV8Void
import com.futo.platformplayer.logging.Logger
import com.futo.platformplayer.states.StateApp
import com.futo.platformplayer.states.StateDeveloper
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.serialization.Serializable
import java.util.Base64
class JSRequestExecutor {
class JSRequestExecutor: AutoCloseable {
private val _plugin: JSClient;
private val _config: IV8PluginConfig;
private var _executor: V8ValueObject;
@@ -29,6 +32,9 @@ class JSRequestExecutor {
private val hasCleanup: Boolean;
private var _cleanLock = Any();
private var _cleaned: Boolean = false;
constructor(plugin: JSClient, executor: V8ValueObject) {
this._plugin = plugin;
this._executor = executor;
@@ -102,8 +108,12 @@ class JSRequestExecutor {
open fun cleanup() {
if (!hasCleanup || _executor.isClosed)
return;
synchronized(_cleanLock) {
if (!hasCleanup || _executor.isClosed || _cleaned)
return;
_cleaned = true;
}
Logger.i("JSRequestExecutor", "JSRequestExecutor cleanup requested");
_plugin.busy {
if(_plugin is DevJSClient)
StateDeveloper.instance.handleDevCall(_plugin.devID, "requestExecutor.executeRequest()") {
@@ -125,9 +135,25 @@ class JSRequestExecutor {
}
}
protected fun finalize() {
override fun close() {
cleanup();
}
fun closeAsync() {
StateApp.instance.scopeOrNull?.launch(Dispatchers.IO){
try {
close();
}
catch(ex: Throwable) {
Logger.e("JSRequestExecutor", "Cleanup failed");
}
}
}
/*
protected fun finalize() {
cleanup();
}*/
}
//TODO: are these available..?
@@ -1280,10 +1280,14 @@ abstract class StateCasting {
}
if (audioSource != null && audioSource.hasRequestExecutor) {
val oldExecutor = _audioExecutor;
oldExecutor?.closeAsync();
_audioExecutor = audioSource.getRequestExecutor()
}
if (videoSource != null && videoSource.hasRequestExecutor) {
val oldExecutor = _videoExecutor;
oldExecutor?.closeAsync();
_videoExecutor = videoSource.getRequestExecutor()
}
@@ -865,6 +865,7 @@ class VideoDownload {
val sourceLength: Long?;
val fileStream = FileOutputStream(targetFile);
var executor: JSRequestExecutor? = null;
try{
var manifest = source.manifest;
if(source.hasGenerate)
@@ -881,7 +882,7 @@ class VideoDownload {
if(foundCues.count() <= 0)
throw IllegalStateException("No Cues found in manifest (unsupported dash?)");
val executor = if(source is JSSource && source.hasRequestExecutor)
executor = if(source is JSSource && source.hasRequestExecutor)
source.getRequestExecutor();
else
null;
@@ -940,6 +941,7 @@ class VideoDownload {
}
finally {
fileStream.close();
executor?.closeAsync()
}
return sourceLength!!;
}
@@ -154,6 +154,16 @@ class MenuBottomBarFragment : MainActivityFragment() {
else {
StateApp.instance.setPrivacyMode(true);
UIDialogs.appToast("Privacy mode enabled");
UIDialogs.showDialog(it.context ?: return@setOnClickListener, R.drawable.incognito, "Privacy Mode",
"All requests will be processed anonymously (any logins will be disabled except for the personalized home page), local playback and history tracking will also be disabled.\n\nTap the icon to disable.", null, 0,
UIDialogs.Action("Don't show again", {
Settings.instance.other.showPrivacyModeDialog = false;
Settings.instance.save();
}, UIDialogs.ActionStyle.NONE),
UIDialogs.Action("Understood", {
}, UIDialogs.ActionStyle.PRIMARY));
}
}
@@ -111,6 +111,10 @@ public class JSHttpDataSource extends BaseDataSource implements HttpDataSource {
* @return This factory.
*/
public Factory setRequestExecutor(@Nullable JSRequestExecutor requestExecutor) {
JSRequestExecutor oldExecutor = this.requestExecutor;
if(oldExecutor != null) {
oldExecutor.closeAsync();
}
this.requestExecutor = requestExecutor;
return this;
}
@@ -123,6 +127,10 @@ public class JSHttpDataSource extends BaseDataSource implements HttpDataSource {
* @return This factory.
*/
public Factory setRequestExecutor2(@Nullable JSRequestExecutor requestExecutor) {
JSRequestExecutor oldExecutor = this.requestExecutor2;
if(oldExecutor != null) {
oldExecutor.closeAsync();
}
this.requestExecutor2 = requestExecutor;
return this;
}
@@ -508,6 +516,10 @@ public class JSHttpDataSource extends BaseDataSource implements HttpDataSource {
@Override
public void close() throws HttpDataSourceException {
if(requestExecutor != null)
requestExecutor.closeAsync();
if(requestExecutor2 != null)
requestExecutor2.closeAsync();
try {
@Nullable InputStream inputStream = this.inputStream;
if (inputStream != null) {
Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

+2 -1
View File
@@ -77,12 +77,13 @@
android:layout_width="50dp"
android:layout_height="50dp"
android:contentDescription="@string/cd_incognito_button"
android:src="@drawable/ic_disabled_visible_purple"
android:src="@drawable/incognito_purple"
android:background="@drawable/background_button_round_black"
android:scaleType="fitCenter"
android:visibility="visible"
android:layout_marginLeft="10dp"
android:layout_marginBottom="10dp"
android:padding="8dp"
android:elevation="50dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintBottom_toTopOf="@id/toast_view" />
@@ -75,7 +75,7 @@
<ImageView
android:layout_width="30dp"
android:layout_height="30dp"
android:src="@drawable/ic_disabled_visible" />
android:src="@drawable/incognito" />
</LinearLayout>
</LinearLayout>