|
package ai.pai.lensman.service;
import android.app.Service;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.text.TextUtils;
import com.android.common.executors.ThreadExecutor;
import com.android.common.utils.LogHelper;
import com.android.common.utils.NetworkUtil;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import ai.pai.lensman.BuildConfig;
import ai.pai.lensman.bean.OrderBean;
import ai.pai.lensman.bean.PhotoBean;
import ai.pai.lensman.db.Preferences;
import ai.pai.lensman.utils.BoxUrlContainer;
import ai.pai.lensman.utils.Constants;
import ai.pai.lensman.utils.HttpPostTask;
import ai.pai.lensman.utils.UrlContainer;
public class OrderDealService extends Service implements Handler.Callback{
private ArrayList<OrderBean> orderList;
private Handler handler;
private OrderServiceListener listener;
private static final int MSG_QUERY_ORDER = 2001;
@Override
public void onCreate() {
super.onCreate();
handler = new Handler(this);
}
@Override
public IBinder onBind(Intent intent) {
return new OrderServiceBinder();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (!isQueueEmpty()) {
return START_STICKY;
}
startQuery();
return START_STICKY;
}
private void startQuery() {
HashMap<String, String> params = new HashMap<>();
params.put("user_id", Preferences.getInstance().getLensManId());
new HttpPostTask(params) {
@Override
protected boolean parseResponse(String response) {
LogHelper.d("OrderDealService", "startQuery order list = " + response);
try {
JSONObject json = new JSONObject(response);
int status = json.getInt("status");
if (status == 200) {
JSONObject data = json.getJSONObject("data");
JSONArray orders = data.getJSONArray("wanted");
if (orders != null && orders.length() > 0) {
orderList = new ArrayList<OrderBean>();
for (int k = 0; k < orders.length(); k++) {
JSONObject orderObj = orders.getJSONObject(k);
OrderBean bean = new OrderBean();
bean.sessionId = orderObj.getString("session_id");
bean.photoId = orderObj.getString("photo_id");
bean.orderId = orderObj.getString("order_id");
JSONObject photoObj = orderObj.getJSONObject("group_photo_info");
bean.buyerId = photoObj.getString("user_id");
bean.buyerName = photoObj.getString("nickname");
bean.originExpireTime = photoObj.getLong("origin_expired_stamps");
orderList.add(bean);
}
}
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
@Override
protected void onPostSuccess() {
super.onPostSuccess();
if(listener!= null) {
if (orderList != null && orderList.size() > 0) {
listener.onOrderArrived();
}else{
listener.onOrderCompleted();
}
}
dealOrder();
}
@Override
protected void onPostFail() {
super.onPostFail();
dealOrder();
}
}.executeOnExecutor(ThreadExecutor.getInstance().getExecutor(), UrlContainer.QUERY_ORIGIN_ORDER_URL);
}
private void dealOrder() {
if (!isQueueEmpty()) {
OrderBean orderBean = orderList.get(0);
fetchOriginFromBox(orderBean);
} else {
handler.removeMessages(MSG_QUERY_ORDER);
handler.sendEmptyMessageDelayed(MSG_QUERY_ORDER,10000);
}
}
private void fetchOriginFromBox(final OrderBean orderBean) {
LogHelper.d("OrderDealService", "fetchOriginFromBox ");
HashMap<String, String> params = new HashMap<>();
params.put("lensman", Preferences.getInstance().getLensManId());
params.put("session", orderBean.sessionId);
params.put("id", orderBean.photoId);
//TODO for test
if(BuildConfig.isTestMode){
PhotoBean bean = new PhotoBean();
bean.photoId = Long.parseLong(orderBean.photoId);
bean.photoName = bean.photoId+".jpg";
bean.photoPath = "http://img.pconline.com.cn/images/upload/upc/tx/wallpaper/1402/12/c1/31189058_1392186616852.jpg";
bean.captureTime = bean.photoId;
bean.isRawPhoto = false;
bean.uploadStatus = PhotoBean.UploadStatus.STATUS_NO_BEGIN;
bean.sessionId = orderBean.sessionId;
bean.lensmanId = Preferences.getInstance().getLensManId();
orderBean.photoBean = bean;
new SavePhotoTask(orderBean).executeOnExecutor(ThreadExecutor.getInstance().getExecutor(), orderBean);
return;
}
new HttpPostTask(params) {
@Override
protected boolean parseResponse(String response) {
LogHelper.d("OrderDealService", "fetchOriginFromBox get response string = " + response);
try {
JSONObject json = new JSONObject(response);
int status = json.getInt("status");
if (status == 200) {
JSONObject data = json.getJSONObject("data");
PhotoBean bean = new PhotoBean();
bean.photoId = Long.parseLong(orderBean.photoId);
bean.photoName = bean.photoId+".jpg";
bean.photoPath = data.getString("path");
bean.captureTime = bean.photoId;
bean.isRawPhoto = false;
bean.uploadStatus = PhotoBean.UploadStatus.STATUS_NO_BEGIN;
bean.sessionId = orderBean.sessionId;
bean.lensmanId = Preferences.getInstance().getLensManId();
orderBean.photoBean = bean;
}
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
@Override
protected void onPostFail() {
super.onPostFail();
orderList.remove(orderBean);
dealOrder();
}
@Override
protected void onPostSuccess() {
super.onPostSuccess();
if(TextUtils.isEmpty(orderBean.photoBean.photoPath)){
reportOriginPhotoDeleted(orderBean);
}else{
new SavePhotoTask(orderBean).executeOnExecutor(ThreadExecutor.getInstance().getExecutor(), orderBean);
}
}
}.executeOnExecutor(ThreadExecutor.getInstance().getExecutor(), BoxUrlContainer.FETCH_ORIGIN_URL);
}
private void uploadOrigin(OrderBean bean) {
new UploadTask(bean).executeOnExecutor(ThreadExecutor.getInstance().getExecutor());
}
private boolean isQueueEmpty() {
return (orderList == null || orderList.size() == 0);
}
@Override
public boolean handleMessage(Message message) {
if(message.what == MSG_QUERY_ORDER){
startQuery();
}
return true;
}
public class OrderServiceBinder extends Binder {
public OrderDealService getService() {
return OrderDealService.this;
}
}
class SavePhotoTask extends AsyncTask<OrderBean, Integer, Boolean> {
private OrderBean orderBean;
public SavePhotoTask(OrderBean bean) {
this.orderBean = bean;
}
@Override
protected Boolean doInBackground(OrderBean... params) {
String path = BoxUrlContainer.PHOTO_PATH_PREFIX_URL + orderBean.photoBean.photoPath;
if(BuildConfig.isTestMode){
path = "http://img.pconline.com.cn/images/upload/upc/tx/wallpaper/1402/12/c1/31189058_1392186616852.jpg";
}
LogHelper.d("OrderDealService", "保存照片到本地,图片链接地址为" + path);
FileOutputStream fOut = null;
HttpURLConnection conn = null;
InputStream inStream = null;
try {
URL url = new URL(path);
conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5 * 1000);
conn.setRequestMethod("GET");
inStream = conn.getInputStream();
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
String dirPath = ai.pai.lensman.utils.Constants.APP_IMAGE_DIR + File.separator + orderBean.photoBean.sessionId + File.separator + Constants.ORIGIN_DIR_NAME;
File dir = new File(dirPath);
dir.mkdirs();
File file = new File(dir, orderBean.photoBean.photoName);
fOut = new FileOutputStream(file);
byte[] buffer = new byte[2048];
int len;
while ((len = inStream.read(buffer)) != -1) {
fOut.write(buffer, 0, len);
fOut.flush();
}
fOut.flush();
LogHelper.d("OrderDealService", "保存照片到本地,图片保存至" + file.getAbsolutePath() + "图片大小为" + file.length() + "字节\n\n");
}
return true;
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
inStream.close();
conn.disconnect();
fOut.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
if (result) {
uploadOrigin(orderBean);
} else {
orderList.remove(orderBean);
dealOrder();
}
}
}
private void reportOriginPhotoDeleted(final OrderBean orderBean) {
HashMap<String, String> params = new HashMap<>();
params.put("user_id", Preferences.getInstance().getLensManId());
params.put("session_id", orderBean.sessionId);
params.put("photo_id", orderBean.photoId);
params.put("deleted", String.valueOf(1));
new HttpPostTask(params) {
@Override
protected boolean parseResponse(String response) {
LogHelper.d("OrderDealService", "reportOriginPhotoDeleted get response string = " + response);
try {
JSONObject json = new JSONObject(response);
int status = json.getInt("status");
if (status == 200) {
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
@Override
protected void onPostFail() {
super.onPostFail();
orderList.remove(orderBean);
dealOrder();
}
@Override
protected void onPostSuccess() {
super.onPostSuccess();
orderList.remove(orderBean);
dealOrder();
}
}.executeOnExecutor(ThreadExecutor.getInstance().getExecutor(), UrlContainer.ORIGIN_PHOTO_UPLOAD_URL);
}
public class UploadTask extends AsyncTask<Void, Integer, Boolean> {
private OrderBean bean;
public UploadTask(OrderBean bean) {
this.bean = bean;
}
@Override
protected Boolean doInBackground(Void... params) {
for (int k = 0; k < 5; k++) {
try {
String dirPath = ai.pai.lensman.utils.Constants.APP_IMAGE_DIR + File.separator + bean.sessionId
+ File.separator + Constants.ORIGIN_DIR_NAME;
File dir = new File(dirPath);
dir.mkdirs();
File photo = new File(dir, bean.photoBean.photoName);
LogHelper.d("OrderDealService", "上传照片 第" + k + "次尝试" + bean);
if (photo.exists() && photo.isFile()) {
PhotoUploadUtils photoUploadUtils = new PhotoUploadUtils(UrlContainer.ORIGIN_PHOTO_UPLOAD_URL + "?timestamp=" + System.currentTimeMillis());
photoUploadUtils.addTextParameter("deleted", String.valueOf(0));
photoUploadUtils.addFileParameter("photo", photo);
photoUploadUtils.addTextParameter("user_id", bean.photoBean.lensmanId);
photoUploadUtils.addTextParameter("order_id", bean.orderId);
photoUploadUtils.addTextParameter("session_id", bean.photoBean.sessionId);
photoUploadUtils.addTextParameter("photo_id", String.valueOf(bean.photoBean.photoId));
String result = new String(photoUploadUtils.send(false), "UTF-8");
JSONObject resultObj = new JSONObject(result);
if (resultObj.getInt("status") == 200) {
LogHelper.d("OrderDealService", "上传 UploadTask upload result ok ");
return true;
}
} else {
return false;
}
} catch (Exception e) {
LogHelper.d("OrderDealService", "上传发生异常 UploadTask :" + bean + " error:" + e);
}
}
return false;
}
@Override
protected void onPostExecute(Boolean result) {
LogHelper.d("OrderDealService", "上传 UploadTask " + bean + " success ");
orderList.remove(bean);
dealOrder();
}
}
public void setOrderServiceListener(OrderServiceListener listener){
this.listener = listener;
}
public interface OrderServiceListener{
void onOrderArrived();
void onOrderCompleted();
}
}
|