--- a/app/src/main/java/com/codesys/forge/MainActivity.java +++ b/app/src/main/java/com/codesys/forge/MainActivity.java @@ -1,13 +1,12 @@ package com.codesys.forge; -import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; -import android.app.PendingIntent; -import android.app.Service; +import android.content.ActivityNotFoundException; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Intent; +import android.content.res.Configuration; import androidx.annotation.NonNull; import android.content.Context; import androidx.appcompat.app.AppCompatActivity; @@ -15,7 +14,6 @@ import androidx.core.app.NotificationManagerCompat; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; -import android.app.ProgressDialog; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.net.Uri; @@ -28,7 +26,9 @@ import android.view.View; import android.view.ViewTreeObserver; import android.view.Window; +import android.webkit.DownloadListener; import android.webkit.MimeTypeMap; +import android.webkit.ValueCallback; import android.webkit.WebBackForwardList; import android.webkit.WebChromeClient; import android.webkit.WebHistoryItem; @@ -47,13 +47,10 @@ import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; -import java.io.OutputStreamWriter; import java.math.BigInteger; import java.net.MalformedURLException; import java.net.URL; import java.net.HttpURLConnection; -import java.io.BufferedReader; -import java.io.InputStreamReader; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Date; @@ -63,13 +60,9 @@ import android.net.NetworkInfo; import android.widget.Toast; -import org.json.*; import com.google.android.material.bottomnavigation.BottomNavigationView; -class NotificationReceiver { - -} public class MainActivity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener { private Context myContext; @@ -89,6 +82,11 @@ private static Boolean xTalk = Boolean.FALSE; private static Boolean xCacheLoggedIn = Boolean.FALSE; + private ValueCallback<Uri> mUploadMessage; + public ValueCallback<Uri[]> uploadMessage; + public static final int REQUEST_SELECT_FILE = 100; + private final static int FILECHOOSER_RESULTCODE = 1; + // cache directory private File getLocalCacheDir() { File cacheDir = new File(MainActivity.this.getCacheDir(), "cache"); @@ -300,6 +298,32 @@ } @Override + public void onActivityResult(int requestCode, int resultCode, Intent intent) + { + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) + { + if (requestCode == REQUEST_SELECT_FILE) + { + if (uploadMessage == null) + return; + uploadMessage.onReceiveValue(WebChromeClient.FileChooserParams.parseResult(resultCode, intent)); + uploadMessage = null; + } + } + else if (requestCode == FILECHOOSER_RESULTCODE) + { + if (null == mUploadMessage) + return; + Uri result = intent == null || resultCode != RESULT_OK ? null : intent.getData(); + mUploadMessage.onReceiveValue(result); + mUploadMessage = null; + } + else + Toast.makeText(myContext, "Failed to Upload Image", Toast.LENGTH_LONG).show(); + } + + + @Override protected void onCreate(Bundle savedInstanceState) { String myUseragent; String url = this.getIntent().getStringExtra("url"); @@ -337,6 +361,7 @@ myWebView.getSettings().setAppCachePath(getCacheDir().getAbsolutePath()); myWebView.getSettings().setDomStorageEnabled(true); myWebView.getSettings().setAllowFileAccess(true); + myWebView.getSettings().setAllowContentAccess(true); if(getNetworkState()) { setOnline(); } @@ -477,6 +502,52 @@ */ refreshLayout.setRefreshing(false); setOffline(); + } + }); + + // File upload + myWebView.setWebChromeClient(new WebChromeClient() + { + public boolean onShowFileChooser(WebView mWebView, ValueCallback<Uri[]> filePathCallback, WebChromeClient.FileChooserParams fileChooserParams) + { + if (uploadMessage != null) { + uploadMessage.onReceiveValue(null); + uploadMessage = null; + } + + uploadMessage = filePathCallback; + + Intent intent = fileChooserParams.createIntent(); + try + { + startActivityForResult(intent, REQUEST_SELECT_FILE); + } catch (ActivityNotFoundException e) + { + uploadMessage = null; + Toast.makeText(myContext, "Cannot open local files", Toast.LENGTH_LONG).show(); + return false; + } + return true; + } + + protected void openFileChooser(ValueCallback<Uri> uploadMsg) + { + mUploadMessage = uploadMsg; + Intent i = new Intent(Intent.ACTION_GET_CONTENT); + i.addCategory(Intent.CATEGORY_OPENABLE); + i.setType("image/*"); + startActivityForResult(Intent.createChooser(i, "Choose a file"), FILECHOOSER_RESULTCODE); + } + }); + + // File download (opens with other app - no direct download) + myWebView.setDownloadListener(new DownloadListener() { + public void onDownloadStart(String url, String userAgent, + String contentDisposition, String mimetype, + long contentLength) { + Intent i = new Intent(Intent.ACTION_VIEW); + i.setData(Uri.parse(url)); + startActivity(i); } }); @@ -533,6 +604,12 @@ return super.onKeyDown(keyCode, event); } + // avoid reload of page on screen rotation + @Override + public void onConfigurationChanged(Configuration newConfig){ + super.onConfigurationChanged(newConfig); + } + @Override public void onStart() { super.onStart();