245 lines
9.5 KiB
Java
245 lines
9.5 KiB
Java
package app.fedilab.mobilizon;
|
|
|
|
import android.Manifest;
|
|
import android.annotation.SuppressLint;
|
|
import android.annotation.TargetApi;
|
|
import android.content.Context;
|
|
import android.content.DialogInterface;
|
|
import android.content.SharedPreferences;
|
|
import android.content.pm.PackageManager;
|
|
import android.location.Location;
|
|
import android.location.LocationListener;
|
|
import android.location.LocationManager;
|
|
import android.os.Build;
|
|
import android.os.Bundle;
|
|
|
|
import androidx.annotation.NonNull;
|
|
import androidx.appcompat.app.AlertDialog;
|
|
import androidx.appcompat.app.AppCompatActivity;
|
|
import androidx.appcompat.widget.Toolbar;
|
|
|
|
import android.view.Menu;
|
|
import android.view.MenuItem;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.webkit.WebView;
|
|
import android.widget.EditText;
|
|
import android.widget.FrameLayout;
|
|
import android.widget.LinearLayout;
|
|
import android.widget.ProgressBar;
|
|
import android.widget.Toast;
|
|
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
import app.fedilab.mobilizon.client.RetrofitMobilizonAPI;
|
|
import app.fedilab.mobilizon.client.entities.WellKnownNodeinfo;
|
|
import app.fedilab.mobilizon.helper.Helper;
|
|
import app.fedilab.mobilizon.webview.MobilizonWebChromeClient;
|
|
import app.fedilab.mobilizon.webview.MobilizonWebViewClient;
|
|
import es.dmoral.toasty.Toasty;
|
|
|
|
public class MainActivity extends AppCompatActivity {
|
|
|
|
private ProgressBar progressBar;
|
|
private WebView main_webview;
|
|
final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124;
|
|
public static int PICK_INSTANCE = 5641;
|
|
|
|
@Override
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
super.onCreate(savedInstanceState);
|
|
setContentView(R.layout.activity_main);
|
|
Toolbar toolbar = findViewById(R.id.toolbar);
|
|
setSupportActionBar(toolbar);
|
|
|
|
if (Build.VERSION.SDK_INT >= 23) {
|
|
permissionsAPI();
|
|
}
|
|
|
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
|
WebView.setWebContentsDebuggingEnabled(true);
|
|
}
|
|
|
|
main_webview = findViewById(R.id.main_webview);
|
|
|
|
progressBar = findViewById(R.id.progressBar);
|
|
FrameLayout webview_container = findViewById(R.id.webview_container);
|
|
final ViewGroup videoLayout = findViewById(R.id.videoLayout);
|
|
String instance = Helper.getLiveInstance(MainActivity.this);
|
|
Helper.initializeWebview(MainActivity.this, main_webview);
|
|
MobilizonWebChromeClient mobilizonWebChromeClient = new MobilizonWebChromeClient(MainActivity.this, main_webview, webview_container, videoLayout);
|
|
main_webview.setWebChromeClient(mobilizonWebChromeClient);
|
|
main_webview.setWebViewClient(new MobilizonWebViewClient(MainActivity.this));
|
|
|
|
main_webview.loadUrl("https://"+instance);
|
|
|
|
}
|
|
|
|
@Override
|
|
public boolean onCreateOptionsMenu(Menu menu) {
|
|
// Inflate the menu; this adds items to the action bar if it is present.
|
|
getMenuInflater().inflate(R.menu.menu_main, menu);
|
|
return true;
|
|
}
|
|
|
|
@Override
|
|
public boolean onOptionsItemSelected(MenuItem item) {
|
|
// Handle action bar item clicks here. The action bar will
|
|
// automatically handle clicks on the Home/Up button, so long
|
|
// as you specify a parent activity in AndroidManifest.xml.
|
|
int id = item.getItemId();
|
|
|
|
//noinspection SimplifiableIfStatement
|
|
if (id == R.id.action_instance) {
|
|
showRadioButtonDialogFullInstances();
|
|
return true;
|
|
}
|
|
|
|
return super.onOptionsItemSelected(item);
|
|
}
|
|
|
|
|
|
public void showProgressDialog(){
|
|
if( progressBar != null){
|
|
progressBar.setVisibility(View.VISIBLE);
|
|
}
|
|
}
|
|
public void hideProgressDialog(){
|
|
if( progressBar != null){
|
|
progressBar.setVisibility(View.GONE);
|
|
}
|
|
}
|
|
|
|
public void setProgressDialog(int progress){
|
|
if( progressBar != null){
|
|
progressBar.setProgress(progress);
|
|
}
|
|
}
|
|
|
|
|
|
@SuppressLint("ApplySharedPref")
|
|
private void showRadioButtonDialogFullInstances() {
|
|
final SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, Context.MODE_PRIVATE);
|
|
AlertDialog.Builder alt_bld = new AlertDialog.Builder(this);
|
|
alt_bld.setTitle(R.string.instance_choice);
|
|
String instance = Helper.getLiveInstance(MainActivity.this);
|
|
final EditText input = new EditText(MainActivity.this);
|
|
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
|
|
LinearLayout.LayoutParams.MATCH_PARENT,
|
|
LinearLayout.LayoutParams.MATCH_PARENT);
|
|
input.setLayoutParams(lp);
|
|
alt_bld.setView(input);
|
|
input.setText(instance);
|
|
alt_bld.setPositiveButton(R.string.validate,
|
|
(dialog, which) -> new Thread(() -> {
|
|
try {
|
|
String newInstance = input.getText().toString().trim();
|
|
WellKnownNodeinfo.NodeInfo instanceNodeInfo = new RetrofitMobilizonAPI(MainActivity.this, 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);
|
|
editor.commit();
|
|
runOnUiThread(() -> {
|
|
dialog.dismiss();
|
|
main_webview.loadUrl("https://"+instance);
|
|
});
|
|
} else {
|
|
runOnUiThread(() -> Toasty.error(MainActivity.this, getString(R.string.not_valide_instance), Toast.LENGTH_LONG).show());
|
|
}
|
|
} catch (Exception e) {
|
|
runOnUiThread(() -> Toasty.error(MainActivity.this, getString(R.string.not_valide_instance), Toast.LENGTH_LONG).show());
|
|
e.printStackTrace();
|
|
}
|
|
|
|
}).start());
|
|
//TODO: uncomment and add support for picking instances when available
|
|
/*alt_bld.setNegativeButton(R.string.cancel, (dialog, which) -> dialog.dismiss());
|
|
alt_bld.setNeutralButton(R.string.help, (dialog, which) -> {
|
|
startActivityForResult(intent, PICK_INSTANCE);
|
|
});*/
|
|
AlertDialog alert = alt_bld.create();
|
|
alert.show();
|
|
}
|
|
|
|
|
|
|
|
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) {
|
|
|
|
}
|
|
};
|
|
|
|
@TargetApi(Build.VERSION_CODES.M)
|
|
private void permissionsAPI() {
|
|
List<String> permissionsNeeded = new ArrayList<>();
|
|
|
|
final List<String> permissionsList = new ArrayList<>();
|
|
if (!addPermission(permissionsList))
|
|
permissionsNeeded.add(getString(R.string.show_location));
|
|
|
|
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;
|
|
}
|
|
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;
|
|
}
|
|
|
|
} |