package nliveroid.nlr.main;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import nliveroid.nlr.main.ColorPickerView.OnColorChangedListener;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView;
public class HandleNamePicker extends Dialog implements ColorPickable{
private HandleNamePicker me;
private Activity ACT;
private OnColorChangedListener mListener;
protected int mInitialBgColor;
protected int mInitialFoColor;
private String mInitialText;
private String user_id;
private ColorPickerView bgPickerView;
private ColorPickerView foPickerView;
private boolean isLiving;
private ProgressDialog p;
private TextView editText;
public HandleNamePicker(Activity context,
OnColorChangedListener listener, int initialBgColor, int initialFoColor,String id,String nickname,boolean isLiving) {
super(context);
ACT = context;
this.mListener = listener;
this.mInitialBgColor = initialBgColor;
this.mInitialFoColor = initialFoColor;
this.mInitialText = nickname;
this.user_id = id;
this.isLiving = isLiving;
}
@Override
public void onCreate(Bundle bundle){
super.onCreate(bundle);
me = this;
LayoutInflater inflater = LayoutInflater.from(ACT);
View parent = inflater.inflate(R.layout.colordialog_extend, null);
setTitle(user_id);
OnColorChangedListener myColorChangeListener = new OnColorChangedListener() {
public void colorChanged(int color) {
mListener.colorChanged(color);
dismiss();
}
};
editText = (EditText)parent.findViewById(R.id.chooseredit);
editText.setText(mInitialText);
editText.setBackgroundColor(mInitialBgColor);
editText.setTextColor(mInitialFoColor);
final LinearLayout rootLinearLayout = (LinearLayout)parent.findViewById(R.id.colorchooser_root);
//親のLinearLayoutにピッカー部分をアドする
bgPickerView = new ColorPickerView(ACT,this, myColorChangeListener, mInitialBgColor,true);
foPickerView = new ColorPickerView(ACT,this, myColorChangeListener, mInitialFoColor,false);
//初めは背景色にする
rootLinearLayout.addView(bgPickerView);
final SeekBar seek = (SeekBar)parent.findViewById(R.id.color_dialog_seek);
seek.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == KeyEvent.ACTION_DOWN){
if(seek.getProgress() == 0){
seek.setProgress(1);
rootLinearLayout.removeAllViews();
rootLinearLayout.addView(foPickerView);
}else{
seek.setProgress(0);
rootLinearLayout.removeAllViews();
rootLinearLayout.addView(bgPickerView);
}
}
return true;
}
});
Button ok = (Button)parent.findViewById(R.id.chooser_button0);
ok.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View arg0) {
Matcher escape = Pattern.compile("<|>|/|\"").matcher(editText.getText().toString());
if(escape.find()){
MyToast.customToastShow(ACT, "<,>,/,\"は含めません");
return;
}
((HandleNamable) ACT).setHandleName(bgPickerView.getCenterColor(),foPickerView.getCenterColor(),editText.getText().toString());
me.dismiss();
}
});
Button cancel = (Button)parent.findViewById(R.id.chooser_button1);
cancel.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View arg0) {
me.dismiss();
}
});
Button getusername = (Button)parent.findViewById(R.id.chooser_getusername);
Button user_operation = (Button)parent.findViewById(R.id.chooser_userpage);
Matcher mc = Pattern.compile("[^0-9]").matcher(user_id);//数値以外
if(mc.find()){
user_operation.setEnabled(false);
getusername.setEnabled(false);
}else{
user_operation.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View arg0) {
me.dismiss();
new AlertDialog.Builder(ACT)
.setItems(new CharSequence[]{"ブラウザでユーザーページ","お気に入りユーザー"},new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
switch(which){
case 0:
transitionUserPage();
break;
case 1:
new FavoriteUser().execute();
break;
}
}
}).create().show();
}
});
getusername.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View arg0) {
new GetSimpleUserName().execute();
}
});
}
Button commentlist = (Button)parent.findViewById(R.id.chooser_commentlist);
if(!isLiving){
commentlist.setVisibility(View.GONE);
}else{
commentlist.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View arg0) {
me.dismiss();
((HandleNamable)ACT).createCommentedList(user_id);
}
});
}
setContentView(parent);
}
class GetSimpleUserName extends AsyncTask<Void, Void, String> {
private ErrorCode error;
protected GetSimpleUserName() {
NLiveRoid app = (NLiveRoid)ACT.getApplicationContext();
error = app.getError();
}
@Override
protected String doInBackground(Void... arg0) {
try {
if(NLiveRoid.isDebugMode)Log.d("NLiveRoid","GetSimpleUserName " + user_id);
if (user_id == null || user_id.equals(""))
return null;
HttpURLConnection con = (HttpURLConnection) new URL(
URLEnum.USERPAGE + user_id).openConnection();
con.setRequestProperty("Cookie",
Request.getSessionID(error));
con.setRequestProperty("User-Agent", Request.user_agent);
if(error == null || error.getErrorCode() != 0){
return null;
}
InputStream is = con.getInputStream();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int size = 0;
byte[] byteArray = new byte[1024];
while ((size = is.read(byteArray)) != -1) {
bos.write(byteArray, 0, size);
}
byteArray = bos.toByteArray();
bos.close();
String result = "";
String test = new String(byteArray, "UTF-8");
Log.d("NLiveRoid"," TEST " + test);
Matcher mc = Pattern.compile("<h2><strong>.+</strong>さん</h2>")
.matcher(test);
if (mc.find()) {
result = mc.group();
result = result.substring(12, result.length() - 16);
return result;
}else{
Matcher mc1 = Pattern.compile("<h2>.+<small>さん</small></h2>")
.matcher(new String(byteArray, "UTF-8"));
if (mc1.find()) {
result = mc1.group();
result = result.substring(4, result.length() - 22);
return result;
}
}
Log.d("NLiveRoid","Name not Found");
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String arg) {
if (arg == null||arg.equals("")) {
if(error != null){
error.showErrorToast();
}else{
MyToast.customToastShow(ACT, "ユーザ名取得に失敗");// 自動取得の場合ださないようにする必要がある
}
}
editText.setText(arg);
}
}
public void transitionUserPage() {
if (user_id == null || user_id.equals(""))
return;
String url = URLEnum.USERPAGE + user_id;
Uri uri = Uri.parse(url);
Intent i = new Intent(Intent.ACTION_VIEW);
i.addCategory(Intent.CATEGORY_BROWSABLE);
i.setDataAndType(uri, "text/html");
ACT.startActivity(i);// とりあえず何も返却値とらない
}
private class FavoriteUser extends AsyncTask<Void,Void,Integer>{
private ErrorCode error;
protected FavoriteUser(){
NLiveRoid app = (NLiveRoid)ACT.getApplicationContext();
error = app.getError();
if(p==null)p = new ProgressDialog(ACT);
p.setMessage("情報取得中");
p.show();
}
@Override
public void onCancelled(){
super.onCancelled();
if(p != null && p.isShowing())p.cancel();
}
@Override
protected Integer doInBackground(Void... params) {
if(NLiveRoid.isDebugMode)Log.d("NLiveRoid","FavoriteUser " + user_id);
if (user_id == null || user_id.equals(""))
return -1;
try{
//PC版を見に行ってトークンを取得
HttpURLConnection con = (HttpURLConnection) new URL(
URLEnum.USERPAGE + user_id).openConnection();
con.setRequestProperty("Cookie",
Request.getSessionID(error));
if(error == null || error.getErrorCode() != 0){
return 0;
}
InputStream is = con.getInputStream();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int size = 0;
byte[] byteArray = new byte[1024];
while ((size = is.read(byteArray)) != -1) {
bos.write(byteArray, 0, size);
}
byteArray = bos.toByteArray();
String source = new String(byteArray,"UTF-8");
final Matcher isWatch = Pattern.compile("watchBtns.*class=\"noWatching\"").matcher(source);
if (isWatch.find()) {//まだお気に入りにされていない
Log.d("NLiveRoid","Did't watching " );
final Matcher token_mc = Pattern.compile("Globals.hash.*?=.*?'.*.*?'")
.matcher(source);
if(!token_mc.find())return -12;
final Matcher reg_mc = Pattern.compile("watchRegisterBtn.*register:[0-9]+").matcher(source);
if(reg_mc.find()){
final String[] reg = reg_mc.group().split(":");
if(reg.length < 2||reg[1] == null || reg[1].equals("")){
return -10;
}
ACT.runOnUiThread(new Runnable(){
@Override
public void run() {
if(p != null && p.isShowing()){
p.cancel();
}
new AlertDialog.Builder(ACT).setMessage("このユーザーをお気に入りに追加しますか?")
.setPositiveButton("YES", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if(p==null)p = new ProgressDialog(ACT);
p.setMessage("追加中...");
p.show();
favorite(true,token_mc.group().replaceAll("Globals.hash| |=|'", ""),reg[1]);
}
}).setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).create().show();
}
});
}else{
return -11;
}
}else{//すでにお気に入りにされている
Log.d("NLiveRoid","Already watching " );
final Matcher token_mc = Pattern.compile("Globals.hash.*?=.*?'.*.*?'")
.matcher(source);
if(!token_mc.find())return -12;
final Matcher reg_mc = Pattern.compile("watchRegisterBtn.*register:[0-9]+").matcher(source);
if(reg_mc.find()){
final String[] reg = reg_mc.group().split(":");
if(reg.length < 2||reg[1] == null || reg[1].equals("")){
return -10;
}
ACT.runOnUiThread(new Runnable(){
@Override
public void run() {
if(p != null && p.isShowing()){
p.cancel();
}
new AlertDialog.Builder(ACT).setMessage("このユーザーのお気に入りを解除しますか?")
.setPositiveButton("YES", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if(p==null)p = new ProgressDialog(ACT);
p.setMessage("解除中...");
p.show();
favorite(false,token_mc.group().replaceAll("Globals.hash| |=|'", ""),reg[1]);
}
}).setNegativeButton("CANCEL", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
}).create().show();
}
});
}else{
return -11;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
private void favorite(final boolean isAdd,final String token,final String reg) {
Log.d("NLiveRoid","PARAMS ---- " + token + " " + reg);
new AsyncTask<Void,Void,Integer>(){
@Override
public void onCancelled(){
super.onCancelled();
if(p != null && p.isShowing())p.cancel();
}
@Override
protected Integer doInBackground(Void... params) {
HttpURLConnection con2;
try {
con2 = (HttpURLConnection) new URL(
URLEnum.FAVARITE_API + (isAdd? "add":"delete")).openConnection();
con2.setRequestProperty("Cookie",
Request.getSessionID(error));//セッションセットはいらないかもしれない
if(error == null || error.getErrorCode() != 0){
return 0;
}
con2.setDoOutput(true);
PrintStream out = new PrintStream(con2.getOutputStream());
out.print((isAdd? "item_type=1&item_id="+reg +"&token="+token:"id_list[1][]="+reg+"&token="+token));
InputStream is = con2.getInputStream();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int size = 0;
byte[] byteArray = new byte[1024];
while ((size = is.read(byteArray)) != -1) {
bos.write(byteArray, 0, size);
}
String response = new String(bos.toByteArray(),"UTF-8");
is.close();
bos.close();
Log.d("NLiveRoid","Favorite Response " + response);
if(response.matches(".*status.*ok.*")){
return 1;
}else if(response.contains("error")){
return -1;
}
con2.disconnect();
} catch (MalformedURLException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
} catch (IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
return 0;
}
@Override
protected void onPostExecute(Integer arg){
if(p != null && p.isShowing()){
p.cancel();
}
if(arg == 1){
if(isAdd){
MyToast.customToastShow(ACT, "お気に入りユーザーに追加しました");
}else{
MyToast.customToastShow(ACT, "お気に入りユーザーを解除しました");
}
}else if(arg == -1){
if(isAdd){
MyToast.customToastShow(ACT, "お気に入り追加処理に失敗");
}else{
MyToast.customToastShow(ACT, "お気に入り解除処理に失敗");
}
}
}
}.execute();
}
@Override
protected void onPostExecute(Integer arg){
if(p != null && p.isShowing()){
p.cancel();
}
if(arg == 0){
if(error != null){
error.showErrorToast();
}
}else if(arg == -11){
MyToast.customToastShow(ACT, "処理に失敗(ボタン未検出→自分を登録?)");
}else{
MyToast.customToastShow(ACT, "謎の問題が発生:code"+arg);
}
}
}
@Override
public void setETColor(int color, boolean isBg) {
if(isBg){
editText.setBackgroundColor(color);
}else{
editText.setTextColor(color);
}
}
}