/* * The MIT License (MIT) * * Copyright (c) 2012-2014 lacolaco.net * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ package net.lacolaco.smileessence.view.page; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.content.ContextCompat; import android.text.Editable; import android.text.Spannable; import android.text.TextUtils; import android.text.TextWatcher; import android.text.method.ArrowKeyMovementMethod; import android.view.*; import android.widget.*; import com.twitter.Validator; import net.lacolaco.smileessence.R; import net.lacolaco.smileessence.World; import net.lacolaco.smileessence.activity.MainActivity; import net.lacolaco.smileessence.data.PostState; import net.lacolaco.smileessence.entity.Tweet; import net.lacolaco.smileessence.logging.Logger; import net.lacolaco.smileessence.preference.UserPreferenceHelper; import net.lacolaco.smileessence.twitter.task.Tweets; import net.lacolaco.smileessence.util.BitmapThumbnailTask; import net.lacolaco.smileessence.util.IntentUtils; import net.lacolaco.smileessence.util.SystemServiceHelper; import net.lacolaco.smileessence.util.UIHandler; import net.lacolaco.smileessence.view.Partials; import java.io.File; public class PostFragment extends PageFragment implements TextWatcher, View.OnFocusChangeListener, View.OnClickListener, PostState.OnPostStateChangeListener { // ------------------------------ FIELDS ------------------------------ private EditText editText; private TextView textViewCount; private Button buttonTweet; private ViewGroup viewGroupReply; private ViewGroup viewGroupMedia; @Override public void refresh() { } // --------------------- Interface OnClickListener --------------------- @Override public void onClick(View v) { switch (v.getId()) { case R.id.button_post_delete: { deletePost(); break; } case R.id.button_post_media: { setImage(); break; } case R.id.button_post_tweet: { submitPost(); break; } case R.id.button_post_reply_delete: { deleteReply(); break; } case R.id.button_post_media_delete: { removeImage(); break; } case R.id.image_post_media: { displayImage(); break; } } } // --------------------- Interface OnFocusChangeListener --------------------- @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { SystemServiceHelper.showIM(getActivity(), editText); } else { SystemServiceHelper.hideIM(getActivity(), editText); } } // --------------------- Interface OnPostStateChangeListener --------------------- @Override public void onPostStateChange(final PostState postState) { Logger.debug("onPostStateChange"); final MainActivity activity = (MainActivity) getActivity(); if (editText != null) { final int start = postState.getSelectionStart(); final int end = postState.getSelectionEnd(); editText.removeTextChangedListener(this); editText.setTextKeepState(postState.getText()); editText.addTextChangedListener(this); updateTextCount(editText.getText()); new UIHandler().postAtFrontOfQueue(() -> editText.setSelection(start, end)); } if (viewGroupReply != null) { if (postState.getInReplyTo() != null) { viewGroupReply.setVisibility(View.VISIBLE); ImageButton imageButtonDeleteReply = (ImageButton) viewGroupReply.findViewById(R.id.button_post_reply_delete); imageButtonDeleteReply.setOnClickListener(this); Tweet tweet = postState.getInReplyTo(); View header = viewGroupReply.findViewById(R.id.layout_post_reply_status); header = Partials.getTweetView(tweet, activity, header, true); header.setBackgroundColor(ContextCompat.getColor(getActivity(), R.color.transparent)); header.setClickable(false); } else { viewGroupReply.setVisibility(View.GONE); } } if (viewGroupMedia != null) { ImageView imageViewMedia = (ImageView) viewGroupMedia.findViewById(R.id.image_post_media); if (TextUtils.isEmpty(postState.getMediaFilePath())) { viewGroupMedia.setVisibility(View.GONE); } else { viewGroupMedia.setVisibility(View.VISIBLE); } new BitmapThumbnailTask(postState.getMediaFilePath(), imageViewMedia).execute(); } } // --------------------- Interface TextWatcher --------------------- @Override public void beforeTextChanged(CharSequence s, int start, int count, int after) { } @Override public void onTextChanged(CharSequence s, int start, int before, int count) { updateTextCount(s); } private void updateTextCount(CharSequence s) { Validator validator = new Validator(); int remainingCount = 140 - validator.getTweetLength(s.toString()); if (!TextUtils.isEmpty(getWorld().getPostState().getMediaFilePath())) { remainingCount -= validator.getShortUrlLength(); } textViewCount.setText(String.valueOf(remainingCount)); if (remainingCount == 140 || remainingCount < 0) { textViewCount.setTextColor(ContextCompat.getColor(getActivity(), R.color.red)); } else { textViewCount.setTextAppearance(getActivity(), android.R.style.TextAppearance_Widget_TextView); } setStateFromView(); } @Override public void afterTextChanged(Editable s) { } // ------------------------ OVERRIDE METHODS ------------------------ @Override public void onCreate(Bundle savedInstanceState) { Logger.debug("onCreate"); super.onCreate(savedInstanceState); setHasOptionsMenu(true); } @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); SystemServiceHelper.showIM(getActivity(), editText); } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Logger.debug("onCreateView"); getWorld().getPostState().setListener(this); View v = inflater.inflate(R.layout.fragment_post, null); buttonTweet = getTweetButton(v); buttonTweet.setOnClickListener(this); editText = getEditText(v); textViewCount = getCountTextView(v); int textSize = UserPreferenceHelper.getInstance().getTextSize(); editText.addTextChangedListener(this); editText.setOnFocusChangeListener(this); editText.setTextSize(textSize + 4); editText.setMovementMethod(new ArrowKeyMovementMethod() { @Override protected boolean right(@NonNull TextView widget, Spannable buffer) { //Don't back to Home return widget.getSelectionEnd() == widget.length() || super.right(widget, buffer); } }); ImageButton imageButtonDeleteText = (ImageButton) v.findViewById(R.id.button_post_delete); imageButtonDeleteText.setOnClickListener(this); ImageButton imageButtonMedia = (ImageButton) v.findViewById(R.id.button_post_media); imageButtonMedia.setOnClickListener(this); //Reply view viewGroupReply = getReplyViewGroup(v); ImageButton imageButtonDeleteReply = (ImageButton) viewGroupReply.findViewById(R.id.button_post_reply_delete); imageButtonDeleteReply.setOnClickListener(this); //Media view viewGroupMedia = getMediaViewGroup(v); ImageView imageViewMedia = (ImageView) viewGroupMedia.findViewById(R.id.image_post_media); ImageButton imageButtonDeleteMedia = (ImageButton) viewGroupMedia.findViewById(R.id.button_post_media_delete); imageViewMedia.setOnClickListener(this); imageButtonDeleteMedia.setOnClickListener(this); editText.requestFocus(); return v; } @Override public void onDestroyView() { Logger.debug("onDestroyView"); super.onDestroyView(); setStateFromView(); getWorld().getPostState().removeListener(); } @Override public void onViewStateRestored(Bundle savedInstanceState) { Logger.debug("onViewStateRestored"); super.onViewStateRestored(savedInstanceState); PostState state = getWorld().getPostState(); onPostStateChange(state); } private void deletePost() { editText.setText(""); getWorld().getPostState().beginTransaction().setText("").setCursor(0).commit(); deleteReply(); } private void deleteReply() { viewGroupReply.setVisibility(View.GONE); getWorld().getPostState().beginTransaction().setInReplyTo(null).commit(); } private void displayImage() { Intent intent = new Intent(); intent.setAction(Intent.ACTION_VIEW); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setDataAndType(Uri.fromFile(new File(getWorld().getPostState().getMediaFilePath())), "image/*"); IntentUtils.startActivityIfFound(getActivity(), intent); } private TextView getCountTextView(View v) { return (TextView) v.findViewById(R.id.post_text_count); } private EditText getEditText(View v) { return (EditText) v.findViewById(R.id.post_edit_text); } private ViewGroup getMediaViewGroup(View v) { return (ViewGroup) v.findViewById(R.id.post_media_parent); } private ViewGroup getReplyViewGroup(View v) { return (ViewGroup) v.findViewById(R.id.post_inreplyto_parent); } private Button getTweetButton(View v) { return (Button) v.findViewById(R.id.button_post_tweet); } private void removeImage() { SystemServiceHelper.hideIM(getActivity(), editText); viewGroupMedia.setVisibility(View.GONE); ((ImageView) viewGroupMedia.findViewById(R.id.image_post_media)).setImageBitmap(null); getWorld().getPostState().beginTransaction().setMediaFilePath("").commit(); } private void setImage() { setStateFromView(); SystemServiceHelper.hideIM(getActivity(), editText); Intent intent = new Intent(Intent.ACTION_PICK); intent.setType("image/*"); IntentUtils.startActivityForResultIfFound(getActivity(), intent, MainActivity.REQUEST_GET_PICTURE_FROM_GALLERY); } private void setStateFromView() { PostState state = getWorld().getPostState(); state.removeListener(); state.beginTransaction() .setText(editText.getText().toString()) .setSelection(editText.getSelectionStart(), editText.getSelectionEnd()) .commit(); state.setListener(this); } private void submitPost() { SystemServiceHelper.hideIM(getActivity(), editText); setStateFromView(); PostState state = getWorld().getPostState(); MainActivity mainActivity = (MainActivity) getActivity(); boolean resizeFlag = UserPreferenceHelper.getInstance().get(R.string.key_setting_resize_post_image, false); new Tweets.CreateTask(getWorld().getAccount(), state.toStatusUpdate(), state.getMediaFilePath(), resizeFlag) .onDoneUI(t -> { getWorld().notify(R.string.notice_tweet_succeeded); getWorld().getPostState().beginTransaction().clear().commit(); }) .onFail(e -> getWorld().notifyError(R.string.notice_tweet_failed, e)) .execute(); mainActivity.openHomePage(); } }