From 97cc96839d31b6cce59ec29a6681c6fe802552ee Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Fri, 17 Oct 2014 00:06:56 +0400 Subject: initial --- src/org/fox/ttrss/ApiRequest.java | 351 ---- src/org/fox/ttrss/ArticleFragment.java | 449 ----- src/org/fox/ttrss/ArticlePager.java | 347 ---- src/org/fox/ttrss/CommonActivity.java | 250 --- src/org/fox/ttrss/DashClock.java | 107 -- src/org/fox/ttrss/DummyFragment.java | 17 - src/org/fox/ttrss/FeedCategoriesFragment.java | 547 ------ src/org/fox/ttrss/FeedsActivity.java | 509 ------ src/org/fox/ttrss/FeedsFragment.java | 808 --------- src/org/fox/ttrss/GlobalState.java | 63 - src/org/fox/ttrss/HeadlinesActivity.java | 281 ---- src/org/fox/ttrss/HeadlinesEventListener.java | 11 - src/org/fox/ttrss/HeadlinesFragment.java | 1179 ------------- src/org/fox/ttrss/LoadingFragment.java | 18 - src/org/fox/ttrss/OnlineActivity.java | 1765 -------------------- src/org/fox/ttrss/PreferencesActivity.java | 25 - src/org/fox/ttrss/offline/OfflineActivity.java | 881 ---------- .../fox/ttrss/offline/OfflineArticleFragment.java | 439 ----- src/org/fox/ttrss/offline/OfflineArticlePager.java | 298 ---- .../fox/ttrss/offline/OfflineDownloadService.java | 500 ------ .../offline/OfflineFeedCategoriesFragment.java | 337 ---- .../fox/ttrss/offline/OfflineFeedsActivity.java | 349 ---- .../fox/ttrss/offline/OfflineFeedsFragment.java | 372 ----- .../ttrss/offline/OfflineHeadlinesActivity.java | 167 -- .../offline/OfflineHeadlinesEventListener.java | 7 - .../ttrss/offline/OfflineHeadlinesFragment.java | 774 --------- .../fox/ttrss/offline/OfflineUploadService.java | 286 ---- src/org/fox/ttrss/share/CommonActivity.java | 57 - src/org/fox/ttrss/share/CommonShareActivity.java | 136 -- src/org/fox/ttrss/share/ShareActivity.java | 146 -- src/org/fox/ttrss/share/SubscribeActivity.java | 321 ---- src/org/fox/ttrss/tasker/TaskerReceiver.java | 93 -- .../fox/ttrss/tasker/TaskerSettingsActivity.java | 96 -- src/org/fox/ttrss/types/Article.java | 115 -- src/org/fox/ttrss/types/ArticleList.java | 59 - src/org/fox/ttrss/types/Attachment.java | 75 - src/org/fox/ttrss/types/Feed.java | 90 - src/org/fox/ttrss/types/FeedCategory.java | 58 - src/org/fox/ttrss/types/FeedCategoryList.java | 43 - src/org/fox/ttrss/types/FeedList.java | 43 - src/org/fox/ttrss/types/Label.java | 13 - src/org/fox/ttrss/util/AppRater.java | 105 -- src/org/fox/ttrss/util/DatabaseHelper.java | 89 - src/org/fox/ttrss/util/EnlargingImageView.java | 252 --- .../fox/ttrss/util/FontSizeDialogPreference.java | 224 --- src/org/fox/ttrss/util/HeadlinesRequest.java | 101 -- src/org/fox/ttrss/util/ImageCacheService.java | 212 --- src/org/fox/ttrss/util/LessBrokenWebView.java | 37 - src/org/fox/ttrss/util/NoChildFocusScrollView.java | 34 - src/org/fox/ttrss/util/PrefsBackupAgent.java | 19 - src/org/fox/ttrss/util/SimpleLoginManager.java | 105 -- src/org/fox/ttrss/util/TitleWebView.java | 91 - src/org/fox/ttrss/util/TypefaceCache.java | 29 - src/org/fox/ttrss/widget/SmallWidgetProvider.java | 65 - src/org/fox/ttrss/widget/WidgetUpdateService.java | 141 -- 55 files changed, 13986 deletions(-) delete mode 100644 src/org/fox/ttrss/ApiRequest.java delete mode 100644 src/org/fox/ttrss/ArticleFragment.java delete mode 100644 src/org/fox/ttrss/ArticlePager.java delete mode 100644 src/org/fox/ttrss/CommonActivity.java delete mode 100644 src/org/fox/ttrss/DashClock.java delete mode 100644 src/org/fox/ttrss/DummyFragment.java delete mode 100644 src/org/fox/ttrss/FeedCategoriesFragment.java delete mode 100644 src/org/fox/ttrss/FeedsActivity.java delete mode 100644 src/org/fox/ttrss/FeedsFragment.java delete mode 100644 src/org/fox/ttrss/GlobalState.java delete mode 100644 src/org/fox/ttrss/HeadlinesActivity.java delete mode 100644 src/org/fox/ttrss/HeadlinesEventListener.java delete mode 100644 src/org/fox/ttrss/HeadlinesFragment.java delete mode 100644 src/org/fox/ttrss/LoadingFragment.java delete mode 100644 src/org/fox/ttrss/OnlineActivity.java delete mode 100644 src/org/fox/ttrss/PreferencesActivity.java delete mode 100644 src/org/fox/ttrss/offline/OfflineActivity.java delete mode 100644 src/org/fox/ttrss/offline/OfflineArticleFragment.java delete mode 100644 src/org/fox/ttrss/offline/OfflineArticlePager.java delete mode 100644 src/org/fox/ttrss/offline/OfflineDownloadService.java delete mode 100644 src/org/fox/ttrss/offline/OfflineFeedCategoriesFragment.java delete mode 100644 src/org/fox/ttrss/offline/OfflineFeedsActivity.java delete mode 100644 src/org/fox/ttrss/offline/OfflineFeedsFragment.java delete mode 100644 src/org/fox/ttrss/offline/OfflineHeadlinesActivity.java delete mode 100644 src/org/fox/ttrss/offline/OfflineHeadlinesEventListener.java delete mode 100644 src/org/fox/ttrss/offline/OfflineHeadlinesFragment.java delete mode 100644 src/org/fox/ttrss/offline/OfflineUploadService.java delete mode 100644 src/org/fox/ttrss/share/CommonActivity.java delete mode 100644 src/org/fox/ttrss/share/CommonShareActivity.java delete mode 100644 src/org/fox/ttrss/share/ShareActivity.java delete mode 100644 src/org/fox/ttrss/share/SubscribeActivity.java delete mode 100644 src/org/fox/ttrss/tasker/TaskerReceiver.java delete mode 100644 src/org/fox/ttrss/tasker/TaskerSettingsActivity.java delete mode 100644 src/org/fox/ttrss/types/Article.java delete mode 100644 src/org/fox/ttrss/types/ArticleList.java delete mode 100644 src/org/fox/ttrss/types/Attachment.java delete mode 100644 src/org/fox/ttrss/types/Feed.java delete mode 100644 src/org/fox/ttrss/types/FeedCategory.java delete mode 100644 src/org/fox/ttrss/types/FeedCategoryList.java delete mode 100644 src/org/fox/ttrss/types/FeedList.java delete mode 100644 src/org/fox/ttrss/types/Label.java delete mode 100644 src/org/fox/ttrss/util/AppRater.java delete mode 100644 src/org/fox/ttrss/util/DatabaseHelper.java delete mode 100644 src/org/fox/ttrss/util/EnlargingImageView.java delete mode 100644 src/org/fox/ttrss/util/FontSizeDialogPreference.java delete mode 100644 src/org/fox/ttrss/util/HeadlinesRequest.java delete mode 100644 src/org/fox/ttrss/util/ImageCacheService.java delete mode 100644 src/org/fox/ttrss/util/LessBrokenWebView.java delete mode 100644 src/org/fox/ttrss/util/NoChildFocusScrollView.java delete mode 100644 src/org/fox/ttrss/util/PrefsBackupAgent.java delete mode 100644 src/org/fox/ttrss/util/SimpleLoginManager.java delete mode 100644 src/org/fox/ttrss/util/TitleWebView.java delete mode 100644 src/org/fox/ttrss/util/TypefaceCache.java delete mode 100644 src/org/fox/ttrss/widget/SmallWidgetProvider.java delete mode 100644 src/org/fox/ttrss/widget/WidgetUpdateService.java (limited to 'src/org') diff --git a/src/org/fox/ttrss/ApiRequest.java b/src/org/fox/ttrss/ApiRequest.java deleted file mode 100644 index 65e97e8e..00000000 --- a/src/org/fox/ttrss/ApiRequest.java +++ /dev/null @@ -1,351 +0,0 @@ -package org.fox.ttrss; - -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.net.HttpURLConnection; -import java.net.URL; -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; -import java.util.HashMap; - -import javax.net.ssl.HostnameVerifier; -import javax.net.ssl.HttpsURLConnection; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSession; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; - -import android.annotation.SuppressLint; -import android.content.Context; -import android.content.SharedPreferences; -import android.net.ConnectivityManager; -import android.net.NetworkInfo; -import android.os.AsyncTask; -import android.os.Build; -import android.preference.PreferenceManager; -import android.util.Base64; -import android.util.Log; - -import com.google.gson.Gson; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; - -public class ApiRequest extends AsyncTask, Integer, JsonElement> { - private final String TAG = this.getClass().getSimpleName(); - - public enum ApiError { NO_ERROR, HTTP_UNAUTHORIZED, HTTP_FORBIDDEN, HTTP_NOT_FOUND, - HTTP_SERVER_ERROR, HTTP_OTHER_ERROR, SSL_REJECTED, SSL_HOSTNAME_REJECTED, PARSE_ERROR, IO_ERROR, OTHER_ERROR, API_DISABLED, - API_UNKNOWN, LOGIN_FAILED, INVALID_URL, API_INCORRECT_USAGE, NETWORK_UNAVAILABLE, API_UNKNOWN_METHOD }; - - public static final int API_STATUS_OK = 0; - public static final int API_STATUS_ERR = 1; - - private String m_api; - private boolean m_transportDebugging = false; - protected int m_responseCode = 0; - protected String m_responseMessage; - protected int m_apiStatusCode = 0; - protected boolean m_canUseProgress = false; - protected Context m_context; - private SharedPreferences m_prefs; - - protected ApiError m_lastError; - - public ApiRequest(Context context) { - m_context = context; - - m_prefs = PreferenceManager.getDefaultSharedPreferences(m_context); - - m_api = m_prefs.getString("ttrss_url", "").trim(); - m_transportDebugging = m_prefs.getBoolean("transport_debugging", false); - m_lastError = ApiError.NO_ERROR; - - } - - @SuppressLint("NewApi") - @SuppressWarnings("unchecked") - public void execute(HashMap map) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) - super.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, map); - else - super.execute(map); - } - - public int getErrorMessage() { - switch (m_lastError) { - case NO_ERROR: - return R.string.error_unknown; - case HTTP_UNAUTHORIZED: - return R.string.error_http_unauthorized; - case HTTP_FORBIDDEN: - return R.string.error_http_forbidden; - case HTTP_NOT_FOUND: - return R.string.error_http_not_found; - case HTTP_SERVER_ERROR: - return R.string.error_http_server_error; - case HTTP_OTHER_ERROR: - return R.string.error_http_other_error; - case SSL_REJECTED: - return R.string.error_ssl_rejected; - case SSL_HOSTNAME_REJECTED: - return R.string.error_ssl_hostname_rejected; - case PARSE_ERROR: - return R.string.error_parse_error; - case IO_ERROR: - return R.string.error_io_error; - case OTHER_ERROR: - return R.string.error_other_error; - case API_DISABLED: - return R.string.error_api_disabled; - case API_UNKNOWN: - return R.string.error_api_unknown; - case API_UNKNOWN_METHOD: - return R.string.error_api_unknown_method; - case LOGIN_FAILED: - return R.string.error_login_failed; - case INVALID_URL: - return R.string.error_invalid_api_url; - case API_INCORRECT_USAGE: - return R.string.error_api_incorrect_usage; - case NETWORK_UNAVAILABLE: - return R.string.error_network_unavailable; - default: - Log.d(TAG, "getErrorMessage: unknown error code=" + m_lastError); - return R.string.error_unknown; - } - } - - @Override - protected JsonElement doInBackground(HashMap... params) { - - if (!isNetworkAvailable()) { - m_lastError = ApiError.NETWORK_UNAVAILABLE; - return null; - } - - Gson gson = new Gson(); - - String requestStr = gson.toJson(new HashMap(params[0])); - byte[] postData = null; - - try { - postData = requestStr.getBytes("UTF-8"); - } catch (UnsupportedEncodingException e) { - m_lastError = ApiError.OTHER_ERROR; - e.printStackTrace(); - return null; - } - - /* disableConnectionReuseIfNecessary(); */ - - if (m_transportDebugging) Log.d(TAG, ">>> (" + requestStr + ") " + m_api); - - /* ApiRequest.trustAllHosts(m_prefs.getBoolean("ssl_trust_any", false), - m_prefs.getBoolean("ssl_trust_any_host", false)); */ - - URL url; - - try { - url = new URL(m_api + "/api/"); - } catch (Exception e) { - m_lastError = ApiError.INVALID_URL; - e.printStackTrace(); - return null; - } - - try { - HttpURLConnection conn = (HttpURLConnection) url.openConnection(); - - String httpLogin = m_prefs.getString("http_login", "").trim(); - String httpPassword = m_prefs.getString("http_password", "").trim(); - - if (httpLogin.length() > 0) { - if (m_transportDebugging) Log.d(TAG, "Using HTTP Basic authentication."); - - conn.setRequestProperty("Authorization", "Basic " + - Base64.encodeToString((httpLogin + ":" + httpPassword).getBytes("UTF-8"), Base64.NO_WRAP)); - } - - conn.setDoInput(true); - conn.setDoOutput(true); - conn.setUseCaches(false); - conn.setRequestMethod("POST"); - conn.setRequestProperty("Content-Length", Integer.toString(postData.length)); - - OutputStream out = conn.getOutputStream(); - out.write(postData); - out.close(); - - m_responseCode = conn.getResponseCode(); - m_responseMessage = conn.getResponseMessage(); - - switch (m_responseCode) { - case HttpURLConnection.HTTP_OK: - StringBuffer response = new StringBuffer(); - InputStreamReader in = new InputStreamReader(conn.getInputStream(), "UTF-8"); - char[] buf = new char[256]; - int read = 0; - int total = 0; - - int contentLength = conn.getHeaderFieldInt("Api-Content-Length", -1); - - m_canUseProgress = (contentLength != -1); - - while ((read = in.read(buf)) >= 0) { - response.append(buf, 0, read); - total += read; - publishProgress(Integer.valueOf(total), Integer.valueOf(contentLength)); - } - - if (m_transportDebugging) Log.d(TAG, "<<< " + response); - - JsonParser parser = new JsonParser(); - - JsonElement result = parser.parse(response.toString()); - JsonObject resultObj = result.getAsJsonObject(); - - m_apiStatusCode = resultObj.get("status").getAsInt(); - - conn.disconnect(); - - switch (m_apiStatusCode) { - case API_STATUS_OK: - return result.getAsJsonObject().get("content"); - case API_STATUS_ERR: - JsonObject contentObj = resultObj.get("content").getAsJsonObject(); - String error = contentObj.get("error").getAsString(); - - if (error.equals("LOGIN_ERROR")) { - m_lastError = ApiError.LOGIN_FAILED; - } else if (error.equals("API_DISABLED")) { - m_lastError = ApiError.API_DISABLED; - } else if (error.equals("NOT_LOGGED_IN")) { - m_lastError = ApiError.LOGIN_FAILED; - } else if (error.equals("INCORRECT_USAGE")) { - m_lastError = ApiError.API_INCORRECT_USAGE; - } else if (error.equals("UNKNOWN_METHOD")) { - m_lastError = ApiError.API_UNKNOWN_METHOD; - } else { - Log.d(TAG, "Unknown API error: " + error); - m_lastError = ApiError.API_UNKNOWN; - } - } - - return null; - case HttpURLConnection.HTTP_UNAUTHORIZED: - m_lastError = ApiError.HTTP_UNAUTHORIZED; - break; - case HttpURLConnection.HTTP_FORBIDDEN: - m_lastError = ApiError.HTTP_FORBIDDEN; - break; - case HttpURLConnection.HTTP_NOT_FOUND: - m_lastError = ApiError.HTTP_NOT_FOUND; - break; - case HttpURLConnection.HTTP_INTERNAL_ERROR: - m_lastError = ApiError.HTTP_SERVER_ERROR; - break; - default: - Log.d(TAG, "HTTP response code: " + m_responseCode + "(" + m_responseMessage + ")"); - m_lastError = ApiError.HTTP_OTHER_ERROR; - break; - } - - conn.disconnect(); - return null; - } catch (javax.net.ssl.SSLPeerUnverifiedException e) { - m_lastError = ApiError.SSL_REJECTED; - e.printStackTrace(); - } catch (IOException e) { - m_lastError = ApiError.IO_ERROR; - - if (e.getMessage() != null) { - if (e.getMessage().matches("Hostname [^ ]+ was not verified")) { - m_lastError = ApiError.SSL_HOSTNAME_REJECTED; - } - } - - e.printStackTrace(); - } catch (com.google.gson.JsonSyntaxException e) { - m_lastError = ApiError.PARSE_ERROR; - e.printStackTrace(); - } catch (Exception e) { - m_lastError = ApiError.OTHER_ERROR; - e.printStackTrace(); - } - - return null; - } - - protected static void trustAllHosts(boolean trustAnyCert, boolean trustAnyHost) { - try { - if (trustAnyCert) { - X509TrustManager easyTrustManager = new X509TrustManager() { - - public void checkClientTrusted( - X509Certificate[] chain, - String authType) throws CertificateException { - // Oh, I am easy! - } - - public void checkServerTrusted( - X509Certificate[] chain, - String authType) throws CertificateException { - // Oh, I am easy! - } - - public X509Certificate[] getAcceptedIssuers() { - return null; - } - - }; - - // Create a trust manager that does not validate certificate chains - TrustManager[] trustAllCerts = new TrustManager[] {easyTrustManager}; - - // Install the all-trusting trust manager - - SSLContext sc = SSLContext.getInstance("TLS"); - - sc.init(null, trustAllCerts, new java.security.SecureRandom()); - - HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); - } - - if (trustAnyHost) { - HttpsURLConnection.setDefaultHostnameVerifier(new HostnameVerifier() { - @Override - public boolean verify(String hostname, SSLSession session) { - return true; - } - }); - } - - } catch (Exception e) { - e.printStackTrace(); - } - } - - @SuppressWarnings("deprecation") - protected static void disableConnectionReuseIfNecessary() { - // HTTP connection reuse which was buggy pre-froyo - if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) { - System.setProperty("http.keepAlive", "false"); - } - } - - protected boolean isNetworkAvailable() { - ConnectivityManager cm = (ConnectivityManager) - m_context.getSystemService(Context.CONNECTIVITY_SERVICE); - NetworkInfo networkInfo = cm.getActiveNetworkInfo(); - - // if no network is available networkInfo will be null - // otherwise check if we are connected - if (networkInfo != null && networkInfo.isConnected()) { - return true; - } - return false; - } -} diff --git a/src/org/fox/ttrss/ArticleFragment.java b/src/org/fox/ttrss/ArticleFragment.java deleted file mode 100644 index 4a568d3c..00000000 --- a/src/org/fox/ttrss/ArticleFragment.java +++ /dev/null @@ -1,449 +0,0 @@ -package org.fox.ttrss; - -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URL; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.Date; - -import org.fox.ttrss.types.Article; -import org.fox.ttrss.types.Attachment; -import org.fox.ttrss.util.TypefaceCache; -import org.jsoup.Jsoup; -import org.jsoup.nodes.Document; -import org.jsoup.nodes.Element; -import org.jsoup.select.Elements; - -import android.annotation.SuppressLint; -import android.app.Activity; -import android.content.Intent; -import android.content.SharedPreferences; -import android.graphics.Color; -import android.graphics.Typeface; -import android.net.Uri; -import android.os.Bundle; -import android.preference.PreferenceManager; -import android.support.v4.app.Fragment; -import android.text.Html; -import android.util.TypedValue; -import android.view.ContextMenu; -import android.view.ContextMenu.ContextMenuInfo; -import android.view.KeyEvent; -import android.view.LayoutInflater; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.ViewGroup; -import android.webkit.WebChromeClient; -import android.webkit.WebSettings; -import android.webkit.WebView; -import android.webkit.WebView.HitTestResult; -import android.widget.TextView; - -public class ArticleFragment extends Fragment { - private final String TAG = this.getClass().getSimpleName(); - - private SharedPreferences m_prefs; - private Article m_article; - private OnlineActivity m_activity; - - public void initialize(Article article) { - m_article = article; - } - - private View.OnTouchListener m_gestureListener; - - @Override - public void onCreateContextMenu(ContextMenu menu, View v, - ContextMenuInfo menuInfo) { - - 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(m_article.title); - getActivity().getMenuInflater().inflate(R.menu.article_link_context_menu, menu); - } - } else { - menu.setHeaderTitle(m_article.title); - getActivity().getMenuInflater().inflate(R.menu.article_link_context_menu, menu); - } - - super.onCreateContextMenu(menu, v, menuInfo); - - } - - @SuppressLint("NewApi") - @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - m_activity.setProgressBarVisibility(true); - - if (savedInstanceState != null) { - m_article = savedInstanceState.getParcelable("article"); - } - - boolean useTitleWebView = m_prefs.getBoolean("article_compat_view", false); - - View view = inflater.inflate(useTitleWebView ? R.layout.article_fragment_compat : R.layout.article_fragment, container, false); - - if (m_article != null) { - - if (!useTitleWebView) { - View scroll = view.findViewById(R.id.article_scrollview); - - if (scroll != null) { - final float scale = getResources().getDisplayMetrics().density; - - if (m_activity.isSmallScreen()) { - scroll.setPadding((int)(8 * scale + 0.5f), - (int)(5 * scale + 0.5f), - (int)(8 * scale + 0.5f), - 0); - } else { - scroll.setPadding((int)(25 * scale + 0.5f), - (int)(10 * scale + 0.5f), - (int)(25 * scale + 0.5f), - 0); - - } - - } - } - - int articleFontSize = Integer.parseInt(m_prefs.getString("article_font_size_sp", "16")); - int articleSmallFontSize = Math.max(10, Math.min(18, articleFontSize - 2)); - - TextView title = (TextView)view.findViewById(R.id.title); - - if (title != null) { - - if (m_prefs.getBoolean("enable_condensed_fonts", false)) { - Typeface tf = TypefaceCache.get(m_activity, "sans-serif-condensed", Typeface.NORMAL); - - if (tf != null && !tf.equals(title.getTypeface())) { - title.setTypeface(tf); - } - - title.setTextSize(TypedValue.COMPLEX_UNIT_SP, Math.min(21, articleFontSize + 5)); - } else { - title.setTextSize(TypedValue.COMPLEX_UNIT_SP, Math.min(21, articleFontSize + 3)); - } - - String titleStr; - - if (m_article.title.length() > 200) - titleStr = m_article.title.substring(0, 200) + "..."; - else - titleStr = m_article.title; - - title.setText(Html.fromHtml(titleStr)); - //title.setPaintFlags(title.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); - title.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - try { - URL url = new URL(m_article.link.trim()); - String uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), - url.getPort(), url.getPath(), url.getQuery(), url.getRef()).toString(); - Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(uri)); - startActivity(intent); - } catch (Exception e) { - e.printStackTrace(); - m_activity.toast(R.string.error_other_error); - } - } - }); - - registerForContextMenu(title); - } - - TextView comments = (TextView)view.findViewById(R.id.comments); - - if (comments != null) { - if (m_activity.getApiLevel() >= 4 && m_article.comments_count > 0) { - comments.setTextSize(TypedValue.COMPLEX_UNIT_SP, articleSmallFontSize); - - String commentsTitle = getString(R.string.article_comments, m_article.comments_count); - comments.setText(commentsTitle); - //comments.setPaintFlags(title.getPaintFlags() | Paint.UNDERLINE_TEXT_FLAG); - comments.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View v) { - try { - URL url = new URL((m_article.comments_link != null && m_article.comments_link.length() > 0) ? - m_article.comments_link : m_article.link); - String uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), - url.getPort(), url.getPath(), url.getQuery(), url.getRef()).toString(); - Intent intent = new Intent(Intent.ACTION_VIEW, - Uri.parse(uri)); - startActivity(intent); - } catch (Exception e) { - e.printStackTrace(); - m_activity.toast(R.string.error_other_error); - } - } - }); - - } else { - comments.setVisibility(View.GONE); - } - } - - TextView note = (TextView)view.findViewById(R.id.note); - - if (note != null) { - if (m_article.note != null && !"".equals(m_article.note)) { - note.setTextSize(TypedValue.COMPLEX_UNIT_SP, articleSmallFontSize); - note.setText(m_article.note); - } else { - note.setVisibility(View.GONE); - } - - } - - final WebView web = (WebView)view.findViewById(R.id.content); - - if (web != null) { - - web.setOnLongClickListener(new View.OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - HitTestResult result = ((WebView)v).getHitTestResult(); - - if (result != null && (result.getType() == HitTestResult.IMAGE_TYPE || result.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE)) { - registerForContextMenu(web); - m_activity.openContextMenu(web); - unregisterForContextMenu(web); - return true; - } else { - if (m_activity.isCompatMode()) { - KeyEvent shiftPressEvent = new KeyEvent(0, 0, KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_SHIFT_LEFT, 0, 0); - shiftPressEvent.dispatch(web); - } - - return false; - } - } - }); - - // prevent flicker in ics - if (!m_prefs.getBoolean("webview_hardware_accel", true) || useTitleWebView) { - if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.HONEYCOMB) { - web.setLayerType(View.LAYER_TYPE_SOFTWARE, null); - } - } - - web.setWebChromeClient(new WebChromeClient() { - @Override - public void onProgressChanged(WebView view, int progress) { - m_activity.setProgress(Math.round(((float)progress / 100f) * 10000)); - if (progress == 100) { - m_activity.setProgressBarVisibility(false); - } - } - }); - - String content; - String cssOverride = ""; - - WebSettings ws = web.getSettings(); - ws.setSupportZoom(false); - - TypedValue tv = new TypedValue(); - getActivity().getTheme().resolveAttribute(R.attr.linkColor, tv, true); - - String theme = m_prefs.getString("theme", CommonActivity.THEME_DEFAULT); - - if (CommonActivity.THEME_HOLO.equals(theme)) { - cssOverride = "body { background : transparent; color : #e0e0e0}"; - } else if (CommonActivity.THEME_DARK.equals(theme)) { - cssOverride = "body { background : transparent; color : #e0e0e0}"; - } else { - cssOverride = "body { background : transparent; }"; - } - - if (useTitleWebView || android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.HONEYCOMB) { - web.setBackgroundColor(Color.TRANSPARENT); - } else { - // seriously? - web.setBackgroundColor(Color.argb(1, 0, 0, 0)); - } - - String hexColor = String.format("#%06X", (0xFFFFFF & tv.data)); - cssOverride += " a:link {color: "+hexColor+";} a:visited { color: "+hexColor+";}"; - - cssOverride += " table { width : 100%; }"; - - String articleContent = m_article.content != null ? m_article.content : ""; - - Document doc = Jsoup.parse(articleContent); - - if (doc != null) { - // thanks webview for crashing on