package com.xda.one.ui; import com.squareup.otto.Subscribe; import com.squareup.picasso.Picasso; import com.xda.one.R; import com.xda.one.api.inteface.PrivateMessageClient; import com.xda.one.api.retrofit.RetrofitPrivateMessageClient; import com.xda.one.event.message.MessageDeletedEvent; import com.xda.one.model.augmented.AugmentedMessage; import com.xda.one.parser.TextDataStructure; import com.xda.one.ui.widget.FloatingActionButton; import com.xda.one.util.CompatUtils; import com.xda.one.util.SectionUtils; import com.xda.one.util.Utils; import android.annotation.TargetApi; import android.app.Activity; import android.content.Intent; import android.graphics.drawable.Drawable; import android.os.Build; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.DialogFragment; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; public class ViewMessageFragment extends Fragment { public static final String MESSAGE_ARGUMENT = "message"; public static final String ACTIVITY_RESULT_BUNDLE_ARGUMENTS = "bundle_arguments"; public static final String ACTIVITY_RESULT_BUNDLE_ARGUMENTS_RESULT = "bundle_arguments_result"; private final Object mEventHandler = new Object() { @Subscribe public void onMessageDeleted(final MessageDeletedEvent event) { Toast.makeText(getActivity(), R.string.message_delete_successful, Toast.LENGTH_LONG) .show(); mBundle.putSerializable(ACTIVITY_RESULT_BUNDLE_ARGUMENTS_RESULT, ViewMessageResult.DELETED); setupIntent(); getActivity().finish(); } }; public static final int REPLY_MESSAGE_REQUEST_CODE = 1; private AugmentedMessage mMessage; private PrivateMessageClient mPrivateMessageClient; private Bundle mBundle; public static ViewMessageFragment createInstance(final AugmentedMessage message) { final Bundle bundle = new Bundle(); bundle.putParcelable(MESSAGE_ARGUMENT, message); final ViewMessageFragment viewMessageFragment = new ViewMessageFragment(); viewMessageFragment.setArguments(bundle); return viewMessageFragment; } private void setupIntent() { mBundle.putParcelable(MESSAGE_ARGUMENT, mMessage); final Intent intent = new Intent(); intent.putExtra(ACTIVITY_RESULT_BUNDLE_ARGUMENTS, mBundle); getActivity().setResult(Activity.RESULT_OK, intent); } @Override public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); mMessage = getArguments().getParcelable(MESSAGE_ARGUMENT); mBundle = new Bundle(); mPrivateMessageClient = RetrofitPrivateMessageClient.getClient(getActivity()); } @Override public View onCreateView(final LayoutInflater inflater, @Nullable final ViewGroup container, @Nullable final Bundle savedInstanceState) { return inflater.inflate(R.layout.view_message_fragment, container, false); } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) @Override public void onViewCreated(final View view, @Nullable final Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); setHasOptionsMenu(true); final TextView titleView = (TextView) view.findViewById(R.id.title); titleView.setText(mMessage.getTitle()); final TextView nameView = (TextView) view.findViewById(R.id.user_name); nameView.setText(mMessage.getFromUserName()); final TextView dateView = (TextView) view.findViewById(R.id.date); dateView.setText(Utils.getRelativeDate(getActivity(), mMessage.getDate())); final LinearLayout layout = (LinearLayout) view.findViewById(R.id .view_message_fragment_content); final TextDataStructure structure = mMessage.getTextDataStructure(); SectionUtils.setupSections(getActivity(), getLayoutInflater(savedInstanceState), layout, structure, new PostAdapter.GoToQuoteListener() { @Override public void onClick(final String postId) { } }); final ImageView avatarView = (ImageView) view.findViewById(R.id.avatar); Picasso.with(getActivity()) .load(mMessage.getAvatarUrl()) .placeholder(R.drawable.account_circle) .error(R.drawable.account_circle) .into(avatarView); if (mMessage.isMessageUnread()) { mPrivateMessageClient.markMessageReadAsync(mMessage); } final FloatingActionButton button = (FloatingActionButton) view .findViewById(R.id.view_message_fragment_floating_reply_button); button.setOnClickListener(new CreateReplyListener()); if (CompatUtils.hasLollipop()) { final Drawable drawable = getResources().getDrawable(R.drawable.fab_background); button.setBackground(drawable); } else { final int color = getResources().getColor(R.color.fab_color); button.setBackgroundColor(color); } } @Override public void onResume() { super.onResume(); mPrivateMessageClient.getBus().register(mEventHandler); } @Override public void onPause() { super.onPause(); setupIntent(); mPrivateMessageClient.getBus().unregister(mEventHandler); } @Override public void onCreateOptionsMenu(final Menu menu, final MenuInflater inflater) { inflater.inflate(R.menu.view_message_fragment_ab, menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.view_message_fragment_ab_mark_read_unread: mPrivateMessageClient.markMessageUnreadAsync(mMessage); // Replicated Gmail behaviour getActivity().finish(); return true; case R.id.view_message_fragment_ab_delete: mPrivateMessageClient.deleteMessageAsync(mMessage); return true; } return false; } public void onBackPressed() { setupIntent(); } public static enum ViewMessageResult { CHANGED, DELETED } private class CreateReplyListener implements View.OnClickListener { @Override public void onClick(final View view) { final DialogFragment fragment = ReplyMessageFragment.getInstance(mMessage); fragment.setTargetFragment(ViewMessageFragment.this, REPLY_MESSAGE_REQUEST_CODE); fragment.show(getFragmentManager(), "createPost"); } } }