250 lines
10 KiB
Java
250 lines
10 KiB
Java
/* Copyright 2017 Thomas Schneider
|
|
*
|
|
* This file is a part of Mastalab
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it under the terms of the
|
|
* GNU General Public License as published by the Free Software Foundation; either version 3 of the
|
|
* License, or (at your option) any later version.
|
|
*
|
|
* Mastalab is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
|
|
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
|
|
* Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along with Mastalab; if not,
|
|
* see <http://www.gnu.org/licenses>. */
|
|
package fr.gouv.etalab.mastodon.activities;
|
|
|
|
|
|
import android.Manifest;
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.content.SharedPreferences;
|
|
import android.content.pm.PackageManager;
|
|
import android.net.Uri;
|
|
import android.os.AsyncTask;
|
|
import android.os.Build;
|
|
import android.os.Bundle;
|
|
import android.support.v4.app.ActivityCompat;
|
|
import android.support.v4.content.ContextCompat;
|
|
import android.view.Menu;
|
|
import android.view.MenuItem;
|
|
import android.view.View;
|
|
import android.view.ViewGroup;
|
|
import android.view.WindowManager;
|
|
import android.webkit.DownloadListener;
|
|
import android.webkit.WebView;
|
|
import android.widget.FrameLayout;
|
|
import android.widget.Toast;
|
|
|
|
import java.lang.ref.WeakReference;
|
|
import java.util.List;
|
|
|
|
import es.dmoral.toasty.Toasty;
|
|
import fr.gouv.etalab.mastodon.R;
|
|
import fr.gouv.etalab.mastodon.client.API;
|
|
import fr.gouv.etalab.mastodon.client.Entities.Results;
|
|
import fr.gouv.etalab.mastodon.helper.Helper;
|
|
import fr.gouv.etalab.mastodon.webview.MastalabWebChromeClient;
|
|
import fr.gouv.etalab.mastodon.webview.MastalabWebViewClient;
|
|
|
|
import static fr.gouv.etalab.mastodon.helper.Helper.EXTERNAL_STORAGE_REQUEST_CODE;
|
|
import static fr.gouv.etalab.mastodon.helper.Helper.THEME_LIGHT;
|
|
import static fr.gouv.etalab.mastodon.helper.Helper.manageDownloads;
|
|
|
|
|
|
/**
|
|
* Created by Thomas on 24/06/2017.
|
|
* Webview activity
|
|
*/
|
|
|
|
public class WebviewActivity extends BaseActivity {
|
|
|
|
private String url;
|
|
private String peertubeLinkToFetch;
|
|
private boolean peertubeLink;
|
|
private WebView webView;
|
|
|
|
@Override
|
|
protected void onCreate(Bundle savedInstanceState) {
|
|
super.onCreate(savedInstanceState);
|
|
SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, android.content.Context.MODE_PRIVATE);
|
|
int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK);
|
|
switch (theme){
|
|
case Helper.THEME_LIGHT:
|
|
setTheme(R.style.AppTheme);
|
|
break;
|
|
case Helper.THEME_DARK:
|
|
setTheme(R.style.AppThemeDark);
|
|
break;
|
|
case Helper.THEME_BLACK:
|
|
setTheme(R.style.AppThemeBlack);
|
|
break;
|
|
default:
|
|
setTheme(R.style.AppThemeDark);
|
|
}
|
|
|
|
setContentView(R.layout.activity_webview);
|
|
Bundle b = getIntent().getExtras();
|
|
if(b != null) {
|
|
url = b.getString("url", null);
|
|
peertubeLinkToFetch = b.getString("peertubeLinkToFetch", null);
|
|
peertubeLink = b.getBoolean("peertubeLink", false);
|
|
}
|
|
if( url == null)
|
|
finish();
|
|
if( getSupportActionBar() != null)
|
|
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
|
|
|
webView = Helper.initializeWebview(WebviewActivity.this, R.id.webview);
|
|
setTitle("");
|
|
FrameLayout webview_container = findViewById(R.id.webview_container);
|
|
final ViewGroup videoLayout = findViewById(R.id.videoLayout); // Your own view, read class comments
|
|
|
|
MastalabWebChromeClient mastalabWebChromeClient = new MastalabWebChromeClient(WebviewActivity.this, webView, webview_container, videoLayout);
|
|
mastalabWebChromeClient.setOnToggledFullscreen(new MastalabWebChromeClient.ToggledFullscreenCallback() {
|
|
@Override
|
|
public void toggledFullscreen(boolean fullscreen) {
|
|
|
|
if (fullscreen) {
|
|
videoLayout.setVisibility(View.VISIBLE);
|
|
WindowManager.LayoutParams attrs = getWindow().getAttributes();
|
|
attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN;
|
|
attrs.flags |= WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
|
|
getWindow().setAttributes(attrs);
|
|
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE);
|
|
} else {
|
|
WindowManager.LayoutParams attrs = getWindow().getAttributes();
|
|
attrs.flags &= ~WindowManager.LayoutParams.FLAG_FULLSCREEN;
|
|
attrs.flags &= ~WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
|
|
getWindow().setAttributes(attrs);
|
|
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
|
|
videoLayout.setVisibility(View.GONE);
|
|
}
|
|
}
|
|
});
|
|
webView.setWebChromeClient(mastalabWebChromeClient);
|
|
webView.setWebViewClient(new MastalabWebViewClient(WebviewActivity.this));
|
|
webView.setDownloadListener(new DownloadListener() {
|
|
@Override
|
|
public void onDownloadStart(String url, String userAgent, String contentDisposition, String mimetype, long contentLength) {
|
|
|
|
if(Build.VERSION.SDK_INT >= 23 ){
|
|
if (ContextCompat.checkSelfPermission(WebviewActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(WebviewActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
|
|
ActivityCompat.requestPermissions(WebviewActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, EXTERNAL_STORAGE_REQUEST_CODE);
|
|
} else {
|
|
manageDownloads(WebviewActivity.this, url);
|
|
}
|
|
}else{
|
|
manageDownloads(WebviewActivity.this, url);
|
|
}
|
|
}
|
|
});
|
|
if( !url.startsWith("http://") && !url.startsWith("https://"))
|
|
url = "http://" + url;
|
|
webView.loadUrl(url);
|
|
}
|
|
|
|
@Override
|
|
public boolean onCreateOptionsMenu(Menu menu) {
|
|
getMenuInflater().inflate(R.menu.main_webview, menu);
|
|
if( peertubeLink ){
|
|
menu.findItem(R.id.action_go).setVisible(false);
|
|
menu.findItem(R.id.action_comment).setVisible(true);
|
|
}
|
|
SharedPreferences sharedpreferences = getSharedPreferences(Helper.APP_PREFS, android.content.Context.MODE_PRIVATE);
|
|
int theme = sharedpreferences.getInt(Helper.SET_THEME, Helper.THEME_DARK);
|
|
if( theme == THEME_LIGHT)
|
|
Helper.colorizeIconMenu(menu, R.color.black);
|
|
return true;
|
|
}
|
|
@Override
|
|
public boolean onOptionsItemSelected(MenuItem item) {
|
|
switch (item.getItemId()) {
|
|
case android.R.id.home:
|
|
finish();
|
|
return true;
|
|
case R.id.action_go:
|
|
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
|
|
try {
|
|
startActivity(browserIntent);
|
|
}catch (Exception e){
|
|
Toasty.error(WebviewActivity.this,getString(R.string.toast_error),Toast.LENGTH_LONG).show();
|
|
}
|
|
return true;
|
|
case R.id.action_comment:
|
|
Toasty.info(WebviewActivity.this, getString(R.string.retrieve_remote_status), Toast.LENGTH_LONG).show();
|
|
new AsyncTask<Void, Void, Void>() {
|
|
|
|
private List<fr.gouv.etalab.mastodon.client.Entities.Status> remoteStatuses;
|
|
private WeakReference<Context> contextReference = new WeakReference<>(WebviewActivity.this);
|
|
|
|
@Override
|
|
protected Void doInBackground(Void... voids) {
|
|
|
|
if(url != null) {
|
|
Results search = new API(contextReference.get()).search(peertubeLinkToFetch);
|
|
if (search != null) {
|
|
remoteStatuses = search.getStatuses();
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
@Override
|
|
protected void onPostExecute(Void result) {
|
|
Intent intent = new Intent(contextReference.get(), TootActivity.class);
|
|
Bundle b = new Bundle();
|
|
if( remoteStatuses == null || remoteStatuses.size() == 0){
|
|
Toasty.error(contextReference.get(),getString(R.string.toast_error),Toast.LENGTH_LONG).show();
|
|
return;
|
|
}
|
|
if( remoteStatuses.get(0).getReblog() != null ) {
|
|
b.putParcelable("tootReply", remoteStatuses.get(0).getReblog());
|
|
}else {
|
|
b.putParcelable("tootReply", remoteStatuses.get(0));
|
|
}
|
|
intent.putExtras(b); //Put your id to your next Intent
|
|
contextReference.get().startActivity(intent);
|
|
}
|
|
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR );
|
|
return true;
|
|
default:
|
|
return super.onOptionsItemSelected(item);
|
|
}
|
|
}
|
|
|
|
public void setUrl(String newUrl){
|
|
this.url = newUrl;
|
|
}
|
|
|
|
@Override
|
|
public void onPause(){
|
|
super.onPause();
|
|
if( webView != null)
|
|
webView.onPause();
|
|
}
|
|
|
|
@Override
|
|
public void onResume(){
|
|
super.onResume();
|
|
if( webView != null)
|
|
webView.onResume();
|
|
}
|
|
|
|
@Override
|
|
public void onBackPressed() {
|
|
if (webView.canGoBack()){
|
|
webView.goBack();
|
|
} else {
|
|
super.onBackPressed();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onDestroy(){
|
|
super.onDestroy();
|
|
if( webView != null)
|
|
webView.destroy();
|
|
}
|
|
}
|