Follow notifications now allow you to view the account that followed and follow back from the notification timeline.

This commit is contained in:
Vavassor 2017-02-26 20:14:13 -05:00
parent 9dceb7a226
commit 0a32c58801
5 changed files with 172 additions and 27 deletions

View File

@ -34,13 +34,20 @@ class Notification {
private Type type;
private String id;
private String displayName;
private String username;
private String avatar;
private String accountId;
/** Which of the user's statuses has been mentioned, reblogged, or favourited. */
private Status status;
private Notification(Type type, String id, String displayName) {
private Notification(Type type, String id, String displayName, String username, String avatar,
String accountId) {
this.type = type;
this.id = id;
this.displayName = displayName;
this.username = username;
this.avatar = avatar;
this.accountId = accountId;
}
Type getType() {
@ -55,6 +62,18 @@ class Notification {
return displayName;
}
String getUsername() {
return username;
}
String getAvatar() {
return avatar;
}
String getAccountId() {
return accountId;
}
@Nullable Status getStatus() {
return status;
}
@ -81,7 +100,11 @@ class Notification {
if (displayName.isEmpty()) {
displayName = account.getString("username");
}
Notification notification = new Notification(type, id, displayName);
String username = account.getString("acct");
String avatar = account.getString("avatar");
String accountId = account.getString("id");
Notification notification = new Notification(type, id, displayName, username, avatar,
accountId);
if (notification.hasStatusType()) {
JSONObject statusObject = object.getJSONObject("status");
Status status = Status.parse(statusObject, false);

View File

@ -21,9 +21,12 @@ import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import com.android.volley.toolbox.NetworkImageView;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@ -36,14 +39,16 @@ class NotificationsAdapter extends RecyclerView.Adapter implements AdapterItemRe
private List<Notification> notifications;
private StatusActionListener statusListener;
private FollowListener followListener;
private FooterActionListener footerListener;
private FooterViewHolder.State footerState;
NotificationsAdapter(StatusActionListener statusListener,
NotificationsAdapter(StatusActionListener statusListener, FollowListener followListener,
FooterActionListener footerListener) {
super();
notifications = new ArrayList<>();
this.statusListener = statusListener;
this.followListener = followListener;
this.footerListener = footerListener;
footerState = FooterViewHolder.State.LOADING;
}
@ -96,7 +101,10 @@ class NotificationsAdapter extends RecyclerView.Adapter implements AdapterItemRe
}
case FOLLOW: {
FollowViewHolder holder = (FollowViewHolder) viewHolder;
holder.setMessage(notification.getDisplayName());
holder.setMessage(notification.getDisplayName(), notification.getUsername(),
notification.getAvatar());
holder.setupButtons(followListener, notification.getAccountId(),
notification.getUsername());
break;
}
}
@ -177,19 +185,59 @@ class NotificationsAdapter extends RecyclerView.Adapter implements AdapterItemRe
footerState = state;
}
interface FollowListener {
void onViewAccount(String id, String username);
void onFollow(String id);
}
private static class FollowViewHolder extends RecyclerView.ViewHolder {
private TextView message;
private TextView usernameView;
private TextView displayNameView;
private NetworkImageView avatar;
private Button follow;
FollowViewHolder(View itemView) {
super(itemView);
message = (TextView) itemView.findViewById(R.id.notification_text);
usernameView = (TextView) itemView.findViewById(R.id.notification_username);
displayNameView = (TextView) itemView.findViewById(R.id.notification_display_name);
avatar = (NetworkImageView) itemView.findViewById(R.id.notification_avatar);
avatar.setDefaultImageResId(R.drawable.avatar_default);
avatar.setErrorImageResId(R.drawable.avatar_error);
follow = (Button) itemView.findViewById(R.id.notification_follow_button);
}
void setMessage(String displayName) {
void setMessage(String displayName, String username, String avatarUrl) {
Context context = message.getContext();
String format = context.getString(R.string.notification_follow_format);
String wholeMessage = String.format(format, displayName);
message.setText(wholeMessage);
format = context.getString(R.string.status_username_format);
String wholeUsername = String.format(format, username);
usernameView.setText(wholeUsername);
displayNameView.setText(displayName);
avatar.setImageUrl(avatarUrl, VolleySingleton.getInstance(context).getImageLoader());
}
void setupButtons(final FollowListener listener, final String accountId,
final String username) {
avatar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onViewAccount(accountId, username);
}
});
follow.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onFollow(accountId);
}
});
}
}

View File

@ -41,7 +41,8 @@ import java.util.List;
import java.util.Map;
public class NotificationsFragment extends SFragment implements
SwipeRefreshLayout.OnRefreshListener, StatusActionListener, FooterActionListener {
SwipeRefreshLayout.OnRefreshListener, StatusActionListener, FooterActionListener,
NotificationsAdapter.FollowListener {
private static final String TAG = "Notifications"; // logging tag and Volley request tag
private SwipeRefreshLayout swipeRefreshLayout;
@ -98,7 +99,7 @@ public class NotificationsFragment extends SFragment implements
}
};
recyclerView.addOnScrollListener(scrollListener);
adapter = new NotificationsAdapter(this, this);
adapter = new NotificationsAdapter(this, this, this);
recyclerView.setAdapter(adapter);
TabLayout layout = (TabLayout) getActivity().findViewById(R.id.tab_layout);
@ -266,4 +267,8 @@ public class NotificationsFragment extends SFragment implements
String username = status.getUsername();
super.viewAccount(id, username);
}
public void onFollow(String id) {
super.follow(id);
}
}

View File

@ -161,7 +161,7 @@ public class SFragment extends Fragment {
}, null);
}
private void follow(String id) {
protected void follow(String id) {
String endpoint = String.format(getString(R.string.endpoint_follow), id);
postRequest(endpoint);
}

View File

@ -1,25 +1,94 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
<!--
* This is the for follow notifications, the layout for the follows/following listings on account
* pages are instead in item_account.xml.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:orientation="vertical">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/follow_icon"
app:srcCompat="@drawable/ic_followed"
android:paddingTop="@dimen/notification_icon_vertical_padding"
android:paddingBottom="@dimen/notification_icon_vertical_padding"
android:paddingRight="@dimen/status_avatar_padding"
android:paddingLeft="@dimen/follow_icon_left_padding"
android:tint="?attr/notification_icon_tint" />
<TextView
android:id="@+id/notification_text"
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@id/follow_icon" />
android:layout_height="wrap_content">
</RelativeLayout>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/follow_icon"
app:srcCompat="@drawable/ic_followed"
android:paddingTop="@dimen/notification_icon_vertical_padding"
android:paddingBottom="@dimen/notification_icon_vertical_padding"
android:paddingRight="@dimen/status_avatar_padding"
android:paddingLeft="@dimen/follow_icon_left_padding"
android:tint="?attr/notification_icon_tint" />
<TextView
android:id="@+id/notification_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@id/follow_icon" />
</RelativeLayout>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.android.volley.toolbox.NetworkImageView
android:layout_width="64dp"
android:layout_height="64dp"
android:id="@+id/notification_avatar"
android:scaleType="fitCenter"
android:padding="@dimen/status_avatar_padding"
android:layout_alignParentLeft="true" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="64dp"
android:orientation="vertical"
android:layout_toRightOf="@id/notification_avatar">
<Space
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/notification_display_name"
android:textAppearance="@android:style/TextAppearance.DeviceDefault.Small"
android:textStyle="normal|bold" />
<Space
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/notification_username"
android:textColor="?attr/status_text_color_secondary" />
<Space
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1" />
</LinearLayout>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/notification_follow_button"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:text="@string/action_follow" />
</RelativeLayout>
</LinearLayout>