diff --git a/res/layout/notifications_big_badge.xml b/res/layout/notifications_big_badge.xml
index 810385cda49f..61cab1da1b17 100644
--- a/res/layout/notifications_big_badge.xml
+++ b/res/layout/notifications_big_badge.xml
@@ -3,34 +3,48 @@
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFFFFF"
- android:orientation="vertical" >
+ android:orientation="vertical">
+ android:layout_gravity="center"
+ android:orientation="vertical">
+
+
+ android:drawableLeft="@drawable/note_icon_stats"
+ android:padding="16dp"
+ android:text="@string/view_stats_activity"
+ android:textColor="@color/reader_hyperlink"
+ android:textSize="@dimen/reader_text_sz_large"
+ android:background="@drawable/reader_transparent_selector"
+ android:visibility="gone" />
+ android:textColorLink="@color/reader_hyperlink"
+ android:textIsSelectable="true"
+ android:textSize="20sp" />
\ No newline at end of file
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 5158af0471fb..1f782c544613 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -329,6 +329,7 @@
Password
Incorrect Login
View full site
+ View stats
Visitors and Views
diff --git a/src/org/wordpress/android/models/Note.java b/src/org/wordpress/android/models/Note.java
index 2c6e1bab84b7..5103b85bd357 100644
--- a/src/org/wordpress/android/models/Note.java
+++ b/src/org/wordpress/android/models/Note.java
@@ -285,6 +285,23 @@ public Map getActions(){
return mActions;
}
+ /*
+ * returns the "meta" section of the note's JSON (not guaranteed to exist)
+ */
+ private JSONObject getJSONMeta() {
+ return JSONUtil.getJSONChild(this.toJSONObject(), "meta");
+ }
+
+ /*
+ * returns the value of the passed name in the meta section of the JSON
+ */
+ public int getMetaValueAsInt(String name, int defaultValue) {
+ JSONObject jsonMeta = getJSONMeta();
+ if (jsonMeta == null)
+ return defaultValue;
+ return jsonMeta.optInt(name, defaultValue);
+ }
+
/*
* returns the actions allowed on this note, assumes it's a comment notification
*/
diff --git a/src/org/wordpress/android/ui/WPActionBarActivity.java b/src/org/wordpress/android/ui/WPActionBarActivity.java
index b2578118be3c..c0ca07c32beb 100644
--- a/src/org/wordpress/android/ui/WPActionBarActivity.java
+++ b/src/org/wordpress/android/ui/WPActionBarActivity.java
@@ -104,7 +104,7 @@ public abstract class WPActionBarActivity extends SherlockFragmentActivity {
protected static final int NOTIFICATIONS_ACTIVITY = 11;
protected static final String LAST_ACTIVITY_PREFERENCE = "wp_pref_last_activity";
-
+
protected MenuDrawer mMenuDrawer;
private static int[] blogIDs;
protected boolean isAnimatingRefreshButton;
@@ -126,7 +126,7 @@ public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if ((getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == 4)
mIsXLargeDevice = true;
-
+
// configure all the available menu items
mMenuItems.add(new ReaderMenuItem());
mMenuItems.add(new NotificationsMenuItem());
@@ -194,7 +194,7 @@ protected void createMenuDrawer(int contentViewID) {
mMenuDrawer = attachMenuDrawer();
mMenuDrawer.setContentView(contentViewID);
-
+
initMenuDrawer();
}
diff --git a/src/org/wordpress/android/ui/notifications/BigBadgeFragment.java b/src/org/wordpress/android/ui/notifications/BigBadgeFragment.java
index e3959b426743..994986e496c8 100644
--- a/src/org/wordpress/android/ui/notifications/BigBadgeFragment.java
+++ b/src/org/wordpress/android/ui/notifications/BigBadgeFragment.java
@@ -1,17 +1,14 @@
package org.wordpress.android.ui.notifications;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
+import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.text.Html;
+import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
-import android.view.animation.Animation;
-import android.view.animation.AnimationUtils;
-import android.widget.ImageView;
import android.widget.TextView;
import com.android.volley.toolbox.NetworkImageView;
@@ -19,16 +16,16 @@
import org.wordpress.android.R;
import org.wordpress.android.WordPress;
import org.wordpress.android.models.Note;
+import org.wordpress.android.ui.stats.StatsActivity;
import org.wordpress.android.util.JSONUtil;
public class BigBadgeFragment extends Fragment implements NotificationFragment {
private Note mNote;
- private NetworkImageView mBadgeImageView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle state){
View view = inflater.inflate(R.layout.notifications_big_badge, parent, false);
- mBadgeImageView = (NetworkImageView) view.findViewById(R.id.badge);
+ NetworkImageView badgeImageView = (NetworkImageView) view.findViewById(R.id.badge);
TextView bodyTextView = (TextView) view.findViewById(R.id.body);
bodyTextView.setMovementMethod(LinkMovementMethod.getInstance());
@@ -37,12 +34,30 @@ public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle state
String noteHTML = JSONUtil.queryJSON(getNote().toJSONObject(), "body.html", "");
if (noteHTML.equals(""))
noteHTML = getNote().getSubject();
- bodyTextView.setText(Html.fromHtml(noteHTML));
+ Spanned html = Html.fromHtml(noteHTML);
+ bodyTextView.setText(html);
// Get the badge
String iconURL = getNote().getIconURL();
- if (!iconURL.equals("")) {
- mBadgeImageView.setImageUrl(iconURL, WordPress.imageLoader);
+ if (!iconURL.equals(""))
+ badgeImageView.setImageUrl(iconURL, WordPress.imageLoader);
+
+ // if this is a stats-related note, show stats link and enable tapping badge
+ // to view stats - but only if the note is for a blog that's visible
+ if (isStatsNote()) {
+ final int remoteBlogId = getNote().getMetaValueAsInt("blog_id", -1);
+ if (WordPress.wpDB.isDotComAccountVisible(remoteBlogId)) {
+ TextView txtStats = (TextView) view.findViewById(R.id.text_stats_link);
+ txtStats.setVisibility(View.VISIBLE);
+ View.OnClickListener statsListener = new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ showStatsActivity(remoteBlogId);
+ }
+ };
+ txtStats.setOnClickListener(statsListener);
+ badgeImageView.setOnClickListener(statsListener);
+ }
}
}
@@ -55,5 +70,48 @@ public void setNote(Note note){
public Note getNote(){
return mNote;
}
-
+
+ /*
+ * returns true if this is a stats-related notification - currently handles these types:
+ * followed_milestone_achievement
+ * post_milestone_achievement
+ * like_milestone_achievement
+ * traffic_surge
+ * best_followed_day_feat
+ * best_liked_day_feat
+ * most_liked_day
+ * most_followed_day
+ */
+ public boolean isStatsNote() {
+ if (getNote() == null)
+ return false;
+
+ String type = getNote().getType();
+ if (type == null)
+ return false;
+
+ return (type.contains("_milestone_")
+ || type.startsWith("traffic_")
+ || type.startsWith("best_")
+ || type.startsWith("most_"));
+ }
+
+ /*
+ * show stats for the passed blog
+ */
+ private void showStatsActivity(int remoteBlogId) {
+ if (getActivity() == null || isRemoving())
+ return;
+
+ // stats activity is designed to work with the current blog, so switch blogs if necessary
+ if (WordPress.getCurrentRemoteBlogId() != remoteBlogId) {
+ // TODO: should we show a toast to let user know blog was switched?
+ int localBlogId = WordPress.wpDB.getLocalTableBlogIdForRemoteBlogId(remoteBlogId);
+ WordPress.setCurrentBlog(localBlogId);
+ }
+
+ Intent intent = new Intent(getActivity(), StatsActivity.class);
+ intent.putExtra(StatsActivity.ARG_NO_MENU_DRAWER, true);
+ getActivity().startActivity(intent);
+ }
}
\ No newline at end of file
diff --git a/src/org/wordpress/android/ui/stats/StatsActivity.java b/src/org/wordpress/android/ui/stats/StatsActivity.java
index 4f04af4f43ee..674d84941101 100644
--- a/src/org/wordpress/android/ui/stats/StatsActivity.java
+++ b/src/org/wordpress/android/ui/stats/StatsActivity.java
@@ -60,6 +60,7 @@ public class StatsActivity extends WPActionBarActivity {
private static final String SAVED_NAV_POSITION = "SAVED_NAV_POSITION";
private static final String SAVED_WP_LOGIN_STATE = "SAVED_WP_LOGIN_STATE";
private static final int REQUEST_JETPACK = 7000;
+ public static final String ARG_NO_MENU_DRAWER = "no_menu_drawer";
private Dialog mSignInDialog;
private int mNavPosition = 0;
@@ -68,6 +69,7 @@ public class StatsActivity extends WPActionBarActivity {
private int mResultCode = -1;
private boolean mIsRestoredFromState = false;
private boolean mIsInFront;
+ private boolean mNoMenuDrawer = false;
// Used for tablet UI
private static final int TABLET_720DP = 720;
@@ -86,7 +88,14 @@ public void onCreate(Bundle savedInstanceState) {
return;
}
- createMenuDrawer(R.layout.stats_activity);
+ mNoMenuDrawer = getIntent().getBooleanExtra(ARG_NO_MENU_DRAWER, false);
+ if (mNoMenuDrawer) {
+ setContentView(R.layout.stats_activity);
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ } else {
+ createMenuDrawer(R.layout.stats_activity);
+ }
+
mFragmentContainer = (LinearLayout) findViewById(R.id.stats_fragment_container);
mColumnLeft = (LinearLayout) findViewById(R.id.stats_tablet_col_left);
mColumnRight = (LinearLayout) findViewById(R.id.stats_tablet_col_right);
@@ -396,6 +405,9 @@ public boolean onOptionsItemSelected(MenuItem item) {
} else if (item.getItemId() == R.id.menu_view_stats_full_site) {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://wordpress.com/my-stats")));
return true;
+ } else if (mNoMenuDrawer && item.getItemId() == android.R.id.home) {
+ onBackPressed();
+ return true;
}
return super.onOptionsItemSelected(item);
}
diff --git a/src/org/wordpress/android/util/WPRestClient.java b/src/org/wordpress/android/util/WPRestClient.java
index 7708697719cd..3be6be5ed04c 100644
--- a/src/org/wordpress/android/util/WPRestClient.java
+++ b/src/org/wordpress/android/util/WPRestClient.java
@@ -32,7 +32,7 @@
public class WPRestClient {
- private static final String NOTIFICATION_FIELDS="id,type,unread,body,subject,timestamp";
+ private static final String NOTIFICATION_FIELDS="id,type,unread,body,subject,timestamp,meta";
private static final String COMMENT_REPLY_CONTENT_FIELD="content";
private RestClient mRestClient;