Simplify the process to retrieve remote picture and content (Mastalab logic).
This commit is contained in:
parent
21a86957de
commit
831eed8799
|
@ -17,11 +17,14 @@ package fr.gouv.etalab.mastodon.activities;
|
||||||
import android.Manifest;
|
import android.Manifest;
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
|
import android.content.BroadcastReceiver;
|
||||||
|
import android.content.IntentFilter;
|
||||||
import android.content.pm.PackageManager;
|
import android.content.pm.PackageManager;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.v4.app.ActivityCompat;
|
import android.support.v4.app.ActivityCompat;
|
||||||
import android.support.v4.content.ContextCompat;
|
import android.support.v4.content.ContextCompat;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
|
import android.support.v4.content.LocalBroadcastManager;
|
||||||
import android.support.v7.app.AlertDialog;
|
import android.support.v7.app.AlertDialog;
|
||||||
import android.content.ActivityNotFoundException;
|
import android.content.ActivityNotFoundException;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
@ -40,7 +43,6 @@ import android.support.v7.app.ActionBar;
|
||||||
import android.support.v7.app.AppCompatActivity;
|
import android.support.v7.app.AppCompatActivity;
|
||||||
import android.text.Editable;
|
import android.text.Editable;
|
||||||
import android.text.Html;
|
import android.text.Html;
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.text.TextWatcher;
|
import android.text.TextWatcher;
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.Menu;
|
import android.view.Menu;
|
||||||
|
@ -50,6 +52,7 @@ import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.view.ViewTreeObserver;
|
import android.view.ViewTreeObserver;
|
||||||
import android.view.inputmethod.InputMethodManager;
|
import android.view.inputmethod.InputMethodManager;
|
||||||
|
import android.webkit.URLUtil;
|
||||||
import android.widget.AdapterView;
|
import android.widget.AdapterView;
|
||||||
import android.widget.ArrayAdapter;
|
import android.widget.ArrayAdapter;
|
||||||
import android.widget.AutoCompleteTextView;
|
import android.widget.AutoCompleteTextView;
|
||||||
|
@ -108,7 +111,6 @@ import fr.gouv.etalab.mastodon.client.PatchBaseImageDownloader;
|
||||||
import fr.gouv.etalab.mastodon.drawers.AccountsSearchAdapter;
|
import fr.gouv.etalab.mastodon.drawers.AccountsSearchAdapter;
|
||||||
import fr.gouv.etalab.mastodon.drawers.DraftsListAdapter;
|
import fr.gouv.etalab.mastodon.drawers.DraftsListAdapter;
|
||||||
import fr.gouv.etalab.mastodon.helper.Helper;
|
import fr.gouv.etalab.mastodon.helper.Helper;
|
||||||
import fr.gouv.etalab.mastodon.helper.ParserUtils;
|
|
||||||
import fr.gouv.etalab.mastodon.interfaces.OnPostStatusActionInterface;
|
import fr.gouv.etalab.mastodon.interfaces.OnPostStatusActionInterface;
|
||||||
import fr.gouv.etalab.mastodon.interfaces.OnRetrieveAttachmentInterface;
|
import fr.gouv.etalab.mastodon.interfaces.OnRetrieveAttachmentInterface;
|
||||||
import fr.gouv.etalab.mastodon.interfaces.OnRetrieveSearcAccountshInterface;
|
import fr.gouv.etalab.mastodon.interfaces.OnRetrieveSearcAccountshInterface;
|
||||||
|
@ -118,7 +120,6 @@ import fr.gouv.etalab.mastodon.sqlite.Sqlite;
|
||||||
import fr.gouv.etalab.mastodon.sqlite.StatusStoredDAO;
|
import fr.gouv.etalab.mastodon.sqlite.StatusStoredDAO;
|
||||||
import mastodon.etalab.gouv.fr.mastodon.R;
|
import mastodon.etalab.gouv.fr.mastodon.R;
|
||||||
|
|
||||||
import static fr.gouv.etalab.mastodon.helper.Helper.EXTERNAL_STORAGE_REQUEST_CODE;
|
|
||||||
import static fr.gouv.etalab.mastodon.helper.Helper.HOME_TIMELINE_INTENT;
|
import static fr.gouv.etalab.mastodon.helper.Helper.HOME_TIMELINE_INTENT;
|
||||||
import static fr.gouv.etalab.mastodon.helper.Helper.INTENT_ACTION;
|
import static fr.gouv.etalab.mastodon.helper.Helper.INTENT_ACTION;
|
||||||
import static fr.gouv.etalab.mastodon.helper.Helper.changeDrawableColor;
|
import static fr.gouv.etalab.mastodon.helper.Helper.changeDrawableColor;
|
||||||
|
@ -128,7 +129,7 @@ import static fr.gouv.etalab.mastodon.helper.Helper.changeDrawableColor;
|
||||||
* Toot activity class
|
* Toot activity class
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAccountshInterface, OnRetrieveAttachmentInterface, OnPostStatusActionInterface, ParserUtils.ParserListener {
|
public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAccountshInterface, OnRetrieveAttachmentInterface, OnPostStatusActionInterface {
|
||||||
|
|
||||||
|
|
||||||
private String visibility;
|
private String visibility;
|
||||||
|
@ -146,7 +147,7 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc
|
||||||
private EditText toot_cw_content;
|
private EditText toot_cw_content;
|
||||||
private LinearLayout toot_reply_content_container;
|
private LinearLayout toot_reply_content_container;
|
||||||
private Status tootReply = null;
|
private Status tootReply = null;
|
||||||
private String sharedContent, sharedSubject, sharedStream;
|
private String sharedContent, sharedSubject;
|
||||||
private CheckBox toot_sensitive;
|
private CheckBox toot_sensitive;
|
||||||
public long currentToId;
|
public long currentToId;
|
||||||
private long restored;
|
private long restored;
|
||||||
|
@ -159,6 +160,7 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc
|
||||||
private int currentCursorPosition, searchLength;
|
private int currentCursorPosition, searchLength;
|
||||||
private TextView toot_space_left;
|
private TextView toot_space_left;
|
||||||
private final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 754;
|
private final int MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE = 754;
|
||||||
|
private BroadcastReceiver receive_picture;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
|
@ -251,7 +253,6 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc
|
||||||
tootReply = b.getParcelable("tootReply");
|
tootReply = b.getParcelable("tootReply");
|
||||||
sharedContent = b.getString("sharedContent", null);
|
sharedContent = b.getString("sharedContent", null);
|
||||||
sharedSubject = b.getString("sharedSubject", null);
|
sharedSubject = b.getString("sharedSubject", null);
|
||||||
sharedStream = b.getString("sharedStream", null);
|
|
||||||
// ACTION_SEND route
|
// ACTION_SEND route
|
||||||
if (b.getInt("uriNumber", 0) == 1) {
|
if (b.getInt("uriNumber", 0) == 1) {
|
||||||
|
|
||||||
|
@ -311,30 +312,28 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc
|
||||||
|
|
||||||
if( sharedContent != null ){ //Shared content
|
if( sharedContent != null ){ //Shared content
|
||||||
|
|
||||||
// ParserUtils is a class I borrowed from Tusky.
|
|
||||||
final ParserUtils parser = new ParserUtils(this);
|
|
||||||
|
|
||||||
parser.putInClipboardManager(TootActivity.this, sharedContent);
|
|
||||||
String urlString = parser.getPastedURLText(TootActivity.this);
|
|
||||||
|
|
||||||
if( sharedSubject != null){
|
if( sharedSubject != null){
|
||||||
sharedContent = sharedSubject + "\n\n" + sharedContent;
|
sharedContent = sharedSubject + "\n\n" + sharedContent;
|
||||||
}
|
}
|
||||||
if( sharedStream != null){
|
receive_picture = new BroadcastReceiver() {
|
||||||
|
@Override
|
||||||
|
public void onReceive(Context context, Intent intent) {
|
||||||
|
final String url = intent.getStringExtra("pictureURL");
|
||||||
|
if( url != null){
|
||||||
AsyncHttpClient client = new AsyncHttpClient();
|
AsyncHttpClient client = new AsyncHttpClient();
|
||||||
String[] allowedTypes = new String[] { "image/png" };
|
String[] allowedTypes = new String[] { "image/png","image/jpeg" };
|
||||||
client.get(url, new BinaryHttpResponseHandler(allowedTypes) {
|
client.get(url, new BinaryHttpResponseHandler(allowedTypes) {
|
||||||
@Override
|
@Override
|
||||||
public void onSuccess(int statusCode, Header[] headers, byte[] binaryData) {
|
public void onSuccess(int statusCode, Header[] headers, byte[] binaryData) {
|
||||||
OutputStream f;
|
OutputStream f;
|
||||||
try {
|
try {
|
||||||
f = new FileOutputStream(getCacheDir());
|
f = new FileOutputStream(getCacheDir() + URLUtil.guessFileName(url, null, null));
|
||||||
picture_scrollview.setVisibility(View.VISIBLE);
|
picture_scrollview.setVisibility(View.VISIBLE);
|
||||||
ByteArrayInputStream bis = new ByteArrayInputStream(binaryData);
|
InputStream bis = new ByteArrayInputStream(binaryData);
|
||||||
loading_picture.setVisibility(View.VISIBLE);
|
loading_picture.setVisibility(View.VISIBLE);
|
||||||
toot_picture.setEnabled(false);
|
toot_picture.setEnabled(false);
|
||||||
new UploadActionAsyncTask(getApplicationContext(),bis,TootActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
new UploadActionAsyncTask(getApplicationContext(),bis,TootActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||||
f.write(binaryData); //your bytes
|
f.write(binaryData);
|
||||||
f.close();
|
f.close();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
@ -343,11 +342,15 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFailure(int statusCode, Header[] headers, byte[] binaryData, Throwable error) {
|
public void onFailure(int statusCode, Header[] headers, byte[] binaryData, Throwable error) {
|
||||||
|
error.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
LocalBroadcastManager.getInstance(this).registerReceiver(receive_picture, new IntentFilter(Helper.RECEIVE_PICTURE));
|
||||||
toot_content.setText( String.format("\n%s", sharedContent));
|
toot_content.setText( String.format("\n%s", sharedContent));
|
||||||
}
|
}
|
||||||
attachments = new ArrayList<>();
|
attachments = new ArrayList<>();
|
||||||
|
@ -572,6 +575,14 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDestroy(){
|
||||||
|
super.onDestroy();
|
||||||
|
if( receive_picture != null)
|
||||||
|
LocalBroadcastManager.getInstance(this).unregisterReceiver(receive_picture);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onRequestPermissionsResult(int requestCode,
|
public void onRequestPermissionsResult(int requestCode,
|
||||||
@NonNull String permissions[], @NonNull int[] grantResults) {
|
@NonNull String permissions[], @NonNull int[] grantResults) {
|
||||||
|
@ -595,15 +606,6 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc
|
||||||
mToast.show();
|
mToast.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: This overload takes care of the single URL coming from a text share.
|
|
||||||
public void uploadSharedImage(Uri image)
|
|
||||||
{
|
|
||||||
if (image != null) {
|
|
||||||
ArrayList<Uri> uri = new ArrayList<>();
|
|
||||||
uri.add(image);
|
|
||||||
uploadSharedImage(uri);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Handles uploading shared images
|
// Handles uploading shared images
|
||||||
public void uploadSharedImage(ArrayList<Uri> uri)
|
public void uploadSharedImage(ArrayList<Uri> uri)
|
||||||
|
@ -1373,28 +1375,4 @@ public class TootActivity extends AppCompatActivity implements OnRetrieveSearcAc
|
||||||
changeDrawableColor(TootActivity.this, R.drawable.ic_check, R.color.white);
|
changeDrawableColor(TootActivity.this, R.drawable.ic_check, R.color.white);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: These two methods are part of the interface for ParserUtils
|
|
||||||
/*
|
|
||||||
These two methods are added to handle the grafted on code from Tusky,
|
|
||||||
they are part of its interface.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public void onReceiveHeaderInfo(ParserUtils.HeaderInfo headerInfo) {
|
|
||||||
if (!TextUtils.isEmpty(headerInfo.title)) {
|
|
||||||
Toast.makeText(getApplicationContext(), headerInfo.title, Toast.LENGTH_SHORT).show();
|
|
||||||
|
|
||||||
if (!TextUtils.isEmpty(headerInfo.image)) {
|
|
||||||
Toast.makeText(getApplicationContext(), "We have an image", Toast.LENGTH_SHORT).show();
|
|
||||||
|
|
||||||
Toast.makeText(getApplicationContext(), headerInfo.image, Toast.LENGTH_SHORT).show();
|
|
||||||
uploadSharedImage(Uri.parse(headerInfo.image));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onErrorHeaderInfo() {
|
|
||||||
Toast.makeText(this.getApplicationContext(), "An error has occurred.", Toast.LENGTH_SHORT).show();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,69 @@
|
||||||
|
/* 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.asynctasks;
|
||||||
|
|
||||||
|
import android.os.AsyncTask;
|
||||||
|
|
||||||
|
import org.jsoup.Jsoup;
|
||||||
|
import org.jsoup.nodes.Document;
|
||||||
|
import org.jsoup.select.Elements;
|
||||||
|
import java.io.IOException;
|
||||||
|
import fr.gouv.etalab.mastodon.interfaces.OnRetrieveMetaDataInterface;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Thomas on 02/09/2017.
|
||||||
|
* Retrieves metadata of a remote page
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class RetrieveMetaDataAsyncTask extends AsyncTask<Void, Void, Void> {
|
||||||
|
|
||||||
|
private OnRetrieveMetaDataInterface listener;
|
||||||
|
private String url;
|
||||||
|
private boolean error = false;
|
||||||
|
private String imageUrl, content;
|
||||||
|
|
||||||
|
public RetrieveMetaDataAsyncTask(String url, OnRetrieveMetaDataInterface onRetrieveRemoteAccountInterface){
|
||||||
|
this.url = url;
|
||||||
|
this.listener = onRetrieveRemoteAccountInterface;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Void doInBackground(Void... params) {
|
||||||
|
String userAgent = "Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36";
|
||||||
|
try {
|
||||||
|
Document document = Jsoup.connect(url).userAgent(userAgent).get();
|
||||||
|
Elements metaOgTitle = document.select("meta[property=og:title]");
|
||||||
|
if (metaOgTitle != null) {
|
||||||
|
content = metaOgTitle.attr("content");
|
||||||
|
} else {
|
||||||
|
content = document.title();
|
||||||
|
}
|
||||||
|
Elements metaOgImage = document.select("meta[property=og:image]");
|
||||||
|
if (metaOgImage != null) {
|
||||||
|
imageUrl = metaOgImage.attr("content");
|
||||||
|
}
|
||||||
|
} catch (IOException | IndexOutOfBoundsException e) {
|
||||||
|
error = true;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(Void result) {
|
||||||
|
listener.onRetrieveRemoteAccount(error, imageUrl, content);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -253,7 +253,7 @@ public class Helper {
|
||||||
public static final String SEARCH_VALIDATE_ACCOUNT = "search_validate_account";
|
public static final String SEARCH_VALIDATE_ACCOUNT = "search_validate_account";
|
||||||
public static final String HEADER_ACCOUNT = "header_account";
|
public static final String HEADER_ACCOUNT = "header_account";
|
||||||
public static final String RECEIVE_DATA = "receive_data";
|
public static final String RECEIVE_DATA = "receive_data";
|
||||||
|
public static final String RECEIVE_PICTURE = "receive_picture";
|
||||||
//User agent
|
//User agent
|
||||||
public static final String USER_AGENT = "Mastalab/"+ BuildConfig.VERSION_NAME + " Android/"+ Build.VERSION.RELEASE;
|
public static final String USER_AGENT = "Mastalab/"+ BuildConfig.VERSION_NAME + " Android/"+ Build.VERSION.RELEASE;
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
package fr.gouv.etalab.mastodon.helper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Thomas on 02/09/2017.
|
||||||
|
*/
|
||||||
|
|
||||||
|
public class ManageHeader {
|
||||||
|
|
||||||
|
}
|
|
@ -1,141 +0,0 @@
|
||||||
package fr.gouv.etalab.mastodon.helper;
|
|
||||||
|
|
||||||
import android.content.ClipData;
|
|
||||||
import android.content.ClipboardManager;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.os.AsyncTask;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.util.Patterns;
|
|
||||||
import android.webkit.URLUtil;
|
|
||||||
|
|
||||||
import org.jsoup.Connection;
|
|
||||||
import org.jsoup.Jsoup;
|
|
||||||
import org.jsoup.helper.HttpConnection;
|
|
||||||
import org.jsoup.nodes.Document;
|
|
||||||
import org.jsoup.select.Elements;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
|
|
||||||
|
|
||||||
// TODO: Borrowed wholesale from Tusky
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Inspect and get the information from a URL.
|
|
||||||
*/
|
|
||||||
public class ParserUtils {
|
|
||||||
public final static String carriageReturn = System.getProperty("line.separator");
|
|
||||||
final private static String QUOTE = "\"";
|
|
||||||
|
|
||||||
private static final String TAG = "ParserUtils";
|
|
||||||
private ParserListener parserListener;
|
|
||||||
|
|
||||||
public ParserUtils(ParserListener parserListener) {
|
|
||||||
this.parserListener = parserListener;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TootActivity : EditText inside the onTextChanged
|
|
||||||
public String getPastedURLText(Context context) {
|
|
||||||
ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
|
|
||||||
String pasteData;
|
|
||||||
if (clipboard.hasPrimaryClip()) {
|
|
||||||
// get what is in the clipboard
|
|
||||||
ClipData.Item item = clipboard.getPrimaryClip().getItemAt(0);
|
|
||||||
pasteData = item.getText().toString();
|
|
||||||
|
|
||||||
// If we share with an app, it's not only an url
|
|
||||||
List<String> strings = extractUrl(pasteData);
|
|
||||||
if (strings.size() > 0) {
|
|
||||||
String url = strings.get(0); // we assume that the first url is the good one
|
|
||||||
if (URLUtil.isValidUrl(url)) {
|
|
||||||
new ThreadHeaderInfo().execute(url);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void putInClipboardManager(Context context, String string) {
|
|
||||||
ClipboardManager clipboard = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE);
|
|
||||||
ClipData clip = ClipData.newPlainText("", string);
|
|
||||||
clipboard.setPrimaryClip(clip);
|
|
||||||
}
|
|
||||||
|
|
||||||
/** parse the HTML page */
|
|
||||||
private HeaderInfo parsePageHeaderInfo(String urlStr) throws Exception {
|
|
||||||
Connection con = Jsoup.connect(urlStr);
|
|
||||||
HeaderInfo headerInfo = new HeaderInfo();
|
|
||||||
con.userAgent(HttpConnection.DEFAULT_UA);
|
|
||||||
Document doc = con.get();
|
|
||||||
|
|
||||||
// get info
|
|
||||||
String text;
|
|
||||||
Elements metaOgTitle = doc.select("meta[property=og:title]");
|
|
||||||
if (metaOgTitle != null) {
|
|
||||||
text = metaOgTitle.attr("content");
|
|
||||||
} else {
|
|
||||||
text = doc.title();
|
|
||||||
}
|
|
||||||
|
|
||||||
String imageUrl = null;
|
|
||||||
Elements metaOgImage = doc.select("meta[property=og:image]");
|
|
||||||
if (metaOgImage != null) {
|
|
||||||
imageUrl = metaOgImage.attr("content");
|
|
||||||
}
|
|
||||||
|
|
||||||
// set info
|
|
||||||
headerInfo.baseUrl = urlStr;
|
|
||||||
if (!TextUtils.isEmpty(text)) {
|
|
||||||
headerInfo.title = QUOTE + text + QUOTE;
|
|
||||||
}
|
|
||||||
if (!TextUtils.isEmpty(imageUrl)) {
|
|
||||||
headerInfo.image = (imageUrl);
|
|
||||||
}
|
|
||||||
return headerInfo;
|
|
||||||
}
|
|
||||||
|
|
||||||
public interface ParserListener {
|
|
||||||
void onReceiveHeaderInfo(HeaderInfo headerInfo);
|
|
||||||
|
|
||||||
void onErrorHeaderInfo();
|
|
||||||
}
|
|
||||||
|
|
||||||
public class HeaderInfo {
|
|
||||||
public String baseUrl;
|
|
||||||
public String title;
|
|
||||||
public String image;
|
|
||||||
}
|
|
||||||
|
|
||||||
private class ThreadHeaderInfo extends AsyncTask<String, Void, HeaderInfo> {
|
|
||||||
protected HeaderInfo doInBackground(String... urls) {
|
|
||||||
try {
|
|
||||||
String url = urls[0];
|
|
||||||
return parsePageHeaderInfo(url);
|
|
||||||
} catch (Exception e) {
|
|
||||||
Log.e(TAG, "ThreadHeaderInfo#parsePageHeaderInfo() failed." + e.getMessage());
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected void onPostExecute(HeaderInfo headerInfo) {
|
|
||||||
if (headerInfo != null) {
|
|
||||||
Log.i(TAG, "ThreadHeaderInfo#parsePageHeaderInfo() success." + headerInfo.title + " " + headerInfo.image);
|
|
||||||
parserListener.onReceiveHeaderInfo(headerInfo);
|
|
||||||
} else {
|
|
||||||
parserListener.onErrorHeaderInfo();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static List<String> extractUrl(String text) {
|
|
||||||
List<String> links = new ArrayList<>();
|
|
||||||
Matcher m = Patterns.WEB_URL.matcher(text);
|
|
||||||
while (m.find()) {
|
|
||||||
String url = m.group();
|
|
||||||
links.add(url);
|
|
||||||
}
|
|
||||||
return links;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
/* 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.interfaces;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Thomas on 02/09/2017.
|
||||||
|
* Interface for retrieving meta data
|
||||||
|
*/
|
||||||
|
public interface OnRetrieveMetaDataInterface {
|
||||||
|
void onRetrieveRemoteAccount(boolean error, String pictureUrl, String content);
|
||||||
|
}
|
|
@ -26,7 +26,6 @@ import android.graphics.PorterDuff;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.os.AsyncTask;
|
import android.os.AsyncTask;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Parcelable;
|
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.design.widget.FloatingActionButton;
|
import android.support.design.widget.FloatingActionButton;
|
||||||
import android.support.design.widget.TabLayout;
|
import android.support.design.widget.TabLayout;
|
||||||
|
@ -38,7 +37,6 @@ import android.support.v4.view.ViewPager;
|
||||||
import android.support.v7.app.AlertDialog;
|
import android.support.v7.app.AlertDialog;
|
||||||
import android.support.v7.widget.SearchView;
|
import android.support.v7.widget.SearchView;
|
||||||
import android.support.v7.widget.SwitchCompat;
|
import android.support.v7.widget.SwitchCompat;
|
||||||
import android.util.Log;
|
|
||||||
import android.view.LayoutInflater;
|
import android.view.LayoutInflater;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.support.design.widget.NavigationView;
|
import android.support.design.widget.NavigationView;
|
||||||
|
@ -71,6 +69,7 @@ import java.util.HashMap;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Stack;
|
import java.util.Stack;
|
||||||
|
|
||||||
|
import fr.gouv.etalab.mastodon.asynctasks.RetrieveMetaDataAsyncTask;
|
||||||
import fr.gouv.etalab.mastodon.asynctasks.UpdateAccountInfoByIDAsyncTask;
|
import fr.gouv.etalab.mastodon.asynctasks.UpdateAccountInfoByIDAsyncTask;
|
||||||
import fr.gouv.etalab.mastodon.client.Entities.Account;
|
import fr.gouv.etalab.mastodon.client.Entities.Account;
|
||||||
import fr.gouv.etalab.mastodon.client.Entities.Notification;
|
import fr.gouv.etalab.mastodon.client.Entities.Notification;
|
||||||
|
@ -81,6 +80,7 @@ import fr.gouv.etalab.mastodon.fragments.DisplayFollowRequestSentFragment;
|
||||||
import fr.gouv.etalab.mastodon.fragments.DisplayNotificationsFragment;
|
import fr.gouv.etalab.mastodon.fragments.DisplayNotificationsFragment;
|
||||||
import fr.gouv.etalab.mastodon.fragments.DisplayScheduledTootsFragment;
|
import fr.gouv.etalab.mastodon.fragments.DisplayScheduledTootsFragment;
|
||||||
import fr.gouv.etalab.mastodon.helper.Helper;
|
import fr.gouv.etalab.mastodon.helper.Helper;
|
||||||
|
import fr.gouv.etalab.mastodon.interfaces.OnRetrieveMetaDataInterface;
|
||||||
import fr.gouv.etalab.mastodon.interfaces.OnUpdateAccountInfoInterface;
|
import fr.gouv.etalab.mastodon.interfaces.OnUpdateAccountInfoInterface;
|
||||||
import fr.gouv.etalab.mastodon.services.StreamingService;
|
import fr.gouv.etalab.mastodon.services.StreamingService;
|
||||||
import fr.gouv.etalab.mastodon.sqlite.Sqlite;
|
import fr.gouv.etalab.mastodon.sqlite.Sqlite;
|
||||||
|
@ -107,7 +107,7 @@ import android.support.v4.app.FragmentStatePagerAdapter;
|
||||||
|
|
||||||
|
|
||||||
public class MainActivity extends AppCompatActivity
|
public class MainActivity extends AppCompatActivity
|
||||||
implements NavigationView.OnNavigationItemSelectedListener, OnUpdateAccountInfoInterface, ProviderInstaller.ProviderInstallListener {
|
implements NavigationView.OnNavigationItemSelectedListener, OnUpdateAccountInfoInterface, ProviderInstaller.ProviderInstallListener, OnRetrieveMetaDataInterface {
|
||||||
|
|
||||||
private FloatingActionButton toot;
|
private FloatingActionButton toot;
|
||||||
private HashMap<String, String> tagTile = new HashMap<>();
|
private HashMap<String, String> tagTile = new HashMap<>();
|
||||||
|
@ -621,17 +621,13 @@ public class MainActivity extends AppCompatActivity
|
||||||
if ("text/plain".equals(type)) {
|
if ("text/plain".equals(type)) {
|
||||||
String sharedSubject = intent.getStringExtra(Intent.EXTRA_SUBJECT);
|
String sharedSubject = intent.getStringExtra(Intent.EXTRA_SUBJECT);
|
||||||
String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
|
String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
|
||||||
Uri uri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
|
// ParserUtils is a class I borrowed from Tusky.
|
||||||
String sharedStream = null;
|
|
||||||
if( uri!= null)
|
|
||||||
sharedStream = uri.toString();
|
|
||||||
Log.v(Helper.TAG,"sharedStream1: " + sharedStream);
|
|
||||||
if (sharedText != null) {
|
if (sharedText != null) {
|
||||||
|
new RetrieveMetaDataAsyncTask(sharedText, MainActivity.this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
|
||||||
Intent intentToot = new Intent(getApplicationContext(), TootActivity.class);
|
Intent intentToot = new Intent(getApplicationContext(), TootActivity.class);
|
||||||
Bundle b = new Bundle();
|
Bundle b = new Bundle();
|
||||||
b.putString("sharedSubject", sharedSubject);
|
b.putString("sharedSubject", sharedSubject);
|
||||||
b.putString("sharedContent", sharedText);
|
b.putString("sharedContent", sharedText);
|
||||||
b.putString("sharedStream", sharedStream);
|
|
||||||
intentToot.putExtras(b);
|
intentToot.putExtras(b);
|
||||||
startActivity(intentToot);
|
startActivity(intentToot);
|
||||||
}
|
}
|
||||||
|
@ -1080,6 +1076,14 @@ public class MainActivity extends AppCompatActivity
|
||||||
// appropriate action.
|
// appropriate action.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onRetrieveRemoteAccount(boolean error, String pictureUrl, String content) {
|
||||||
|
if( !error && pictureUrl != null) {
|
||||||
|
Intent intentSendImage = new Intent(Helper.RECEIVE_PICTURE);
|
||||||
|
intentSendImage.putExtra("pictureURL", pictureUrl);
|
||||||
|
LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(intentSendImage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue