package com.metis.base.framework;
import android.content.Context;
import android.net.http.AndroidHttpClient;
import android.text.TextUtils;
import android.util.Pair;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.metis.base.Debug;
import com.metis.base.utils.Log;
import com.metis.msnetworklib.contract.OptionSettings;
import com.metis.msnetworklib.contract.ReturnInfo;
import com.microsoft.windowsazure.mobileservices.AndroidHttpClientFactory;
import com.microsoft.windowsazure.mobileservices.ApiOperationCallback;
import com.microsoft.windowsazure.mobileservices.MobileServiceClient;
import com.microsoft.windowsazure.mobileservices.ServiceFilterResponse;
import com.microsoft.windowsazure.mobileservices.ServiceFilterResponseCallback;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
/**
* Created by Beak on 2015/7/3.
*/
public class NetProxy {
private static final String TAG = NetProxy.class.getSimpleName();
private static final String UPLOAD_FILE = "v1.1/File/Upload?session={session}";/*?type={type}&define={define}&session={session}*/
public static final int TYPE_IMAGE = 1, TYPE_VOICE = 2, TYPE_AMR = 3;
private static NetProxy sProxy = null;
public synchronized static NetProxy getInstance (Context context) {
if (sProxy == null) {
sProxy = new NetProxy();
if (sProxy.mClient == null) {
sProxy.mClient = sProxy.buildClient(context.getApplicationContext());
}
}
return sProxy;
}
private Context mContext = null;
private MobileServiceClient mClient = null;
private MobileServiceClient buildClient (Context context) {
MobileServiceClient client = null;
try {
client = new MobileServiceClient(NetProperty.USE, NetProperty.USE_KEY, context);
} catch (MalformedURLException e) {
e.printStackTrace();
}
return client;
}
public <T> String doGetRequest(String request, final OnResponseListener listener) {
if (mClient == null) {
return "mClient is null";
}
final String requestUUID = UUID.randomUUID().toString();
Log.v(TAG, "request_get(" + requestUUID + ")=" + request);
mClient.invokeApi(request, HttpGet.METHOD_NAME, null, (Class<ReturnInfo<String>>) new ReturnInfo<String>().getClass(), new ApiOperationCallback<ReturnInfo<String>>() {
@Override
public void onCompleted(ReturnInfo<String> returnInfo, Exception e1, ServiceFilterResponse serviceFilterResponse) {
if (serviceFilterResponse == null) {
Log.e(TAG, "response_get(" + requestUUID + ")=serviceFilterResponse is null");
return;
}
String responseString = serviceFilterResponse.getContent();
Log.v(TAG, "response_get(" + requestUUID + ")=" + responseString);
if (TextUtils.isEmpty(responseString)) {
OptionSettings optionSettings = new OptionSettings();
optionSettings.errorCode = "-10086";
optionSettings.message = "no data received from server";
optionSettings.status = "-10086";
ReturnInfo info = new ReturnInfo();
info.setOption(optionSettings);
responseString = new Gson().toJson(info);
Log.v(TAG, "response_get(" + requestUUID + ") after handling empty responseString=" + responseString);
}
if (listener != null) {
listener.onResponse(responseString, requestUUID);
}
}
});
return requestUUID;
}
public String doPostRequest (String request, Map<String, String> map, final OnResponseListener listener){
if (mClient == null) {
return "mClient is null";
}
List<Pair<String, String>> params = new ArrayList<Pair<String, String>>();
if (map != null && !map.isEmpty()) {
Set<String> set = map.keySet();
for (String key : set) {
Pair<String, String> pair = new Pair<String, String>(key, map.get(key));
params.add(pair);
}
}
final String requestUUID = UUID.randomUUID().toString();
Log.v(TAG, "request_post(" + requestUUID + ")=" + request);
StringBuilder builder = new StringBuilder();
for (Pair<String, String> pair : params) {
builder.append("&" + pair.first + "=" + pair.second);
}
Log.v(TAG, "request_post(" + requestUUID + ") params=" + builder.toString());
mClient.invokeApi(request, HttpPost.METHOD_NAME, params, (Class<ReturnInfo<String>>) new ReturnInfo<String>().getClass(), new ApiOperationCallback<ReturnInfo<String>>() {
@Override
public void onCompleted(ReturnInfo<String> returnInfo, Exception e1, ServiceFilterResponse serviceFilterResponse) {
if (serviceFilterResponse == null) {
Log.e(TAG, "response_post(" + requestUUID + ")=serviceFilterResponse is null");
return;
}
String responseString = serviceFilterResponse.getContent();
Log.v(TAG, "response_post(" + requestUUID + ")=" + responseString);
if (TextUtils.isEmpty(responseString)) {
OptionSettings optionSettings = new OptionSettings();
optionSettings.errorCode = "-10086";
optionSettings.message = "no data received from server";
optionSettings.status = "-10086";
ReturnInfo info = new ReturnInfo();
info.setOption(optionSettings);
responseString = new Gson().toJson(info);
Log.v(TAG, "response_post(" + requestUUID + ") after handling empty responseString=" + responseString);
}
if (listener != null) {
listener.onResponse(responseString, requestUUID);
}
}
});
return requestUUID;
//mClient.invokeApi();
}
public String doPostRequest (String request, Object object, final OnResponseListener listener) {
final String requestUUID = UUID.randomUUID().toString();
Log.v(TAG, "request_post(" + requestUUID + ")=" + request);
mClient.invokeApi(request, object, HttpPost.METHOD_NAME, null, (Class<ReturnInfo<String>>) new ReturnInfo<String>().getClass(), new ApiOperationCallback<ReturnInfo<String>>() {
@Override
public void onCompleted(ReturnInfo<String> stringReturnInfo, Exception e1, ServiceFilterResponse serviceFilterResponse) {
if (serviceFilterResponse == null) {
Log.e(TAG, "response_post(" + requestUUID + ")=serviceFilterResponse is null");
return;
}
String responseString = serviceFilterResponse.getContent();
Log.v(TAG, "response_post(" + requestUUID + ")=" + responseString);
if (TextUtils.isEmpty(responseString)) {
OptionSettings optionSettings = new OptionSettings();
optionSettings.errorCode = "-10086";
optionSettings.message = "no data received from server";
optionSettings.status = "-10086";
ReturnInfo info = new ReturnInfo();
info.setOption(optionSettings);
responseString = new Gson().toJson(info);
Log.v(TAG, "response_post(" + requestUUID + ") after handling empty responseString=" + responseString);
}
if (listener != null) {
listener.onResponse(responseString, requestUUID);
}
}
});
return requestUUID;
}
public void upload (int type, byte[] data, String session, NetProxy.OnResponseListener listener) {
upload(type, new byte[][]{data}, session, listener);
}
public String upload (int type, byte[][] dataArray, String session, final NetProxy.OnResponseListener listener) {
int totalLength = 0;
final int count = dataArray.length;
StringBuilder subLengthSb = new StringBuilder();
for (int i = 0; i < count; i++) {
byte[] data = dataArray[i];
totalLength += data.length;
subLengthSb.append("," + data.length);
}
byte[] source = new byte[totalLength];
int current = 0;
for (int i = 0; i < count; i++) {
byte[] data = dataArray[i];
for (int k = 0; k < data.length; k++) {
source[current] = data[k];
current++;
}
}
String request = UPLOAD_FILE.replace("{session}", session);
String define = totalLength + "," + count + subLengthSb;
List<Pair<String, String>> list = new ArrayList<Pair<String, String>>();
Pair<String, String> typePair = new Pair<String, String>("type", type + "");
Pair<String, String> definePair = new Pair<String, String>("define", define);
list.add(typePair);
list.add(definePair);
final String requestUUID = UUID.randomUUID().toString();
Log.v(TAG, "request_upload(" + requestUUID + ")=" + request);
NetProxy.getInstance(mContext).getClient().invokeApi(
request, source, HttpPost.METHOD_NAME, null, list, new ServiceFilterResponseCallback() {
@Override
public void onResponse(ServiceFilterResponse serviceFilterResponse, Exception e) {
if (listener != null && serviceFilterResponse != null) {
String responseString = serviceFilterResponse.getContent();
Log.v(TAG, "response_upload(" + requestUUID + ")=" + responseString);
listener.onResponse(responseString, requestUUID);
return;
}
if (listener != null && e != null) {
String responseString = e.getLocalizedMessage();
Log.v(TAG, "response_upload(" + requestUUID + ")=" + responseString);
listener.onResponse(responseString, requestUUID);
return;
}
}
});
return requestUUID;
}
public MobileServiceClient getClient() {
return mClient;
}
public static interface OnResponseListener {
public void onResponse (String result, String requestId);
}
}