package net.miz_hi.smileessence.view.fragment.impl;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.os.Bundle;
import android.text.Spannable;
import android.text.method.ArrowKeyMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.*;
import com.android.volley.toolbox.NetworkImageView;
import net.miz_hi.smileessence.Client;
import net.miz_hi.smileessence.R;
import net.miz_hi.smileessence.cache.ImageCache;
import net.miz_hi.smileessence.cache.UserCache;
import net.miz_hi.smileessence.dialog.ConfirmDialog;
import net.miz_hi.smileessence.dialog.SelectPictureDialog;
import net.miz_hi.smileessence.listener.PostEditTextListener;
import net.miz_hi.smileessence.menu.MainMenu;
import net.miz_hi.smileessence.menu.PostingMenu;
import net.miz_hi.smileessence.model.status.tweet.TweetModel;
import net.miz_hi.smileessence.model.status.user.UserModel;
import net.miz_hi.smileessence.notification.Notificator;
import net.miz_hi.smileessence.preference.EnumPreferenceKey;
import net.miz_hi.smileessence.status.StatusViewFactory;
import net.miz_hi.smileessence.status.TweetUtils;
import net.miz_hi.smileessence.system.PostSystem;
import net.miz_hi.smileessence.system.PostSystem.PostPageState;
import net.miz_hi.smileessence.task.Task;
import net.miz_hi.smileessence.task.impl.GetUserTask;
import net.miz_hi.smileessence.theme.IColorTheme;
import net.miz_hi.smileessence.twitter.ResponseConverter;
import net.miz_hi.smileessence.util.UiHandler;
import net.miz_hi.smileessence.view.activity.MainActivity;
import net.miz_hi.smileessence.view.fragment.NamedFragment;
import twitter4j.User;
@SuppressLint("ValidFragment")
public class PostFragment extends NamedFragment implements OnClickListener
{
TextView textCount;
EditText editText;
FrameLayout frameInReplyTo;
ImageView imagePict;
NetworkImageView iconView;
TextView screenNameView;
boolean inited = false;
@Override
public String getTitle()
{
return "Post";
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
IColorTheme theme = Client.getSettings().getTheme();
View page = inflater.inflate(R.layout.post_layout, container, false);
page.setBackgroundColor(getResources().getColor(theme.getBackground1()));
editText = (EditText) page.findViewById(R.id.editText_tweet);
frameInReplyTo = (FrameLayout) page.findViewById(R.id.frame_inreplyto);
imagePict = (ImageView) page.findViewById(R.id.image_pict);
textCount = (TextView) page.findViewById(R.id.textView_count);
textCount.setTextColor(getResources().getColor(theme.getNormalTextColor()));
Button imageButtonSubmit = (Button) page.findViewById(R.id.imBtn_tweet);
ImageButton imageButtonDelete = (ImageButton) page.findViewById(R.id.post_delete);
ImageButton imageButtonMenu = (ImageButton) page.findViewById(R.id.post_menu);
ImageButton imageButtonPict = (ImageButton) page.findViewById(R.id.post_pickpict);
ImageButton config = (ImageButton) page.findViewById(R.id.post_config);
config.setImageResource(theme.getConfigIcon());
config.setOnClickListener(this);
iconView = (NetworkImageView) page.findViewById(R.id.post_myIcon);
screenNameView = (TextView) page.findViewById(R.id.post_myName);
screenNameView.setTextColor(getResources().getColor(theme.getNormalTextColor()));
PostEditTextListener listener = new PostEditTextListener(textCount);
editText.setTextSize(Client.getSettings().getTextSize() + 3);
editText.addTextChangedListener(listener);
editText.setOnFocusChangeListener(listener);
editText.setMovementMethod(new ArrowKeyMovementMethod()
{
@Override
protected boolean right(TextView widget, Spannable buffer)
{
//Homeタブに戻るのを阻止
return widget.getSelectionEnd() == widget.length() || super.right(widget, buffer);
}
});
if(Client.<Boolean>getPreferenceValue(EnumPreferenceKey.OPEN_IME))
{
editText.requestFocus();
}
imageButtonSubmit.setOnClickListener(this);
imageButtonDelete.setImageResource(theme.getDeleteIcon());
imageButtonDelete.setOnClickListener(this);
imageButtonMenu.setImageResource(theme.getMenuIcon());
imageButtonMenu.setOnClickListener(this);
imageButtonPict.setImageResource(theme.getPictureIcon());
imageButtonPict.setOnClickListener(this);
imagePict.setOnClickListener(this);
loadState();
if(Client.getMainAccount() != null)
{
initMyInformation();
}
return page;
}
@Override
public void onPause()
{
super.onPause();
saveState();
}
@Override
public void onSelected()
{
loadState();
openIme();
}
@Override
public void onDeselect()
{
saveState();
hideIme();
}
public PostPageState getState()
{
return PostSystem.getState();
}
public void loadState()
{
PostPageState state = getState();
if(editText != null)
{
String text = state.getText();
int selectionStart = state.getSelectionStart();
int selectionEnd = state.getSelectionEnd();
setText(text);
setSelection(selectionStart, selectionEnd);
}
if(frameInReplyTo != null)
{
long inReplyTo = state.getInReplyToStatusId();
setInReplyTo(inReplyTo);
}
if(imagePict != null)
{
String picturePath = state.getPicturePath();
setPicture(picturePath);
}
if(!inited && iconView != null && Client.getMainAccount() != null)
{
initMyInformation();
}
}
/**
* save to state: text, cursor
*/
public void saveState()
{
if(editText != null)
{
String text = editText.getText().toString();
int start = editText.getSelectionStart();
int end = editText.getSelectionEnd();
PostPageState state = getState();
state.setText(text);
state.setSelectionStart(start);
state.setSelectionEnd(end);
}
}
private void initMyInformation()
{
UserModel me = UserCache.get(Client.getMainAccount().getUserId());
if(me != null)
{
ImageCache.setImageToView(me.iconUrl, iconView);
screenNameView.setText(me.screenName);
}
else
{
new GetUserTask(Client.getMainAccount().getUserId())
{
@Override
public void onPostExecute(User result)
{
if(result != null)
{
UserModel model = ResponseConverter.convert(result);
ImageCache.setImageToView(model.iconUrl, iconView);
screenNameView.setText(model.screenName);
}
}
}.callAsync();
}
inited = true;
}
public void setText(String s)
{
editText.setText(s);
}
public void setSelection(int start, int end)
{
if(start < 0 || end < 0)
{
editText.setSelection(0);
}
else if(start > editText.length())
{
editText.setSelection(editText.length());
}
else if(end > editText.length())
{
editText.setSelection(start, editText.length());
}
else
{
editText.setSelection(start, end);
}
}
public void setInReplyTo(final long l)
{
if(l == PostSystem.NONE_ID)
{
frameInReplyTo.setVisibility(View.GONE);
}
else
{
new Task<View>()
{
@Override
public void onPreExecute()
{
}
@Override
public void onPostExecute(View result)
{
frameInReplyTo.removeAllViewsInLayout();
frameInReplyTo.addView(result);
frameInReplyTo.setVisibility(View.VISIBLE);
}
@Override
public View call() throws Exception
{
TweetModel status = TweetUtils.getOrCreateStatusModel(l);
return StatusViewFactory.newInstance(MainActivity.getInstance().getLayoutInflater(), null).getStatusView(status);
}
}.callAsync();
}
}
public void setPicture(final String path)
{
if(path == null)
{
imagePict.setVisibility(View.GONE);
return;
}
new Task<Bitmap>()
{
@Override
public void onPreExecute()
{
}
@Override
public void onPostExecute(Bitmap result)
{
imagePict.setImageBitmap(result);
imagePict.setVisibility(View.VISIBLE);
}
@Override
public Bitmap call() throws Exception
{
Options opt = new Options();
opt.inPurgeable = true; // GC可能にする
opt.inSampleSize = 2;
return BitmapFactory.decodeFile(path, opt);
}
}.callAsync();
}
public void clear()
{
editText.setText("");
setInReplyTo(PostSystem.NONE_ID);
PostSystem.clear(true);
removePicture();
}
public void clearBySubmit()
{
editText.setText("");
setInReplyTo(PostSystem.NONE_ID);
PostSystem.clear(false);
imagePict.setVisibility(View.GONE);
}
public void removePicture()
{
if(imagePict.isShown())
{
ConfirmDialog.show(MainActivity.getInstance(), "画像の投稿を取り消しますか?", new Runnable()
{
@Override
public void run()
{
getState().setPicturePath(null);
imagePict.setVisibility(View.GONE);
Notificator.info("取り消しました");
}
});
}
}
public void openIme()
{
if(editText != null)
{
new UiHandler()
{
@Override
public void run()
{
if(Client.<Boolean>getPreferenceValue(EnumPreferenceKey.OPEN_IME))
{
InputMethodManager imm = (InputMethodManager) Client.getMainActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.showSoftInput(editText, 0);
}
}
}.postDelayed(100);
}
}
public void hideIme()
{
if(editText != null)
{
InputMethodManager imm = (InputMethodManager) Client.getMainActivity().getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(editText.getWindowToken(), 0);
}
}
@Override
public void onClick(View v)
{
switch(v.getId())
{
case R.id.imBtn_tweet:
{
if(PostSystem.submit(editText.getText().toString()))
{
if(Client.<Boolean>getPreferenceValue(EnumPreferenceKey.AFTER_SUBMIT))
{
MainActivity.getInstance().getViewPager().setCurrentItem(1);
}
clearBySubmit();
}
break;
}
case R.id.post_menu:
{
saveState();
hideIme();
new PostingMenu(getActivity()).create().show();
break;
}
case R.id.post_pickpict:
{
saveState();
hideIme();
new SelectPictureDialog(getActivity()).create().show();
break;
}
case R.id.post_delete:
{
ConfirmDialog.show(getActivity(), "全消去しますか?", new Runnable()
{
@Override
public void run()
{
clear();
}
});
break;
}
case R.id.image_pict:
{
removePicture();
break;
}
case R.id.post_config:
{
saveState();
hideIme();
new MainMenu(getActivity()).create().show();
break;
}
default:
break;
}
}
}