/** * */ package com.example.fudanbbs; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URI; import java.net.URL; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import java.lang.StringBuilder; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import com.example.fudanbbs.BoardActivity.TopicListAsyncTask; import android.R.color; import android.app.ActionBar; import android.app.Activity; import android.app.AlertDialog; import android.app.ProgressDialog; import android.content.ContentResolver; import android.content.Intent; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.opengl.Visibility; import android.os.AsyncTask; import android.os.Bundle; import android.provider.MediaStore; import android.provider.OpenableColumns; import android.util.Log; import android.view.MenuItem; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; /** * @author Joseph.Zhong * */ public class NewTopicActivity extends Activity { private TextView TVBoardname; private EditText NewTopicTitle, ETEditText; private Button ButtonUpload, ButtonNewpost; private String board, boardURL, boardname, bid, attachmentenability; private ArrayList<String> attachmenturlarraylist; private String TAG = "#########"+this.getClass().getName(); private LinearLayout imagelayout; private ProgressDialog progressdialog; private AlertDialog.Builder builder; private HashMap<String, String> cookie; private FudanBBSApplication currentapplication; private NewpostAsyncTask asynctask; private int attachmentmaxsize; private GetNewPostPageAsyncTask getnewpostasynctask; private UploadAttachmentAsyncTask uploadattachementasynctask; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); currentapplication = (FudanBBSApplication)getApplication(); if(currentapplication.isCurrentUserGuest()){ setContentView(R.layout.notloginmessage); Button BtnGologin = (Button) findViewById(R.id.gologin); BtnGologin.setOnClickListener(new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(); intent.setClassName(getApplicationContext(), "com.example.fudanbbs.LoginActivity"); startActivityForResult(intent, 1); } }); }else{ generateNewTopicView(); } } public void generateNewTopicView(){ setContentView(R.layout.newtopic); ActionBar actionbar = getActionBar(); actionbar.setDisplayOptions(ActionBar.DISPLAY_SHOW_HOME); actionbar.setDisplayHomeAsUpEnabled(true); actionbar.setIcon(new ColorDrawable(color.transparent)); actionbar.setTitle(getResources().getString(R.string.newposttitle)); progressdialog = new ProgressDialog(this); progressdialog.setCancelable(false); progressdialog.setCanceledOnTouchOutside(false); progressdialog.setProgressStyle(progressdialog.STYLE_SPINNER); builder = new AlertDialog.Builder(this); builder.setIcon(R.drawable.as1).setTitle(R.string.newpostfailed); builder.setPositiveButton("OK", null); attachmenturlarraylist = new ArrayList<String>(); Bundle bundle = getIntent().getExtras(); bid = bundle.getString("bid"); boardname = bundle.getString("boardname"); TVBoardname = (TextView) findViewById(R.id.newtopicboardname); TVBoardname.setText(boardname); NewTopicTitle = (EditText) findViewById(R.id.newtopictitle); ETEditText = (EditText) findViewById(R.id.newpostedittext); imagelayout = (LinearLayout)findViewById(R.id.imagelayout); ButtonUpload = (Button) findViewById(R.id.uploadattachmentbutton); ButtonNewpost = (Button) findViewById(R.id.newpostbutton); OnClickListener listener = new OnClickListener(){ @Override public void onClick(View v) { // TODO Auto-generated method stub switch(v.getId()){ // to upload an attachment case R.id.uploadattachmentbutton: Intent intent = new Intent(); intent.setAction(Intent.ACTION_GET_CONTENT); intent.setType("image/*"); Log.v(TAG, "startActivityForResult"); startActivityForResult(intent, 1); break; // to post a new topic case R.id.newpostbutton: if(NewTopicTitle.getText().toString().trim().equals("")){ builder.setMessage(getResources().getString(R.string.titlenotnull)); builder.show(); }else{ asynctask = new NewpostAsyncTask(); asynctask.execute(); break; } } } }; ButtonUpload.setOnClickListener(listener); ButtonNewpost.setOnClickListener(listener); getnewpostasynctask = new GetNewPostPageAsyncTask(); getnewpostasynctask.execute(); } @Override public boolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub // return super.onOptionsItemSelected(item); switch(item.getItemId()){ case android.R.id.home: finish(); break; } return true; } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // TODO Auto-generated method stub Log.v("####image", String.valueOf(requestCode)+String.valueOf(resultCode)); if(requestCode == 1 && null != data && data.getBooleanExtra("result", false) ){ generateNewTopicView(); }else if (resultCode == RESULT_OK) { Uri uri = data.getData(); Log.v("uri", uri.toString()); ContentResolver cr = this.getContentResolver(); String [] proj={MediaStore.Images.Media.DATA, MediaStore.Images.Media.SIZE, MediaStore.Images.Media.DISPLAY_NAME, MediaStore.Images.Media.MIME_TYPE}; Cursor cursor = cr.query(uri, proj, null, null, null); int sizeindex = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.SIZE); int intfilepath = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); int intdisplayname = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DISPLAY_NAME); int intmimetype = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.MIME_TYPE); cursor.moveToFirst(); long size = cursor.getLong(sizeindex); String filepath = cursor.getString(intfilepath); String filename = cursor.getString(intdisplayname); String mimetype = cursor.getString(intmimetype); cursor.close(); Log.v(TAG, Long.toString(size)); Log.v(TAG, "file path is "+filepath); if(size>=attachmentmaxsize){ builder.setMessage(getResources().getString(R.string.attachementsizeerror1)+attachmentmaxsize/1024 + getResources().getString(R.string.attachementsizeerror2)); builder.show(); }else{ UploadAttachmentAsyncTask uploadattachmentasynctask = new UploadAttachmentAsyncTask(); uploadattachmentasynctask.execute(filepath, filename, mimetype); } } super.onActivityResult(requestCode, resultCode, data); } protected class GetNewPostPageAsyncTask extends AsyncTask<Object, Object, Object>{ @Override protected void onPreExecute() { // TODO Auto-generated method stub progressdialog.setMessage(getString(R.string.generatenewpostpage)); progressdialog.show(); cookie = new HashMap<String, String>(); cookie = currentapplication.get_cookie(); attachmentenability = "0"; Log.v(TAG, "onPreExecute"); super.onPreExecute(); } @Override protected void onPostExecute(Object result) { // TODO Auto-generated method stub super.onPostExecute(result); if(attachmentenability.equals("0")){ ButtonUpload.setVisibility(View.GONE); Log.v(TAG, "attachment disabled"); }else{ Log.v(TAG, "attachment enabled"); } if(progressdialog.isShowing()){ progressdialog.dismiss(); } Log.v(TAG, "onPostExecute"); } @Override protected Object doInBackground(Object... params) { // TODO Auto-generated method stub String url = "http://bbs.fudan.edu.cn/bbs/pst?bid="+bid; Log.v(TAG, url); Document doc; try { if(cookie.get("utmpuser")!=null){ doc = Jsoup.connect(url).cookies(cookie).get(); }else{ doc = Jsoup.connect(url).get(); } Elements elements = doc.getElementsByTag("bbspst"); for(Element element : elements){ board = element.attr("brd"); attachmentenability = element.attr("att").trim(); Log.v(TAG, board+" "+bid+" "+attachmentenability); } if(attachmentenability.equals("1")){ url = "http://bbs.fudan.edu.cn/bbs/preupload?board="+board; if(cookie.get("utmpuser")!=null){ doc = Jsoup.connect(url).cookies(cookie).get(); }else{ doc = Jsoup.connect(url).get(); } elements = doc.getElementsByTag("max"); for(Element element : elements){ attachmentmaxsize = Integer.valueOf(element.text().toString().trim()); attachmentmaxsize = attachmentmaxsize; Log.v(TAG, "max attachment size is "+attachmentmaxsize); } } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } } protected class NewpostAsyncTask extends AsyncTask<Object, Object, Object>{ private HashMap<String, String> cookie; private StringBuffer cookiestring; private HttpURLConnection con; private String topictitle, topictext, topiccontent; private int responsecode; @Override protected void onPreExecute() { // TODO Auto-generated method stub progressdialog.setMessage(getString(R.string.newposting)); progressdialog.show(); currentapplication = (FudanBBSApplication)getApplication(); cookie = new HashMap<String, String>(); cookie = currentapplication.get_cookie(); cookiestring = new StringBuffer(); for(String key :cookie.keySet()){ cookiestring.append(key).append("=").append(cookie.get(key)).append(";"); } cookiestring.deleteCharAt(cookiestring.length()-1); topictitle = NewTopicTitle.getText().toString().trim(); topictext = ETEditText.getText().toString().trim()+"\n"; if(attachmenturlarraylist.size()>0){ for(String attachment : attachmenturlarraylist){ topictext = "\n"+topictext + attachment + "\n"; Log.v(TAG, "attachment url is"+attachment); } } topictext = topictext+"\n\n"+getResources().getString(R.string.signature); Log.v(TAG, "onPreExecute"); super.onPreExecute(); } @Override protected void onPostExecute(Object result) { // TODO Auto-generated method stub super.onPostExecute(result); if(200 == responsecode){ Toast.makeText(getApplicationContext(), getResources().getString(R.string.newpostsuccess), Toast.LENGTH_SHORT).show(); finish(); } if(progressdialog.isShowing()){ progressdialog.dismiss(); } Log.v(TAG, "onPostExecute"); } @Override protected Object doInBackground(Object... params) { // TODO Auto-generated method stub try { URL url = new URL("http://bbs.fudan.edu.cn/bbs/snd?bid="+bid+"&f=&e=0"); con = (HttpURLConnection) url.openConnection(); con.setRequestMethod("POST"); con.setConnectTimeout(15000); con.setDoInput(true); con.setDoOutput(true); con.setUseCaches(false); con.setRequestProperty("Cookie", cookiestring.toString()); con.setRequestProperty("Charset", "utf-8"); con.setRequestProperty("Referer", "http://bbs.fudan.edu.cn/bbs/pst?bid="+bid); con.setRequestProperty("Connection", "keep-alive"); con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); con.setRequestProperty("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3"); con.connect(); DataOutputStream ds = new DataOutputStream(con.getOutputStream()); StringBuffer content = new StringBuffer("title="+topictitle+"&sig=1&text="+topictext); Log.v(TAG, content.toString()); ds.write(content.toString().getBytes("gb18030")); ds.flush(); ds.close(); responsecode= con.getResponseCode(); con.disconnect(); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); }catch(Exception e){ e.printStackTrace(); } return null; } } protected class UploadAttachmentAsyncTask extends AsyncTask<Object, Object, Object>{ private String filepath, filename, mimetype; private int responsecode; private String responsemessage; private String attachmenturl; private HashMap<String, String> cookie; private StringBuffer cookiestring; private HttpURLConnection con; @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); progressdialog.setMessage(getString(R.string.uploadingattachment)); progressdialog.show(); currentapplication = (FudanBBSApplication)getApplication(); cookie = new HashMap<String, String>(); cookie = currentapplication.get_cookie(); cookiestring = new StringBuffer(); for(String key :cookie.keySet()){ cookiestring.append(key).append("=").append(cookie.get(key)).append(";"); } cookiestring.deleteCharAt(cookiestring.length()-1); Log.v(TAG, "cookiestring is "+cookiestring); Log.v(TAG, "onPreExecute"); } @Override protected void onPostExecute(Object result) { // TODO Auto-generated method stub super.onPostExecute(result); if(progressdialog.isShowing()){ progressdialog.dismiss(); } if(null != attachmenturl){ attachmenturlarraylist.add(attachmenturl); Toast.makeText(getApplicationContext(), getString(R.string.uploadattachmentsuccess), Toast.LENGTH_SHORT).show(); try { Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(filepath)); ImageView imageview = new ImageView(getApplicationContext()); imageview.setImageBitmap(bitmap); imagelayout.addView(imageview); } catch (FileNotFoundException e) { Log.e("Exception", e.getMessage(),e); } }else{ Toast.makeText(getApplicationContext(), R.string.uploadattachmentfail, Toast.LENGTH_SHORT).show(); } Log.v(TAG, "onPostExecute"); } @Override protected Object doInBackground(Object... params) { // TODO Auto-generated method stub Log.v(TAG, "doInBackground start"); filepath = (String) params[0]; filename = (String) params[1]; mimetype = (String) params[2]; try { URL url = new URL("http://bbs.fudan.edu.cn/bbs/upload?b="+board); Log.v(TAG, url.toString()); String end ="\r\n"; String twoHyphens ="--"; String boundary ="---------------------------253522105810294"; con=(HttpURLConnection)url.openConnection(); con.setConnectTimeout(20000); con.setDoInput(true); con.setDoOutput(true); con.setUseCaches(false); con.setRequestProperty("Cookie", cookiestring.toString()); con.setRequestMethod("POST"); /* setRequestProperty */ con.setRequestProperty("Connection", "Keep-Alive"); // con.setRequestProperty("Charset", "UTF-8"); con.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0"); con.setRequestProperty("Referer", "http://bbs.fudan.edu.cn/bbs/preupload?board="+board); con.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary); con.connect(); DataOutputStream ds = new DataOutputStream(con.getOutputStream()); ds.writeBytes(twoHyphens + boundary + end); ds.writeBytes("Content-Disposition: form-data; name=\"up\"; filename=\""+filename+"\""+ end); ds.writeBytes("Content-Type: "+mimetype+end); ds.writeBytes(end); FileInputStream fStream =new FileInputStream(filepath); int bufferSize =1024; byte[] buffer =new byte[bufferSize]; int length =-1; while((length = fStream.read(buffer)) !=-1) { ds.write(buffer, 0, length); } ds.writeBytes(end); ds.writeBytes(twoHyphens + boundary + twoHyphens + end); /* close streams */ fStream.close(); ds.flush(); responsecode = con.getResponseCode(); responsemessage = con.getResponseMessage(); Log.v(TAG, "responsemessage is "+responsemessage); ds.close(); if(200 == responsecode){ InputStream is = con.getInputStream(); BufferedReader input = new BufferedReader(new InputStreamReader(con.getInputStream(), "utf-8")); StringBuilder response = new StringBuilder(); String oneLine; String lineEnd = System.getProperty("line.separator"); while((oneLine = input.readLine()) != null) { response.append(oneLine + lineEnd); } if(null != response){ attachmenturl = response.substring(response.indexOf("<url>")+5, response.indexOf("</url>")); Log.v(TAG, "attachment url is "+attachmenturl); } // Log.v(TAG, "response content is "+response); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ con.disconnect(); } Log.v(TAG, "doInBackground end"); return null; } } }