1
0
mirror of https://framagit.org/tom79/mobilizon-android-app synced 2025-06-05 21:59:22 +02:00

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 fileTree(dir: "libs", include: ["*.jar"])
implementation 'androidx.appcompat:appcompat:1.2.0' implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'com.google.android.material:material:1.2.1' 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-fragment:2.3.0'
implementation 'androidx.navigation:navigation-ui:2.3.0' implementation 'androidx.navigation:navigation-ui:2.3.0'
testImplementation 'junit:junit:4.13' testImplementation 'junit:junit:4.13'
@ -54,5 +54,5 @@ dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation 'com.github.GrenderG:Toasty:1.4.2' 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.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" /> <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_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_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 <application
android:allowBackup="false" android:allowBackup="false"
@ -19,6 +20,7 @@
<activity <activity
android:name=".MainActivity" android:name=".MainActivity"
android:label="@string/app_name" android:label="@string/app_name"
android:configChanges="orientation|screenSize|layoutDirection"
android:theme="@style/AppTheme.NoActionBar"> android:theme="@style/AppTheme.NoActionBar">
<intent-filter> <intent-filter>
<action android:name="android.intent.action.MAIN" /> <action android:name="android.intent.action.MAIN" />

View File

@ -2,18 +2,13 @@ package app.fedilab.mobilizon;
import android.Manifest; import android.Manifest;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.annotation.TargetApi; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.pm.PackageInfo; import android.content.pm.PackageInfo;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.net.Uri; import android.net.Uri;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.text.SpannableString; import android.text.SpannableString;
import android.text.style.UnderlineSpan; import android.text.style.UnderlineSpan;
@ -22,6 +17,7 @@ import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.webkit.ValueCallback;
import android.webkit.WebView; import android.webkit.WebView;
import android.widget.EditText; import android.widget.EditText;
import android.widget.FrameLayout; import android.widget.FrameLayout;
@ -40,11 +36,15 @@ import androidx.core.view.GravityCompat;
import androidx.drawerlayout.widget.DrawerLayout; import androidx.drawerlayout.widget.DrawerLayout;
import com.google.android.material.navigation.NavigationView; 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.io.UnsupportedEncodingException;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import app.fedilab.mobilizon.client.RetrofitMobilizonAPI; import app.fedilab.mobilizon.client.RetrofitMobilizonAPI;
@ -56,35 +56,12 @@ import es.dmoral.toasty.Toasty;
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener { 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; 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 RelativeLayout progress;
private WebView main_webview; private WebView main_webview;
private FrameLayout webview_container; private FrameLayout webview_container;
private ValueCallback<Uri[]> mFilePathCallback;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { 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); final NavigationView navigationView = findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this); navigationView.setNavigationItemSelectedListener(this);
if (Build.VERSION.SDK_INT >= 23) {
permissionsAPI();
}
WebView.setWebContentsDebuggingEnabled(true); WebView.setWebContentsDebuggingEnabled(true);
drawMenu(); drawMenu();
@ -128,8 +102,24 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
main_webview.setWebChromeClient(mobilizonWebChromeClient); main_webview.setWebChromeClient(mobilizonWebChromeClient);
main_webview.setWebViewClient(new MobilizonWebViewClient(MainActivity.this)); main_webview.setWebViewClient(new MobilizonWebViewClient(MainActivity.this));
showProgressDialog();
main_webview.loadUrl("https://" + instance); 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 @Override
@ -244,7 +234,6 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
} }
} }
@Override @Override
public void onBackPressed() { public void onBackPressed() {
if (main_webview.canGoBack()) { if (main_webview.canGoBack()) {
@ -258,15 +247,15 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
public boolean onNavigationItemSelected(@NonNull MenuItem item) { public boolean onNavigationItemSelected(@NonNull MenuItem item) {
int id = item.getItemId(); int id = item.getItemId();
if (id == R.id.nav_explore) { 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) { } 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) { } 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) { } 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) { } 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) { } else if (id == R.id.nav_logout) {
Helper.clearCookies(); Helper.clearCookies();
new java.util.Timer().schedule( new java.util.Timer().schedule(
@ -283,9 +272,9 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
1000 1000
); );
} else if (id == R.id.nav_profile) { } 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) { } 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); DrawerLayout drawer = findViewById(R.id.drawer_layout);
@ -310,7 +299,7 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
(dialog, which) -> new Thread(() -> { (dialog, which) -> new Thread(() -> {
try { try {
String newInstance = input.getText().toString().trim(); 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) { if (instanceNodeInfo.getSoftware() != null && instanceNodeInfo.getSoftware().getName().trim().toLowerCase().compareTo("mobilizon") == 0) {
SharedPreferences.Editor editor = sharedpreferences.edit(); SharedPreferences.Editor editor = sharedpreferences.edit();
editor.putString(Helper.PREF_INSTANCE, newInstance); editor.putString(Helper.PREF_INSTANCE, newInstance);
@ -338,57 +327,31 @@ public class MainActivity extends AppCompatActivity implements NavigationView.On
alert.show(); alert.show();
} }
@TargetApi(Build.VERSION_CODES.M) public ValueCallback<Uri[]> getmFilePathCallback() {
private void permissionsAPI() { return mFilePathCallback;
List<String> permissionsNeeded = new ArrayList<>(); }
final List<String> permissionsList = new ArrayList<>(); public void setmFilePathCallback(ValueCallback<Uri[]> mFilePathCallback) {
if (!addPermission(permissionsList)) this.mFilePathCallback = mFilePathCallback;
permissionsNeeded.add(getString(R.string.show_location)); }
if (permissionsList.size() > 0) { @Override
if (permissionsNeeded.size() > 0) { public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode != INPUT_FILE_REQUEST_CODE || mFilePathCallback == null) {
// Need Rationale super.onActivityResult(requestCode, resultCode, data);
StringBuilder message = new StringBuilder(getString(R.string.access_needed, permissionsNeeded.get(0))); return;
}
for (int i = 1; i < permissionsNeeded.size(); i++) Uri[] results = null;
message.append(", ").append(permissionsNeeded.get(i)); if (resultCode == Activity.RESULT_OK) {
if (data != null) {
showMessageOKCancel(message.toString(), String dataString = data.getDataString();
(dialog, which) -> requestPermissions(permissionsList.toArray(new String[0]), if (dataString != null) {
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS)); results = new Uri[]{Uri.parse(dataString)};
return; }
} }
requestPermissions(permissionsList.toArray(new String[0]),
REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
} }
} mFilePathCallback.onReceiveValue(results);
mFilePathCallback = null;
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;
} }
public void drawMenu() { 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, * You should have received a copy of the GNU General Public License along with Mobilizon app; if not,
* see <http://www.gnu.org/licenses>. */ * see <http://www.gnu.org/licenses>. */
import android.content.Context;
import java.io.IOException; import java.io.IOException;
import java.net.URL; import java.net.URL;
import app.fedilab.mobilizon.client.entities.WellKnownNodeinfo; import app.fedilab.mobilizon.client.entities.WellKnownNodeinfo;
import app.fedilab.mobilizon.helper.Helper;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Response; import retrofit2.Response;
import retrofit2.Retrofit; import retrofit2.Retrofit;
@ -30,20 +28,9 @@ public class RetrofitMobilizonAPI {
private String finalUrl; private String finalUrl;
private Context _context;
private String instance;
public RetrofitMobilizonAPI(Context context) { public RetrofitMobilizonAPI(String instance) {
_context = context;
instance = Helper.getLiveInstance(context);
finalUrl = "https://" + Helper.getLiveInstance(context) + "/api/v1/";
}
public RetrofitMobilizonAPI(Context context, String instance) {
_context = context;
this.instance = instance;
finalUrl = "https://" + instance.toLowerCase() + "/"; finalUrl = "https://" + instance.toLowerCase() + "/";
} }

View File

@ -29,13 +29,8 @@ import java.io.InputStream;
* see <http://www.gnu.org/licenses>. */ * see <http://www.gnu.org/licenses>. */
public class Helper { public class Helper {
public static final String TAG = "mobilizon_app";
public static final String APP_PREFS = "app_prefs"; public static final String APP_PREFS = "app_prefs";
public static final String PREF_INSTANCE = "instance"; 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 * Returns the preferred instance
@ -63,7 +58,6 @@ public class Helper {
webView.getSettings().setSupportZoom(true); webView.getSettings().setSupportZoom(true);
webView.getSettings().setDisplayZoomControls(false); webView.getSettings().setDisplayZoomControls(false);
webView.getSettings().setBuiltInZoomControls(true); webView.getSettings().setBuiltInZoomControls(true);
webView.getSettings().setAllowContentAccess(true);
webView.getSettings().setLoadsImagesAutomatically(true); webView.getSettings().setLoadsImagesAutomatically(true);
webView.getSettings().setSupportMultipleWindows(false); webView.getSettings().setSupportMultipleWindows(false);
webView.getSettings().setGeolocationDatabasePath(context.getFilesDir().getPath()); webView.getSettings().setGeolocationDatabasePath(context.getFilesDir().getPath());
@ -71,6 +65,10 @@ public class Helper {
webView.getSettings().setAppCachePath(context.getCacheDir().getPath()); webView.getSettings().setAppCachePath(context.getCacheDir().getPath());
webView.getSettings().setAppCacheEnabled(true); webView.getSettings().setAppCacheEnabled(true);
webView.getSettings().setDatabaseEnabled(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().setDomStorageEnabled(true);
webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE); webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_COMPATIBILITY_MODE);
webView.getSettings().setMediaPlaybackRequiresUserGesture(true); webView.getSettings().setMediaPlaybackRequiresUserGesture(true);
@ -78,7 +76,7 @@ public class Helper {
cookieManager.setAcceptThirdPartyCookies(webView, true); cookieManager.setAcceptThirdPartyCookies(webView, true);
webView.setBackgroundColor(Color.TRANSPARENT); webView.setBackgroundColor(Color.TRANSPARENT);
webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); 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>. */ * see <http://www.gnu.org/licenses>. */
import android.app.Activity; import android.app.Activity;
import android.content.Intent;
import android.media.MediaPlayer; import android.media.MediaPlayer;
import android.net.Uri;
import android.view.SurfaceView; import android.view.SurfaceView;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.webkit.GeolocationPermissions; import android.webkit.GeolocationPermissions;
import android.webkit.ValueCallback;
import android.webkit.WebChromeClient; import android.webkit.WebChromeClient;
import android.webkit.WebView; import android.webkit.WebView;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import androidx.appcompat.app.AppCompatActivity; 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); 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 @Override
public void onShowCustomView(View view, CustomViewCallback callback) { public void onShowCustomView(View view, CustomViewCallback callback) {
if (view instanceof FrameLayout) { if (view instanceof FrameLayout) {

View File

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

View File

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