From 2be61cf34f33f39bd71d764caf6ae5f08d8855e6 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 2 Jan 2014 13:46:21 -0500 Subject: [PATCH 1/5] Stats activity is now available from stats-related notes --- res/layout/notifications_big_badge.xml | 31 +++++--- res/values/strings.xml | 1 + .../android/ui/WPActionBarActivity.java | 6 +- .../ui/notifications/BigBadgeFragment.java | 72 ++++++++++++++++--- .../android/ui/stats/StatsActivity.java | 14 +++- 5 files changed, 100 insertions(+), 24 deletions(-) diff --git a/res/layout/notifications_big_badge.xml b/res/layout/notifications_big_badge.xml index 810385cda49f..ce65e7c421c5 100644 --- a/res/layout/notifications_big_badge.xml +++ b/res/layout/notifications_big_badge.xml @@ -3,34 +3,47 @@ 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: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 72146429ffc4..21e92dbbff9e 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -328,6 +328,7 @@ Password Incorrect Login View full site + View stats Visitors and Views diff --git a/src/org/wordpress/android/ui/WPActionBarActivity.java b/src/org/wordpress/android/ui/WPActionBarActivity.java index 6c41c32578c9..612c98620478 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..cb8a0d607052 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,28 @@ 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 + TextView txtStats = (TextView) view.findViewById(R.id.text_stats_link); + if (isStatsNote()) { + txtStats.setVisibility(View.VISIBLE); + View.OnClickListener statsListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + showStatsActivity(); + } + }; + txtStats.setOnClickListener(statsListener); + badgeImageView.setOnClickListener(statsListener); + } else { + txtStats.setVisibility(View.GONE); } } @@ -55,5 +68,42 @@ 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 + * + * https://wpcom.trac.automattic.com/browser/trunk/wp-content/mu-plugins/notes/notes-rest-common.js#L64 + */ + 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_")); + } + + // TODO: this will show stats for the currently selected blog, but doesn't handle the case + // where the note is for a different blog + private void showStatsActivity() { + if (getActivity() == null || isRemoving()) + return; + 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 c343d5c82721..e1bbdc416b4f 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); } From 46b235df771ef243f4d23d456af91cacbe7538dc Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Thu, 2 Jan 2014 18:52:18 -0500 Subject: [PATCH 2/5] Updated to take the blog_id of the stats notification into account - untested since r87923-wpcom isn't live yet --- src/org/wordpress/android/models/Note.java | 7 +++ .../ui/notifications/BigBadgeFragment.java | 44 ++++++++++++------- 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/src/org/wordpress/android/models/Note.java b/src/org/wordpress/android/models/Note.java index 2c6e1bab84b7..27d2a2658aff 100644 --- a/src/org/wordpress/android/models/Note.java +++ b/src/org/wordpress/android/models/Note.java @@ -285,6 +285,13 @@ public Map getActions(){ return mActions; } + /* + * returns the "meta" section of the note's JSON (not guaranteed to exist) + */ + public JSONObject getJSONMeta() { + return JSONUtil.getJSONChild(this.toJSONObject(), "meta"); + } + /* * returns the actions allowed on this note, assumes it's a comment notification */ diff --git a/src/org/wordpress/android/ui/notifications/BigBadgeFragment.java b/src/org/wordpress/android/ui/notifications/BigBadgeFragment.java index cb8a0d607052..248c9f38d19a 100644 --- a/src/org/wordpress/android/ui/notifications/BigBadgeFragment.java +++ b/src/org/wordpress/android/ui/notifications/BigBadgeFragment.java @@ -13,6 +13,7 @@ import com.android.volley.toolbox.NetworkImageView; +import org.json.JSONObject; import org.wordpress.android.R; import org.wordpress.android.WordPress; import org.wordpress.android.models.Note; @@ -42,20 +43,23 @@ public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle state 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 - TextView txtStats = (TextView) view.findViewById(R.id.text_stats_link); + // 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()) { - txtStats.setVisibility(View.VISIBLE); - View.OnClickListener statsListener = new View.OnClickListener() { - @Override - public void onClick(View v) { - showStatsActivity(); - } - }; - txtStats.setOnClickListener(statsListener); - badgeImageView.setOnClickListener(statsListener); - } else { - txtStats.setVisibility(View.GONE); + JSONObject jsonMeta = getNote().getJSONMeta(); + final int blogId = (jsonMeta != null ? jsonMeta.optInt("blog_id", -1) : -1); + if (WordPress.wpDB.isDotComAccountVisible(blogId)) { + 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(blogId); + } + }; + txtStats.setOnClickListener(statsListener); + badgeImageView.setOnClickListener(statsListener); + } } } @@ -97,11 +101,19 @@ public boolean isStatsNote() { || type.startsWith("most_")); } - // TODO: this will show stats for the currently selected blog, but doesn't handle the case - // where the note is for a different blog - private void showStatsActivity() { + /* + * show stats for the passed blog + */ + private void showStatsActivity(int blogId) { if (getActivity() == null || isRemoving()) return; + + // stats activity is designed to work with the current blog, so switch blogs if necessary + if (WordPress.getCurrentBlogId() != blogId) { + int accountId = WordPress.wpDB.getAccountIdForBlogId(blogId); + WordPress.setCurrentBlog(accountId); + } + Intent intent = new Intent(getActivity(), StatsActivity.class); intent.putExtra(StatsActivity.ARG_NO_MENU_DRAWER, true); getActivity().startActivity(intent); From 0eeaa8e61b364f3ec47b0a4b095a8d38f249935d Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Fri, 3 Jan 2014 16:04:14 -0500 Subject: [PATCH 3/5] Added "meta" to list of fields to return in notifications (necessary to get the blog_id) --- src/org/wordpress/android/util/WPRestClient.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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; From 80640297b585aa29838ae1fd768df86cb7868475 Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Fri, 3 Jan 2014 16:17:11 -0500 Subject: [PATCH 4/5] Stats-related notifications now make sure the blog the note is about is the current one before stats are displayed --- res/layout/notifications_big_badge.xml | 1 + src/org/wordpress/android/models/Note.java | 12 +++++++++++- .../ui/notifications/BigBadgeFragment.java | 17 ++++++++--------- 3 files changed, 20 insertions(+), 10 deletions(-) diff --git a/res/layout/notifications_big_badge.xml b/res/layout/notifications_big_badge.xml index ce65e7c421c5..61cab1da1b17 100644 --- a/res/layout/notifications_big_badge.xml +++ b/res/layout/notifications_big_badge.xml @@ -31,6 +31,7 @@ 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" /> getActions(){ /* * returns the "meta" section of the note's JSON (not guaranteed to exist) */ - public JSONObject getJSONMeta() { + 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/notifications/BigBadgeFragment.java b/src/org/wordpress/android/ui/notifications/BigBadgeFragment.java index 248c9f38d19a..491058fa6d87 100644 --- a/src/org/wordpress/android/ui/notifications/BigBadgeFragment.java +++ b/src/org/wordpress/android/ui/notifications/BigBadgeFragment.java @@ -13,7 +13,6 @@ import com.android.volley.toolbox.NetworkImageView; -import org.json.JSONObject; import org.wordpress.android.R; import org.wordpress.android.WordPress; import org.wordpress.android.models.Note; @@ -46,15 +45,14 @@ public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle state // 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()) { - JSONObject jsonMeta = getNote().getJSONMeta(); - final int blogId = (jsonMeta != null ? jsonMeta.optInt("blog_id", -1) : -1); - if (WordPress.wpDB.isDotComAccountVisible(blogId)) { + 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(blogId); + showStatsActivity(remoteBlogId); } }; txtStats.setOnClickListener(statsListener); @@ -104,14 +102,15 @@ public boolean isStatsNote() { /* * show stats for the passed blog */ - private void showStatsActivity(int blogId) { + 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.getCurrentBlogId() != blogId) { - int accountId = WordPress.wpDB.getAccountIdForBlogId(blogId); - WordPress.setCurrentBlog(accountId); + if (WordPress.getCurrentBlogId() != remoteBlogId) { + // TODO: should we show a toast to let user know blog was switched? + int localBlogId = WordPress.wpDB.getAccountIdForBlogId(remoteBlogId); + WordPress.setCurrentBlog(localBlogId); } Intent intent = new Intent(getActivity(), StatsActivity.class); From e2d388494f0abd2d3335e4d8daf3f012311a86fb Mon Sep 17 00:00:00 2001 From: Nick Bradbury Date: Fri, 3 Jan 2014 17:22:23 -0500 Subject: [PATCH 5/5] Updated to use new method names added by pull request #623 --- .../ui/notifications/BigBadgeFragment.java | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/src/org/wordpress/android/ui/notifications/BigBadgeFragment.java b/src/org/wordpress/android/ui/notifications/BigBadgeFragment.java index 491058fa6d87..994986e496c8 100644 --- a/src/org/wordpress/android/ui/notifications/BigBadgeFragment.java +++ b/src/org/wordpress/android/ui/notifications/BigBadgeFragment.java @@ -73,17 +73,14 @@ public Note getNote(){ /* * 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 - * - * https://wpcom.trac.automattic.com/browser/trunk/wp-content/mu-plugins/notes/notes-rest-common.js#L64 + * 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) @@ -107,9 +104,9 @@ private void showStatsActivity(int remoteBlogId) { return; // stats activity is designed to work with the current blog, so switch blogs if necessary - if (WordPress.getCurrentBlogId() != remoteBlogId) { + if (WordPress.getCurrentRemoteBlogId() != remoteBlogId) { // TODO: should we show a toast to let user know blog was switched? - int localBlogId = WordPress.wpDB.getAccountIdForBlogId(remoteBlogId); + int localBlogId = WordPress.wpDB.getLocalTableBlogIdForRemoteBlogId(remoteBlogId); WordPress.setCurrentBlog(localBlogId); }