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;