/** * This file is part of FileSpace for Android, an app for managing your server (files, talks...). * <p> * Copyright (c) 2014-2015 FileSpace for Android contributors (http://mercandalli.com) * <p> * LICENSE: * <p> * FileSpace for Android is free software: you can redistribute it and/or modify it under the terms of the GNU General * Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any * later version. * <p> * FileSpace for Android is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * @author Jonathan Mercandalli * @license http://www.gnu.org/licenses/gpl.html * @copyright 2014-2015 FileSpace for Android contributors (http://mercandalli.com) */ package com.mercandalli.android.apps.files.common.net; import android.app.Activity; import android.os.AsyncTask; import android.util.Log; import android.widget.Toast; import com.mercandalli.android.apps.files.R; import com.mercandalli.android.apps.files.common.listener.IPostExecuteListener; import com.mercandalli.android.apps.files.common.util.StringPair; import com.mercandalli.android.apps.files.main.Config; import com.mercandalli.android.apps.files.main.network.NetUtils; import com.mercandalli.android.library.base.java.StringUtils; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLEncoder; import java.util.List; /** * Global behavior : http Post * * @author Jonathan */ public class TaskPost extends AsyncTask<Void, Void, String> { private String url, contentType; private List<StringPair> mParameters; private IPostExecuteListener mListener; private File file; private Activity mActivity; public TaskPost(Activity activity, String url, IPostExecuteListener listener) { mActivity = activity; this.url = url; this.mListener = listener; } public TaskPost(Activity activity, String url, IPostExecuteListener listener, List<StringPair> parameters) { mActivity = activity; this.url = url; this.mParameters = parameters; this.mListener = listener; } public TaskPost(Activity activity, String url, IPostExecuteListener listener, List<StringPair> parameters, String contentType) { mActivity = activity; this.url = url; this.mParameters = parameters; this.contentType = contentType; this.mListener = listener; } public TaskPost(Activity activity, String url, IPostExecuteListener listener, List<StringPair> parameters, File file) { mActivity = activity; this.url = url; this.mParameters = parameters; this.mListener = listener; this.file = file; } @Override protected String doInBackground(Void... urls) { try { if (this.mParameters != null) { if (!StringUtils.isNullOrEmpty(Config.getNotificationId())) { mParameters.add(new StringPair("android_id", "" + Config.getNotificationId())); } url = NetUtils.addUrlParameters(url, mParameters); } Log.d("TaskGet", "url = " + url); final URL tmpUrl = new URL(url); HttpURLConnection conn = (HttpURLConnection) tmpUrl.openConnection(); conn.setReadTimeout(10_000); conn.setConnectTimeout(15_000); conn.setRequestMethod("POST"); conn.setRequestProperty("Authorization", "Basic " + Config.getUserToken()); conn.setUseCaches(false); conn.setDoInput(true); conn.setDoOutput(true); if (this.mParameters != null) { final OutputStream outputStream = conn.getOutputStream(); final BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8")); writer.write(getQuery(mParameters)); writer.flush(); writer.close(); outputStream.close(); } conn.connect(); // Starts the query int responseCode = conn.getResponseCode(); InputStream inputStream = new BufferedInputStream(conn.getInputStream()); // convert inputstream to string String resultString = convertInputStreamToString(inputStream); //int responseCode = response.getStatusLine().getStatusCode(); if (responseCode >= 300) { resultString = "Status Code " + responseCode + ". " + resultString; } conn.disconnect(); return resultString; } catch (IOException e) { Log.e(getClass().getName(), "Failed to convert Json", e); } return null; // try { // // // http://stackoverflow.com/questions/9767952/how-to-add-parameters-to-httpurlconnection-using-post // // HttpPost httppost = new HttpPost(url); // // MultipartEntity mpEntity = new MultipartEntity(); // if (this.file != null) mpEntity.addPart("file", new FileBody(file, "*/*")); // // String log_parameters = ""; // if (this.parameters != null) // for (StringPair b : parameters) { // mpEntity.addPart(b.getName(), new StringBody(b.getValue(), Charset.forName("UTF-8"))); // log_parameters += b.getName() + ":" + b.getValue() + " "; // } // Log.d("TaskPost", "url = " + url + " " + log_parameters); // // httppost.setEntity(mpEntity); // // StringBuilder authentication = new StringBuilder().append(app.getConfig().getUser().getAccessLogin()).append(":").append(app.getConfig().getUser().getAccessPassword()); // String result = Base64.encodeBytes(authentication.toString().getBytes()); // httppost.setHeader("Authorization", "Basic " + result); // // HttpClient httpclient = new DefaultHttpClient(); // HttpResponse response = httpclient.execute(httppost); // // // receive response as inputStream // InputStream inputStream = response.getEntity().getContent(); // // String resultString = null; // // // convert inputstream to string // if (inputStream != null) // resultString = convertInputStreamToString(inputStream); // // int responseCode = response.getStatusLine().getStatusCode(); // if (responseCode >= 300) // resultString = "Status Code " + responseCode + ". " + resultString; // return resultString; // // // } catch (UnsupportedEncodingException e) { // e.printStackTrace(); // } catch (ClientProtocolException e) { // e.printStackTrace(); // } catch (IOException e) { // e.printStackTrace(); // } // return null; } private String getQuery(List<StringPair> params) throws UnsupportedEncodingException { String result = ""; boolean first = true; for (StringPair pair : params) { if (first) { first = false; } else { result += "&"; } result += URLEncoder.encode(pair.getName(), "UTF-8") + "=" + URLEncoder.encode(pair.getValue(), "UTF-8"); } return result; } /** * Get http response to String * * @param inputStream * @return * @throws IOException */ private String convertInputStreamToString(InputStream inputStream) throws IOException { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line; String result = ""; while ((line = bufferedReader.readLine()) != null) { result += line; } inputStream.close(); return result; } @Override protected void onPostExecute(String response) { Log.d("onPostExecute POST", "" + response); if (response == null) { if (this.mListener != null) { this.mListener.onPostExecute(null, null); } } else { try { JSONObject json = new JSONObject(response); if (this.mListener != null) { this.mListener.onPostExecute(json, response); } if (json.has("toast") && !json.getString("toast").equals("")) { Toast.makeText(mActivity, json.getString("toast"), Toast.LENGTH_SHORT).show(); } } catch (JSONException e) { Log.e(getClass().getName(), "Failed to convert Json", e); Toast.makeText(mActivity, mActivity.getString(R.string.action_failed), Toast.LENGTH_SHORT).show(); if (this.mListener != null) { this.mListener.onPostExecute(null, response); } } } } }