1
0
Fork 0

Fix file uploading

This commit is contained in:
Vendicated 2022-11-25 12:03:30 +01:00
parent 16fd228b3b
commit 924ba2b74b
No known key found for this signature in database
GPG key ID: EC781ADFB93EFFA3
2 changed files with 69 additions and 13 deletions

View file

@ -1,18 +1,23 @@
package dev.vendicated.vencord; package dev.vendicated.vencord;
import androidx.annotation.NonNull;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.StrictMode; import android.os.StrictMode;
import android.view.KeyEvent;
import android.webkit.ValueCallback;
import android.webkit.WebView; import android.webkit.WebView;
import java.io.IOException; import java.io.IOException;
public class MainActivity extends Activity { public class MainActivity extends Activity {
public static final int FILECHOOSER_RESULTCODE = 8485;
private WebView wv; private WebView wv;
public ValueCallback<Uri[]> filePathCallback;
@SuppressLint("SetJavaScriptEnabled") // mad? watch this swag @SuppressLint("SetJavaScriptEnabled") // mad? watch this swag
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -28,7 +33,7 @@ public class MainActivity extends Activity {
explodeAndroid(); explodeAndroid();
wv.setWebViewClient(new VWebviewClient()); wv.setWebViewClient(new VWebviewClient());
wv.setWebChromeClient(new VChromeClient()); wv.setWebChromeClient(new VChromeClient(this));
var s = wv.getSettings(); var s = wv.getSettings();
s.setJavaScriptEnabled(true); s.setJavaScriptEnabled(true);
@ -42,20 +47,45 @@ public class MainActivity extends Activity {
return; return;
} }
if (savedInstanceState == null)
wv.loadUrl("https://discord.com/app"); wv.loadUrl("https://discord.com/app");
} }
@Override @Override
protected void onSaveInstanceState(@NonNull Bundle state) { public boolean onKeyDown(int keyCode, KeyEvent event) {
super.onSaveInstanceState(state); if (keyCode == KeyEvent.KEYCODE_BACK && wv != null && wv.canGoBack()) {
wv.saveState(state); wv.goBack();
return true;
}
return super.onKeyDown(keyCode, event);
} }
@Override @Override
protected void onRestoreInstanceState(Bundle state) { protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
super.onRestoreInstanceState(state); if (requestCode != FILECHOOSER_RESULTCODE || filePathCallback == null)
wv.restoreState(state); return;
if (resultCode != RESULT_OK || intent == null) {
filePathCallback.onReceiveValue(null);
return;
} else {
Uri[] uris;
try {
var clipData = intent.getClipData();
if (clipData != null) { // multiple items
uris = new Uri[clipData.getItemCount()];
for (int i = 0; i < clipData.getItemCount(); i++) {
uris[i] = clipData.getItemAt(i).getUri();
}
} else { // single item
uris = new Uri[] { intent.getData() };
}
} catch (Exception ex) {
Logger.e("Error during file upload", ex);
uris = null;
}
filePathCallback.onReceiveValue(uris);
}
filePathCallback = null;
} }
private void explodeAndroid() { private void explodeAndroid() {

View file

@ -1,11 +1,19 @@
package dev.vendicated.vencord; package dev.vendicated.vencord;
import android.webkit.ConsoleMessage; import android.app.Activity;
import android.webkit.WebChromeClient; import android.content.ActivityNotFoundException;
import android.net.Uri;
import android.webkit.*;
import java.util.Locale; import java.util.Locale;
public class VChromeClient extends WebChromeClient { public class VChromeClient extends WebChromeClient {
private final MainActivity activity;
public VChromeClient(MainActivity activity) {
this.activity = activity;
}
@Override @Override
public boolean onConsoleMessage(ConsoleMessage msg) { public boolean onConsoleMessage(ConsoleMessage msg) {
var m = String.format(Locale.ENGLISH, "[Javascript] %s @ %d: %s", msg.message(), msg.lineNumber(), msg.sourceId()); var m = String.format(Locale.ENGLISH, "[Javascript] %s @ %d: %s", msg.message(), msg.lineNumber(), msg.sourceId());
@ -25,4 +33,22 @@ public class VChromeClient extends WebChromeClient {
} }
return true; return true;
} }
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
if (activity.filePathCallback != null)
activity.filePathCallback.onReceiveValue(null);
activity.filePathCallback = filePathCallback;
var i = fileChooserParams.createIntent();
try {
activity.startActivityForResult(i, MainActivity.FILECHOOSER_RESULTCODE);
} catch (ActivityNotFoundException ex) {
activity.filePathCallback = null;
return false;
}
return true;
}
} }