package nliveroid.nlr.main;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;
import nliveroid.nlr.main.parser.TagInfoParser;
import nliveroid.nlr.main.parser.TagTokenParser;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnDismissListener;
import android.os.AsyncTask;
import android.text.TextUtils.TruncateAt;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
public class TagArrangeDialog extends Dialog implements OnDismissListener{
private TableLayout tagDispArea;
private GetTagInfo getTagInfoTask;
private EditText addEdit;
private Context context;
private TagArrangeDialog me;
private String token;
private ArrayList<TableRow> rowList;
private ArrayList<String> addTagList;
private ArrayList<String> deleteTagList;
private boolean isCanceled;
private int width;
public TagArrangeDialog(final Context context,final String sessionid,final String lv,final int width) {
super(context);
me = this;
this.width = width;
this.context = context;
requestWindowFeature(Window.FEATURE_NO_TITLE);
this.setOnDismissListener(this);
View parent = LayoutInflater.from(context).inflate(R.layout.tagarrange_dialog, null);
setContentView(parent);
rowList = new ArrayList<TableRow>();
addTagList = new ArrayList<String>();
deleteTagList = new ArrayList<String>();
//タグ情報を取得しに行く
getTagInfoTask = new GetTagInfo();
getTagInfoTask.execute(sessionid,lv);
tagDispArea = (TableLayout)parent.findViewById(R.id.tag_arrange_parent);
addEdit = (EditText)parent.findViewById(R.id.tag_add_edit);
addEdit.setWidth(width/2);
//登録
Button bt = (Button)parent.findViewById(R.id.tag_add_button);
bt.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
if(getTagInfoTask.getStatus() != AsyncTask.Status.FINISHED){
return;
}
//全く同じのは、登録できない
for(int i = 0; i < rowList.size(); i++){
if(addEdit.getText().toString().equals(((TextView)rowList.get(i).getChildAt(0)).getText().toString())){
addEdit.setText("");
return;
}
}
final String addValue = addEdit.getText().toString();
addTagList.add(addValue);
//配信時ロック付き追加はまだいいか
//UI生成部分
TableRow tr = new TableRow(context);
TextView tagText = new TextView(context);
tagText.setIncludeFontPadding(true);
tagText.setText(addValue);
Button delete = new Button(context);
delete.setText("削除");
delete.setTag(addValue);
delete.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
//追加予定にあったやつなら消す
if(addTagList.contains(v.getTag())){
addTagList.remove(v.getTag());
}else{//追加予定になかったやつなら消す命令をSENDする(消すコミットになる)
deleteTagList.add(addValue);
}
//ビューから消す
for(int i = 0; i < rowList.size(); i++){
if(((TextView)rowList.get(i).getChildAt(0)).getText().toString().equals(v.getTag())){
((TableLayout)rowList.get(i).getParent()).removeViewAt(i);
rowList.remove(i);
}
}
}
});
addEdit.setText("");
rowList.add(tr);
tr.addView(tagText,-1,-2);
tr.addView(delete,-1,-2);
tagDispArea.addView(tr,-1,-2);
tagText.setWidth(width/2);//長い名前を入力した時伸びていかないように対策
}
});
//完了
Button send = (Button)parent.findViewById(R.id.tag_send_button);
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(token == null||token.equals("")){
MyToast.customToastShow(context, "情報取得中です");
return;
}
if(addTagList != null||deleteTagList != null){
new SendTagArrange().execute(sessionid,lv);
}
me.dismiss();
}
});
}
public class GetTagInfo extends AsyncTask<String,Void,Integer>{
private boolean ENDFLAG;
private HashMap<String,Boolean> map = null;
@Override
protected Integer doInBackground(String... params) {
//タグトークンを取得する
try {
String sessionid = params[0];
//PC版ページにアクセス
HttpURLConnection con = (HttpURLConnection)new URL(URLEnum.PC_WATCHBASEURL+params[1]).openConnection();
con.setRequestProperty("Cookie", sessionid);
con.setRequestMethod("GET");
con.setInstanceFollowRedirects(false);
con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.16 Safari/534.24");
con.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
Log.d("log","RESPONSE " + con.getResponseCode());
InputStream source = con.getInputStream();
//保存
try {
TagTokenParser handler = new TagTokenParser(this);
org.ccil.cowan.tagsoup.Parser parser = new org.ccil.cowan.tagsoup.Parser();
parser.setContentHandler(handler);
parser.parse(new InputSource(source));
} catch (org.xml.sax.SAXNotRecognizedException e) {
// Should not happen.
e.printStackTrace();
} catch (org.xml.sax.SAXNotSupportedException e) {
// Should not happen.
e.printStackTrace();
} catch(UnknownHostException e){//接続悪い時になる
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
}
long startT = System.currentTimeMillis();
while(ENDFLAG){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
ENDFLAG = false;
e.printStackTrace();
return 1;
}catch(IllegalArgumentException e1){
e1.printStackTrace();
Log.d("NLiveRoid","IllegalArgumentException at GetTagInfo");
ENDFLAG = false;
return 1;
}
if(System.currentTimeMillis()-startT>60000){
//タイムアウト
ENDFLAG = false;
return -2;
}
}
source.close();
con.disconnect();
ENDFLAG = true;
if(token == null)return -1;
//タグ編集画面から、ロック情報を取得
//PC版ページにアクセス
HttpURLConnection con1 = (HttpURLConnection)new URL(URLEnum.TAGEDIT+params[1]+"?token="+token).openConnection();
con1.setRequestProperty("Cookie", sessionid);
con1.setRequestMethod("POST");
con1.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.0; WOW64) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.16 Safari/534.24");
con1.setInstanceFollowRedirects(false);
con1.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
Log.d("log","RESPONSE " + con1.getResponseCode());
InputStream source1 = con1.getInputStream();
try {
TagInfoParser handler = new TagInfoParser(this);
org.ccil.cowan.tagsoup.Parser parser = new org.ccil.cowan.tagsoup.Parser();
parser.setContentHandler(handler);
parser.parse(new InputSource(source1));
} catch (org.xml.sax.SAXNotRecognizedException e) {
// Should not happen.
e.printStackTrace();
} catch (org.xml.sax.SAXNotSupportedException e) {
// Should not happen.
e.printStackTrace();
} catch(UnknownHostException e){//接続悪い時になる
e.printStackTrace();
return -3;
}catch (IOException e) {
e.printStackTrace();
return -4;
} catch (SAXException e) {
e.printStackTrace();
return -4;
}
con1.disconnect();
long startT1 = System.currentTimeMillis();
while(ENDFLAG){
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
ENDFLAG = false;
e.printStackTrace();
return 1;//キャンセル
}catch(IllegalArgumentException e1){
e1.printStackTrace();
Log.d("NLiveRoid","IllegalArgumentException at GetTagInfo");
ENDFLAG = false;
return 1;
}
if(System.currentTimeMillis()-startT1>60000){
//タイムアウト
ENDFLAG = false;
return -2;
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
return -4;
} catch (IOException e) {
e.printStackTrace();
return -4;
}
return 0;
}
public void finishCallBack(String value) {
token = value;
ENDFLAG = false;
}
public void finishCallBack(HashMap<String,Boolean> value) {
map = value;
ENDFLAG = false;
}
public void finishErrorCallBack(){
map = null;
ENDFLAG = false;
}
@Override
protected void onPostExecute(Integer arg){
// Log.d("Log","onPostExecute ----- " + arg);
if(arg == 0&&map != null&&!isCanceled){
//レイアウトを再構成する
tagDispArea.removeAllViews();
Iterator<String> it = map.keySet().iterator();
tagDispArea.removeAllViews();
//取得したタグをリストビュー表示してrowListに突っ込む
while(it.hasNext()){
final String key = it.next().replace("\n|\t","");
//UI生成部分
TableRow tr = new TableRow(context);
TextView tagText = new TextView(context);
tagText.setIncludeFontPadding(true);
tagText.setText(key);
Button delete = new Button(context);
delete.setText("削除");
delete.setTag(key);
if(map.get(key)){
delete.setEnabled(false);
}
delete.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
//これは他人が書き込んだタグ(追加予定にはないはず)
deleteTagList.add(key);
//ビューから消す
for(int i = 0; i < rowList.size(); i++){
if(((TextView)rowList.get(i).getChildAt(0)).getText().toString().equals(v.getTag())){
((TableLayout)rowList.get(i).getParent()).removeViewAt(i);
rowList.remove(i);
}
}
}
});
rowList.add(tr);
tr.addView(tagText,-1,-2);
tr.addView(delete,-1,-2);
tagDispArea.addView(tr,-1,-2);
tagText.setWidth(width/2);//長い名前を入力した時伸びていかないように対策
}
}else{
switch(arg){
case 1:
//キャンセル
break;
case -1:
MyToast.customToastShow(context, "チャンネル等のタグ編集非対応コミュでした\n(Token failed)");
break;
case -2:
MyToast.customToastShow(context, "エラー\n接続タイムアウト");
break;
case -3:
MyToast.customToastShow(context, "接続エラー");
break;
case -4:
MyToast.customToastShow(context, "タグ情報取得エラー");
break;
default:
if(!isCanceled){
MyToast.customToastShow(context, "設定により編集できない");
}
break;
}
me.dismiss();
}
}
}
/**
* 編集中に画面回転
* @param scale
*/
public void onConfigChanged(int scale) {
width = scale;
if(addEdit != null){
addEdit.setWidth(width/2);
}
if(tagDispArea != null){
tagDispArea.setLayoutParams(new TableRow.LayoutParams(-1,-2));
tagDispArea.requestLayout();
}
//テーブルのテキスト部分をレイアウトし直す
TableRow tempRow = null;
for(int i = 0; i < tagDispArea.getChildCount(); i++){
tempRow = (TableRow) tagDispArea.getChildAt(i);
for(int j = 0; j < tempRow.getChildCount(); j++){
if(tempRow.getChildAt(j).getClass().getName().equals(TextView.class.getName())){
((TextView)tempRow.getChildAt(j)).setWidth(width/2);
}
}
}
}
//タグ編集コミットタスク
class SendTagArrange extends AsyncTask<String,Void,Integer>{
@Override
protected Integer doInBackground(String... params) {
HttpURLConnection con = null;
try {
for(int i = 0; i < addTagList.size(); i++){
con = (HttpURLConnection) new URL(URLEnum.TAGEDIT+params[1]+"?add="+URLEncoder.encode(addTagList.get(i),"UTF-8")+"&token="+token).openConnection();
// Log.d("Log","ADD TAG ---- " + addTagList.get(i));
con.setRequestProperty("Cookie", params[0]);
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
if(con.getResponseCode() != 200){
return -1;
}
}
for(int i = 0; i < deleteTagList.size() ; i++){
con = (HttpURLConnection) new URL(URLEnum.TAGEDIT+params[1]+"?del="+URLEncoder.encode(deleteTagList.get(i),"UTF-8")+"&token="+token).openConnection();
// Log.d("Log","DELETE TAG ---- " + deleteTagList.get(i));
con.setRequestProperty("Cookie", params[0]);
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
if(con.getResponseCode() != 200){
return -1;
}
}
con = (HttpURLConnection) new URL(String.format(URLEnum.TAGCOMMIT,params[1])).openConnection();
con.setRequestProperty("Cookie", params[0]);
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded");
if(con.getResponseCode() != 200){
return -2;
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return 0;
}
@Override
protected void onPostExecute(Integer arg){
if(arg < 0){
MyToast.customToastShow(context, "タグ編集に失敗\nコネクションエラー");
}
}
}
@Override
public void onDismiss(DialogInterface arg0) {
isCanceled = true;
}
}