Follow notifications now allow you to view the account that followed and follow back from the notification timeline.
This commit is contained in:
parent
9dceb7a226
commit
0a32c58801
5 changed files with 172 additions and 27 deletions
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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>
|
Loading…
Reference in a new issue