add image context menu in offline mode (closes #711)
This commit is contained in:
parent
09efcf1b23
commit
d889d5e44c
@ -1,14 +1,12 @@
|
|||||||
package org.fox.ttrss.offline;
|
package org.fox.ttrss.offline;
|
||||||
|
|
||||||
|
import org.fox.ttrss.ArticlePager;
|
||||||
import org.fox.ttrss.CommonActivity;
|
import org.fox.ttrss.CommonActivity;
|
||||||
import org.fox.ttrss.OnlineActivity;
|
|
||||||
import org.fox.ttrss.PreferencesActivity;
|
import org.fox.ttrss.PreferencesActivity;
|
||||||
import org.fox.ttrss.R;
|
import org.fox.ttrss.R;
|
||||||
|
import org.jsoup.Jsoup;
|
||||||
import com.actionbarsherlock.view.ActionMode;
|
import org.jsoup.nodes.Document;
|
||||||
import com.actionbarsherlock.view.Menu;
|
import org.jsoup.select.Elements;
|
||||||
import com.actionbarsherlock.view.MenuInflater;
|
|
||||||
import com.actionbarsherlock.view.MenuItem;
|
|
||||||
|
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
@ -20,16 +18,22 @@ import android.content.Intent;
|
|||||||
import android.content.SharedPreferences;
|
import android.content.SharedPreferences;
|
||||||
import android.database.Cursor;
|
import android.database.Cursor;
|
||||||
import android.database.sqlite.SQLiteStatement;
|
import android.database.sqlite.SQLiteStatement;
|
||||||
|
import android.net.Uri;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.preference.PreferenceManager;
|
import android.preference.PreferenceManager;
|
||||||
import android.provider.BaseColumns;
|
import android.provider.BaseColumns;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
import android.view.KeyEvent;
|
import android.view.KeyEvent;
|
||||||
|
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.Window;
|
import android.view.Window;
|
||||||
import android.widget.EditText;
|
import android.widget.EditText;
|
||||||
import android.widget.SearchView;
|
import android.widget.SearchView;
|
||||||
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import com.actionbarsherlock.view.ActionMode;
|
||||||
|
import com.actionbarsherlock.view.Menu;
|
||||||
|
import com.actionbarsherlock.view.MenuInflater;
|
||||||
|
import com.actionbarsherlock.view.MenuItem;
|
||||||
|
|
||||||
public class OfflineActivity extends CommonActivity {
|
public class OfflineActivity extends CommonActivity {
|
||||||
private final String TAG = this.getClass().getSimpleName();
|
private final String TAG = this.getClass().getSimpleName();
|
||||||
@ -40,6 +44,8 @@ public class OfflineActivity extends CommonActivity {
|
|||||||
private ActionMode m_headlinesActionMode;
|
private ActionMode m_headlinesActionMode;
|
||||||
private HeadlinesActionModeCallback m_headlinesActionModeCallback;
|
private HeadlinesActionModeCallback m_headlinesActionModeCallback;
|
||||||
|
|
||||||
|
private String m_lastImageHitTestUrl;
|
||||||
|
|
||||||
@SuppressLint("NewApi")
|
@SuppressLint("NewApi")
|
||||||
private class HeadlinesActionModeCallback implements ActionMode.Callback {
|
private class HeadlinesActionModeCallback implements ActionMode.Callback {
|
||||||
|
|
||||||
@ -70,6 +76,90 @@ public class OfflineActivity extends CommonActivity {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean onContextItemSelected(android.view.MenuItem item) {
|
||||||
|
/* AdapterContextMenuInfo info = (AdapterContextMenuInfo) item
|
||||||
|
.getMenuInfo(); */
|
||||||
|
|
||||||
|
final OfflineArticlePager ap = (OfflineArticlePager)getSupportFragmentManager().findFragmentByTag(FRAG_ARTICLE);
|
||||||
|
|
||||||
|
switch (item.getItemId()) {
|
||||||
|
case R.id.article_img_open:
|
||||||
|
if (getLastContentImageHitTestUrl() != null) {
|
||||||
|
try {
|
||||||
|
Intent intent = new Intent(Intent.ACTION_VIEW,
|
||||||
|
Uri.parse(getLastContentImageHitTestUrl()));
|
||||||
|
startActivity(intent);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
toast(R.string.error_other_error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
case R.id.article_img_share:
|
||||||
|
if (getLastContentImageHitTestUrl() != null) {
|
||||||
|
Intent intent = new Intent(Intent.ACTION_SEND);
|
||||||
|
|
||||||
|
intent.setType("image/png");
|
||||||
|
intent.putExtra(Intent.EXTRA_SUBJECT, getLastContentImageHitTestUrl());
|
||||||
|
intent.putExtra(Intent.EXTRA_TEXT, getLastContentImageHitTestUrl());
|
||||||
|
|
||||||
|
startActivity(Intent.createChooser(intent, getLastContentImageHitTestUrl()));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
case R.id.article_img_view_caption:
|
||||||
|
if (getLastContentImageHitTestUrl() != null) {
|
||||||
|
|
||||||
|
String content = "";
|
||||||
|
|
||||||
|
Cursor article = getArticleById(ap.getSelectedArticleId());
|
||||||
|
|
||||||
|
if (article != null) {
|
||||||
|
content = article.getString(article.getColumnIndex("content"));
|
||||||
|
article.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Android doesn't give us an easy way to access title tags;
|
||||||
|
// we'll use Jsoup on the body text to grab the title text
|
||||||
|
// from the first image tag with this url. This will show
|
||||||
|
// the wrong text if an image is used multiple times.
|
||||||
|
Document doc = Jsoup.parse(content);
|
||||||
|
Elements es = doc.getElementsByAttributeValue("src", getLastContentImageHitTestUrl());
|
||||||
|
if (es.size() > 0){
|
||||||
|
if (es.get(0).hasAttr("title")){
|
||||||
|
Dialog dia = new Dialog(this);
|
||||||
|
if (es.get(0).hasAttr("alt")){
|
||||||
|
dia.setTitle(es.get(0).attr("alt"));
|
||||||
|
} else {
|
||||||
|
dia.setTitle(es.get(0).attr("title"));
|
||||||
|
}
|
||||||
|
TextView titleText = new TextView(this);
|
||||||
|
|
||||||
|
if (android.os.Build.VERSION.SDK_INT >= 16) {
|
||||||
|
titleText.setPaddingRelative(24, 24, 24, 24);
|
||||||
|
} else {
|
||||||
|
titleText.setPadding(24, 24, 24, 24);
|
||||||
|
}
|
||||||
|
|
||||||
|
titleText.setTextSize(16);
|
||||||
|
titleText.setText(es.get(0).attr("title"));
|
||||||
|
dia.setContentView(titleText);
|
||||||
|
dia.show();
|
||||||
|
} else {
|
||||||
|
toast(R.string.no_caption_to_display);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
toast(R.string.no_caption_to_display);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
Log.d(TAG, "onContextItemSelected, unhandled id=" + item.getItemId());
|
||||||
|
return super.onContextItemSelected(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
m_prefs = PreferenceManager
|
m_prefs = PreferenceManager
|
||||||
@ -692,5 +782,11 @@ public class OfflineActivity extends CommonActivity {
|
|||||||
refresh();
|
refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setLastContentImageHitTestUrl(String url) {
|
||||||
|
m_lastImageHitTestUrl = url;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLastContentImageHitTestUrl() {
|
||||||
|
return m_lastImageHitTestUrl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,7 @@ import android.view.ViewGroup;
|
|||||||
import android.webkit.WebChromeClient;
|
import android.webkit.WebChromeClient;
|
||||||
import android.webkit.WebSettings;
|
import android.webkit.WebSettings;
|
||||||
import android.webkit.WebSettings.LayoutAlgorithm;
|
import android.webkit.WebSettings.LayoutAlgorithm;
|
||||||
|
import android.webkit.WebView.HitTestResult;
|
||||||
import android.webkit.WebView;
|
import android.webkit.WebView;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
@ -84,8 +85,30 @@ public class OfflineArticleFragment extends Fragment implements GestureDetector.
|
|||||||
public void onCreateContextMenu(ContextMenu menu, View v,
|
public void onCreateContextMenu(ContextMenu menu, View v,
|
||||||
ContextMenuInfo menuInfo) {
|
ContextMenuInfo menuInfo) {
|
||||||
|
|
||||||
|
//getActivity().getMenuInflater().inflate(R.menu.article_link_context_menu, menu);
|
||||||
|
//menu.setHeaderTitle(m_cursor.getString(m_cursor.getColumnIndex("title")));
|
||||||
|
|
||||||
|
String title = m_cursor.getString(m_cursor.getColumnIndex("title"));
|
||||||
|
|
||||||
|
if (v.getId() == R.id.content) {
|
||||||
|
HitTestResult result = ((WebView)v).getHitTestResult();
|
||||||
|
|
||||||
|
if (result != null && (result.getType() == HitTestResult.IMAGE_TYPE || result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE)) {
|
||||||
|
menu.setHeaderTitle(result.getExtra());
|
||||||
|
getActivity().getMenuInflater().inflate(R.menu.article_content_img_context_menu, menu);
|
||||||
|
|
||||||
|
/* FIXME I have no idea how to do this correctly ;( */
|
||||||
|
|
||||||
|
m_activity.setLastContentImageHitTestUrl(result.getExtra());
|
||||||
|
|
||||||
|
} else {
|
||||||
|
menu.setHeaderTitle(title);
|
||||||
getActivity().getMenuInflater().inflate(R.menu.article_link_context_menu, menu);
|
getActivity().getMenuInflater().inflate(R.menu.article_link_context_menu, menu);
|
||||||
menu.setHeaderTitle(m_cursor.getString(m_cursor.getColumnIndex("title")));
|
}
|
||||||
|
} else {
|
||||||
|
menu.setHeaderTitle(title);
|
||||||
|
getActivity().getMenuInflater().inflate(R.menu.article_link_context_menu, menu);
|
||||||
|
}
|
||||||
|
|
||||||
super.onCreateContextMenu(menu, v, menuInfo);
|
super.onCreateContextMenu(menu, v, menuInfo);
|
||||||
|
|
||||||
@ -153,6 +176,8 @@ public class OfflineArticleFragment extends Fragment implements GestureDetector.
|
|||||||
|
|
||||||
if (web != null) {
|
if (web != null) {
|
||||||
|
|
||||||
|
registerForContextMenu(web);
|
||||||
|
|
||||||
web.setWebChromeClient(new WebChromeClient() {
|
web.setWebChromeClient(new WebChromeClient() {
|
||||||
@Override
|
@Override
|
||||||
public void onProgressChanged(WebView view, int progress) {
|
public void onProgressChanged(WebView view, int progress) {
|
||||||
@ -343,8 +368,7 @@ public class OfflineArticleFragment extends Fragment implements GestureDetector.
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onLongPress(MotionEvent e) {
|
public void onLongPress(MotionEvent e) {
|
||||||
// TODO Auto-generated method stub
|
m_activity.openContextMenu(getView());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
Loading…
Reference in New Issue
Block a user