package com.newsrob.activities;
import java.lang.reflect.Method;
import java.util.regex.Pattern;
import android.app.Activity;
import android.content.Intent;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.WebView;
import com.newsrob.DBQuery;
import com.newsrob.Entry;
import com.newsrob.EntryManager;
import com.newsrob.Feed;
import com.newsrob.NewsRob;
import com.newsrob.PL;
/**
* @SuppressWarnings("PMD.NullAssignments")
*/
public class UIHelper {
public static final String EXTRA_KEY_POSITION = "POSITION";
public static final String EXTRA_KEY_FILTER_LABEL = "FILTER_LABEL";
public static final String EXTRA_KEY_FILTER_FEED = "FILTER_FEED";
public static final String EXTRA_KEY_START_DATE = "START_DATE";
public static final String EXTRA_KEY_TITLE = "TITLE";
public static final String EXTRA_KEY_SORT_ORDER_ASCENDING = "SORT_ASC";
private static final String EXTRA_KEY_HIDE_READ_ARTICLES = "HIDE_READ_ARTICLES";
static Pattern PATTERN_HTTP_LINK = Pattern.compile("(https?://[a-z0-9_:\\%\\+\\-\\/?~=.,!]*[^.!? ()\"“”])",
Pattern.CASE_INSENSITIVE);
static Pattern PATTERN_TWITTER_USER = Pattern.compile("@([a-z0-9_\\-~]*[^.!? ()])", Pattern.CASE_INSENSITIVE);
static Pattern PATTERN_TWITTER_HASH = Pattern.compile("#([a-z0-9_\\-]+[^.!? ()])", Pattern.CASE_INSENSITIVE);
private EntryManager entryManager;
private int[] resourceIdCache = new int[4 * 5 + 5];
UIHelper(EntryManager entryManager) {
this.entryManager = entryManager;
}
public static DBQuery createDBQueryFromIntentExtras(EntryManager entryManager, Intent intent) {
String filterLabel = null;
Long filterFeedId = null;
long startDate = 0;
Bundle extras = intent.getExtras();
boolean sortOrderAscending = !entryManager.shouldShowNewestArticlesFirst();
if (extras != null) {
filterLabel = extras.getString(UIHelper.EXTRA_KEY_FILTER_LABEL);
filterFeedId = extras.getLong(UIHelper.EXTRA_KEY_FILTER_FEED, -1l);
if (filterFeedId == -1l)
filterFeedId = null; // NOPMD by mkamp on 1/18/10 12:36 PM
startDate = extras.getLong(UIHelper.EXTRA_KEY_START_DATE, 0);
if (extras.containsKey(UIHelper.EXTRA_KEY_SORT_ORDER_ASCENDING))
sortOrderAscending = extras.getBoolean(UIHelper.EXTRA_KEY_SORT_ORDER_ASCENDING, sortOrderAscending);
}
DBQuery dbq = new DBQuery(entryManager, filterLabel, filterFeedId);
dbq.setStartDate(startDate);
dbq.setSortOrderAscending(sortOrderAscending);
PL.log("dbq=" + dbq, entryManager.getContext()); // REMOVE TODO
return dbq;
}
public static void addExtrasFromDBQuery(Intent i, DBQuery dbq) {
URLHelper url = new URLHelper("newsrob://act" + "?activity=" + Uri.encode(i.getComponent().getClassName()));
if (dbq.getFilterLabel() != null) {
i.putExtra(UIHelper.EXTRA_KEY_FILTER_LABEL, dbq.getFilterLabel());
url.a(UIHelper.EXTRA_KEY_FILTER_LABEL, dbq.getFilterLabel());
}
if (dbq.getFilterFeedId() != null && dbq.getFilterFeedId() != -1l) {
i.putExtra(UIHelper.EXTRA_KEY_FILTER_FEED, dbq.getFilterFeedId());
url.a(UIHelper.EXTRA_KEY_FILTER_FEED, String.valueOf(dbq.getFilterFeedId()));
}
if (dbq.getStartDate() > 0l) {
i.putExtra(UIHelper.EXTRA_KEY_START_DATE, dbq.getStartDate());
url.a(UIHelper.EXTRA_KEY_START_DATE, String.valueOf(dbq.getStartDate()));
}
url.a(EXTRA_KEY_HIDE_READ_ARTICLES, String.valueOf(dbq.shouldHideReadItems()));
i.putExtra(UIHelper.EXTRA_KEY_SORT_ORDER_ASCENDING, dbq.isSortOrderAscending());
url.a(EXTRA_KEY_SORT_ORDER_ASCENDING, String.valueOf(dbq.isSortOrderAscending()));
if (i.hasExtra(UIHelper.EXTRA_KEY_TITLE))
url.a(UIHelper.EXTRA_KEY_TITLE, i.getStringExtra(UIHelper.EXTRA_KEY_TITLE));
// uri = new
// Uri.Builder().authority("a").scheme("n").path(i.getComponent().getClassName()).build();
i.setData(Uri.parse(url.toString()));
i.setFlags(i.getFlags() | Intent.FLAG_DEBUG_LOG_RESOLUTION);
// encodedQuery("time=" + System.currentTimeMillis()
}
int getArticleDownloadIndicatorDrawable(int downloaded, int downloadPref, Resources resources) {
int cacheKey = downloaded + (downloadPref * 5);
if (resourceIdCache[cacheKey] != 0)
return resourceIdCache[cacheKey];
String resourceName = "gen_m_downloaded_";
switch (downloaded) {
case Entry.STATE_DOWNLOAD_ERROR:
resourceName += "error_";
break;
case Entry.STATE_DOWNLOADED_FEED_CONTENT:
case Entry.STATE_DOWNLOADED_FULL_PAGE:
resourceName += "yes_";
break;
default:
resourceName += "no_";
}
int downloadPrefResolved = (downloadPref == Feed.DOWNLOAD_PREF_DEFAULT ? entryManager.getDefaultDownloadPref()
: downloadPref);
switch (downloadPrefResolved) {
case Feed.DOWNLOAD_HEADERS_ONLY:
resourceName += "headers";
break;
case Feed.DOWNLOAD_PREF_FEED_ONLY:
resourceName += "feed";
break;
case Feed.DOWNLOAD_PREF_FEED_AND_WEBPAGE:
case Feed.DOWNLOAD_PREF_FEED_AND_MOBILE_WEBPAGE:
resourceName += "web";
break;
}
int backgroundResource = resources.getIdentifier(resourceName, "drawable", "com.newsrob");
resourceIdCache[cacheKey] = backgroundResource;
return backgroundResource;
}
public static String linkize(String url, String s) {
try {
if (s == null || s.length() < 5)
return s;
s = PATTERN_HTTP_LINK.matcher(s).replaceAll("<a href=\"$1\">$1</a>");
if (url.indexOf("twitter.com") >= 0 || url.indexOf("facebook.com") >= 0) {
s = PATTERN_TWITTER_USER.matcher(s).replaceAll("<a href=\"http://twitter.com/$1\">@$1</a>");
s = PATTERN_TWITTER_HASH.matcher(s).replaceAll(
"<a href=\"http://search.twitter.com/search?q=$1\">#$1</a>");
}
} catch (Exception e) {
// ignored!
e.printStackTrace();
}
return s;
}
public static void pauseWebViews(final Activity activity) {
manageWebViews(activity, true);
}
public static void resumeWebViews(final Activity activity) {
manageWebViews(activity, false);
}
private static void manageWebViews(final Activity activity, final boolean pause) {
ViewGroup root = (ViewGroup) activity.getWindow().getDecorView().getRootView();
manageWebViews(root, pause);
}
private static void manageWebViews(final ViewGroup parent, final boolean pause) {
WebView wv = null;
for (int i = 0; i < parent.getChildCount(); i++) {
View child = parent.getChildAt(i);
if (child instanceof WebView) {
wv = (WebView) child;
manageWebView(wv, pause);
} else if (child instanceof ViewGroup) {
manageWebViews((ViewGroup) child, pause);
}
}
if (false && wv != null) {
if (pause)
wv.pauseTimers();
else
wv.resumeTimers();
}
}
private static void manageWebView(WebView webView, boolean pause) {
final String methodName = pause ? "onPause" : "onResume";
final boolean enabled = "1".equals(NewsRob.getDebugProperties(webView.getContext()).getProperty(
"pauseWebViews", "1"));
PL.log("UIHelper.manageWebView called with action: " + methodName + " on webView=" + webView + " enabled="
+ enabled, webView.getContext());
try {
PL.log("Found webview" + webView + " " + methodName, webView.getContext());
Method m = webView.getClass().getMethod(methodName, null);
m.invoke(webView, new Object[] {});
} catch (Exception e) {
e.printStackTrace();
}
}
}
class URLHelper {
private StringBuilder buffer;
URLHelper(String baseUrl) {
buffer = new StringBuilder(baseUrl);
}
URLHelper a(String parameterName, String value) {
buffer.append("&" + parameterName + "=" + Uri.encode(value));
return this;
}
@Override
public String toString() {
return buffer.toString();
}
}