Improve loading time + fix choose file selector

This commit is contained in:
Thomas 2020-10-12 17:42:02 +02:00
parent 9845654009
commit cbab3fdc20
8 changed files with 89 additions and 119 deletions

View File

@ -43,7 +43,7 @@ dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.2.1'
implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
implementation 'androidx.constraintlayout:constraintlayout:2.0.2'
implementation 'androidx.navigation:navigation-fragment:2.3.0'
implementation 'androidx.navigation:navigation-ui:2.3.0'
testImplementation 'junit:junit:4.13'
@ -54,5 +54,5 @@ dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.github.GrenderG:Toasty:1.4.2'
implementation 'com.karumi:dexter:6.2.1'
}

View File

@ -5,9 +5,10 @@
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:allowBackup="false"
@ -19,6 +20,7 @@
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:configChanges="orientation|screenSize|layoutDirection"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

View File

@ -2,18 +2,13 @@ package app.fedilab.mobilizon;
import android.Manifest;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.style.UnderlineSpan;
@ -22,6 +17,7 @@ import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.ValueCallback;
import android.webkit.WebView;
import android.widget.EditText;
import android.widget.FrameLayout;
@ -40,11 +36,15 @@ import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout;
import com.google.android.material.navigation.NavigationView;
import com.karumi.dexter.Dexter;
import com.karumi.dexter.MultiplePermissionsReport;
import com.karumi.dexter.PermissionToken;
import com.karumi.dexter.listener.PermissionRequest;
import com.karumi.dexter.listener.multi.MultiplePermissionsListener;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import app.fedilab.mobilizon.client.RetrofitMobilizonAPI;
@ -56,35 +56,12 @@ import es.dmoral.toasty.Toasty;
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
//public static int PICK_INSTANCE = 5641;
public static final int INPUT_FILE_REQUEST_CODE = 123;
public static boolean isAuthenticated = false;
final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124;
private final LocationListener mLocationListener = new LocationListener() {
@Override
public void onLocationChanged(@NonNull final Location location) {
SharedPreferences sharedpref = getSharedPreferences(Helper.APP_SHARED_PREF, MODE_PRIVATE);
SharedPreferences.Editor editor = sharedpref.edit();
editor.putString(Helper.LAST_LOCATION, location.getLongitude() + "," + location.getLatitude() + "," + location.getAltitude());
editor.apply();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(@NonNull String provider) {
}
@Override
public void onProviderDisabled(@NonNull String provider) {
}
};
private RelativeLayout progress;
private WebView main_webview;
private FrameLayout webview_container;
private ValueCallback<Uri[]> mFilePathCallback;
@Override
protected void onCreate(Bundle savedInstanceState) {
@ -111,9 +88,6 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
final NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
if (Build.VERSION.SDK_INT >= 23) {
permissionsAPI();
}
WebView.setWebContentsDebuggingEnabled(true);
drawMenu();
@ -128,8 +102,24 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
main_webview.setWebChromeClient(mobilizonWebChromeClient);
main_webview.setWebViewClient(new MobilizonWebViewClient(MainActivity.this));
showProgressDialog();
main_webview.loadUrl("https://" + instance);
Dexter.withContext(this)
.withPermissions(
Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.ACCESS_COARSE_LOCATION,
Manifest.permission.ACCESS_FINE_LOCATION
)
.withListener(new MultiplePermissionsListener() {
@Override
public void onPermissionsChecked(MultiplePermissionsReport report) {/* ... */}
@Override
public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {/* ... */}
}).check();
}
@Override
@ -244,7 +234,6 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
}
}
@Override
public void onBackPressed() {
if (main_webview.canGoBack()) {
@ -258,15 +247,15 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
int id = item.getItemId();
if (id == R.id.nav_explore) {
main_webview.loadUrl("https://" + Helper.getLiveInstance(MainActivity.this) + "/search");
main_webview.loadUrl("javascript:document.querySelector('a[href=\"/search\"]').click();");
} else if (id == R.id.nav_my_event) {
main_webview.loadUrl("https://" + Helper.getLiveInstance(MainActivity.this) + "/events/me");
main_webview.loadUrl("javascript:document.querySelector('a[href=\"/events/me\"]').click();");
} else if (id == R.id.nav_my_group) {
main_webview.loadUrl("https://" + Helper.getLiveInstance(MainActivity.this) + "/groups/me");
main_webview.loadUrl("javascript:document.querySelector('a[href=\"/groups/me\"]').click();");
} else if (id == R.id.nav_create_event) {
main_webview.loadUrl("https://" + Helper.getLiveInstance(MainActivity.this) + "/events/create");
main_webview.loadUrl("javascript:document.querySelector('a[href=\"/events/create\"]').click();");
} else if (id == R.id.nav_login) {
main_webview.loadUrl("https://" + Helper.getLiveInstance(MainActivity.this) + "/login");
main_webview.loadUrl("javascript:document.querySelector('a[href=\"/login\"]').click();");
} else if (id == R.id.nav_logout) {
Helper.clearCookies();
new java.util.Timer().schedule(
@ -283,9 +272,9 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
1000
);
} else if (id == R.id.nav_profile) {
main_webview.loadUrl("https://" + Helper.getLiveInstance(MainActivity.this) + "/identity/update");
main_webview.loadUrl("javascript:document.querySelector('a[href=\"/identity/update\"]').click();");
} else if (id == R.id.nav_register) {
main_webview.loadUrl("https://" + Helper.getLiveInstance(MainActivity.this) + "/register/user");
main_webview.loadUrl("javascript:document.querySelector('a[href=\"/register/user\"]').click();");
}
DrawerLayout drawer = findViewById(R.id.drawer_layout);
@ -310,7 +299,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
(dialog, which) -> new Thread(() -> {
try {
String newInstance = input.getText().toString().trim();
WellKnownNodeinfo.NodeInfo instanceNodeInfo = new RetrofitMobilizonAPI(MainActivity.this, newInstance).getNodeInfo();
WellKnownNodeinfo.NodeInfo instanceNodeInfo = new RetrofitMobilizonAPI(newInstance).getNodeInfo();
if (instanceNodeInfo.getSoftware() != null && instanceNodeInfo.getSoftware().getName().trim().toLowerCase().compareTo("mobilizon") == 0) {
SharedPreferences.Editor editor = sharedpreferences.edit();
editor.putString(Helper.PREF_INSTANCE, newInstance);
@ -338,57 +327,31 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
alert.show();
}
@TargetApi(Build.VERSION_CODES.M)
private void permissionsAPI() {
List<String> permissionsNeeded = new ArrayList<>();
public ValueCallback<Uri[]> getmFilePathCallback() {
return mFilePathCallback;
}
final List<String> permissionsList = new ArrayList<>();
if (!addPermission(permissionsList))
permissionsNeeded.add(getString(R.string.show_location));
public void setmFilePathCallback(ValueCallback<Uri[]> mFilePathCallback) {
this.mFilePathCallback = mFilePathCallback;
}
if (permissionsList.size() > 0) {
if (permissionsNeeded.size() > 0) {
// Need Rationale
StringBuilder message = new StringBuilder(getString(R.string.access_needed, permissionsNeeded.get(0)));
for (int i = 1; i < permissionsNeeded.size(); i++)
message.append(", ").append(permissionsNeeded.get(i));
showMessageOKCancel(message.toString(),
(dialog, which) -> requestPermissions(permissionsList.toArray(new String[0]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS));
return;
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode != INPUT_FILE_REQUEST_CODE || mFilePathCallback == null) {
super.onActivityResult(requestCode, resultCode, data);
return;
}
Uri[] results = null;
if (resultCode == Activity.RESULT_OK) {
if (data != null) {
String dataString = data.getDataString();
if (dataString != null) {
results = new Uri[]{Uri.parse(dataString)};
}
}
requestPermissions(permissionsList.toArray(new String[0]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
}
}
private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
new AlertDialog.Builder(MainActivity.this)
.setMessage(message)
.setPositiveButton(getString(R.string.validate), okListener)
.setNegativeButton(getString(R.string.cancel), null)
.create()
.show();
}
@TargetApi(Build.VERSION_CODES.M)
private boolean addPermission(List<String> permissionsList) {
if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
permissionsList.add(Manifest.permission.ACCESS_FINE_LOCATION);
// Check for Rationale Option
return shouldShowRequestPermissionRationale(Manifest.permission.ACCESS_FINE_LOCATION);
} else {
LocationManager mLocationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
assert mLocationManager != null;
mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, Helper.LOCATION_REFRESH_TIME,
Helper.LOCATION_REFRESH_DISTANCE, mLocationListener);
}
return true;
mFilePathCallback.onReceiveValue(results);
mFilePathCallback = null;
}
public void drawMenu() {

View File

@ -14,13 +14,11 @@ package app.fedilab.mobilizon.client;
* You should have received a copy of the GNU General Public License along with Mobilizon app; if not,
* see <http://www.gnu.org/licenses>. */
import android.content.Context;
import java.io.IOException;
import java.net.URL;
import app.fedilab.mobilizon.client.entities.WellKnownNodeinfo;
import app.fedilab.mobilizon.helper.Helper;
import retrofit2.Call;
import retrofit2.Response;
import retrofit2.Retrofit;
@ -30,20 +28,9 @@ public class RetrofitMobilizonAPI {
private String finalUrl;
private Context _context;
private String instance;
public RetrofitMobilizonAPI(Context context) {
_context = context;
instance = Helper.getLiveInstance(context);
finalUrl = "https://" + Helper.getLiveInstance(context) + "/api/v1/";
}
public RetrofitMobilizonAPI(Context context, String instance) {
_context = context;
this.instance = instance;
public RetrofitMobilizonAPI(String instance) {
finalUrl = "https://" + instance.toLowerCase() + "/";
}

View File

@ -29,13 +29,8 @@ import java.io.InputStream;
* see <http://www.gnu.org/licenses>. */
public class Helper {
public static final String TAG = "mobilizon_app";
public static final String APP_PREFS = "app_prefs";
public static final String PREF_INSTANCE = "instance";
public static String APP_SHARED_PREF = "app_shared_prefs";
public static String LAST_LOCATION = "last_location";
public static int LOCATION_REFRESH_TIME = 60000;
public static int LOCATION_REFRESH_DISTANCE = 100;
/**
* Returns the preferred instance
@ -63,7 +58,6 @@ public class Helper {
webView.getSettings().setSupportZoom(true);
webView.getSettings().setDisplayZoomControls(false);
webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setAllowContentAccess(true);
webView.getSettings().setLoadsImagesAutomatically(true);
webView.getSettings().setSupportMultipleWindows(false);
webView.getSettings().setGeolocationDatabasePath(context.getFilesDir().getPath());
@ -71,6 +65,10 @@ public class Helper {
webView.getSettings().setAppCachePath(context.getCacheDir().getPath());
webView.getSettings().setAppCacheEnabled(true);
webView.getSettings().setDatabaseEnabled(true);
webView.getSettings().setAllowFileAccess(true);
webView.getSettings().setAllowContentAccess(true);
webView.getSettings().setAllowFileAccessFromFileURLs(true);
webView.getSettings().setAllowUniversalAccessFromFileURLs(true);
webView.getSettings().setDomStorageEnabled(true);
webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
webView.getSettings().setMediaPlaybackRequiresUserGesture(true);
@ -78,7 +76,7 @@ public class Helper {
cookieManager.setAcceptThirdPartyCookies(webView, true);
webView.setBackgroundColor(Color.TRANSPARENT);
webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
webView.requestFocus();
}

View File

@ -15,17 +15,23 @@ package app.fedilab.mobilizon.webview;
* see <http://www.gnu.org/licenses>. */
import android.app.Activity;
import android.content.Intent;
import android.media.MediaPlayer;
import android.net.Uri;
import android.view.SurfaceView;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.GeolocationPermissions;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.widget.FrameLayout;
import androidx.appcompat.app.AppCompatActivity;
import app.fedilab.mobilizon.MainActivity;
import static app.fedilab.mobilizon.MainActivity.INPUT_FILE_REQUEST_CODE;
/**
@ -79,6 +85,24 @@ public class MobilizonWebChromeClient extends WebChromeClient implements MediaPl
super.onProgressChanged(view, newProgress);
}
@Override
public boolean onShowFileChooser(WebView webView, ValueCallback<Uri[]> filePathCallback, FileChooserParams fileChooserParams) {
if (((MainActivity) activity).getmFilePathCallback() != null) {
((MainActivity) activity).getmFilePathCallback().onReceiveValue(null);
}
((MainActivity) activity).setmFilePathCallback(filePathCallback);
Intent contentSelectionIntent = new Intent(Intent.ACTION_GET_CONTENT);
contentSelectionIntent.addCategory(Intent.CATEGORY_OPENABLE);
contentSelectionIntent.setType("*/*");
Intent chooserIntent = new Intent(Intent.ACTION_CHOOSER);
chooserIntent.putExtra(Intent.EXTRA_INTENT, contentSelectionIntent);
this.activity.startActivityForResult(chooserIntent, INPUT_FILE_REQUEST_CODE);
return true;
}
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
if (view instanceof FrameLayout) {

View File

@ -87,9 +87,6 @@ public class MobilizonWebViewClient extends WebViewClient {
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
if (activity instanceof MainActivity) {
((MainActivity) activity).showProgressDialog();
}
}

View File

@ -16,7 +16,6 @@
app:layout_constraintTop_toTopOf="parent">
<WebView
android:id="@+id/main_webview"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>