package com.ustc.dystu.dandelion.net;
import java.util.ArrayList;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Context;
import com.sina.weibo.sdk.auth.Oauth2AccessToken;
import com.sina.weibo.sdk.exception.WeiboException;
import com.sina.weibo.sdk.net.AsyncWeiboRunner;
import com.sina.weibo.sdk.net.RequestListener;
import com.sina.weibo.sdk.net.WeiboParameters;
import com.sina.weibo.sdk.openapi.AbsOpenAPI;
import com.ustc.dystu.dandelion.atk.AccessTokenKeeper;
import com.ustc.dystu.dandelion.bean.FootInfo;
import com.ustc.dystu.dandelion.bean.GeoInfo;
import com.ustc.dystu.dandelion.bean.NearInfo;
import com.ustc.dystu.dandelion.bean.NoteInfo;
import com.ustc.dystu.dandelion.bean.UserInfo;
import com.ustc.dystu.dandelion.constant.Constants;
import com.ustc.dystu.dandelion.utils.CacheUtils;
import com.ustc.dystu.dandelion.utils.Logger;
import com.ustc.dystu.dandelion.utils.SharePrefUtils;
public class DandelionAPI extends AbsOpenAPI{
public static final String DANDELION_SERVER = "http://1.infotravel.sinaapp.com";
private static final String TAG = DandelionAPI.class.getSimpleName();
private static DandelionAPI sInstance;
private static Oauth2AccessToken sAccessToken;
private static String sUid;
private static Context sContext;
public synchronized static DandelionAPI getInstance(Context ctx) {
if (sInstance == null) {
Oauth2AccessToken accessToken = AccessTokenKeeper
.readAccessToken(ctx);
sInstance = new DandelionAPI(accessToken);
sAccessToken = accessToken;
sUid = SharePrefUtils.getUid(ctx);
sContext = ctx;
Logger.d(TAG, "accessToken-->" + sAccessToken.getToken());
}
return sInstance;
}
public Oauth2AccessToken getAccessToken() {
return sAccessToken;
}
public String getUid() {
return sUid;
}
public void logout() {
sInstance = null;
}
private DandelionAPI(Oauth2AccessToken oauth2AccessToken) {
super(sContext, sUid, oauth2AccessToken);
}
public void getLocationStatus(RequestListener listener, String uid, int page) {
String url = API_SERVER + "/place/user_timeline.json";
WeiboParameters params = new WeiboParameters(Constants.APP_KEY);
params.put("uid", uid);
params.put("count", String.valueOf(50));
params.put("page", page);
requestAsync(url, params, "GET", listener);
}
public void getUserInfo(DandRequestListener listener, String uid) {
String url = API_SERVER + "/users/show.json";
String res = CacheUtils.getCache(
sContext,
CacheUtils.getKey(CacheUtils.CACHE_USER_INFO, new String[] {
"uid", uid }), 3 * 24 * 60 * 60 * 1000);
if (res != null) {
listener.onCache(res);
} else {
WeiboParameters params = new WeiboParameters(Constants.APP_KEY);
params.put("uid", uid);
requestAsync(url, params, "GET", listener);
}
}
public String[] getUserInfo(String uid) throws WeiboException {
String url = API_SERVER + "/users/show.json";
String res = CacheUtils.getCache(
sContext,
CacheUtils.getKey(CacheUtils.CACHE_USER_INFO, new String[] {
"uid", uid }), 3 * 24 * 60 * 60 * 1000);
if (res != null) {
return new String[] { "true", res };
}
WeiboParameters params = new WeiboParameters(Constants.APP_KEY);
params.put("uid", uid);
params.put("access_token", sAccessToken.getToken());
return new String[] { "false",
new AsyncWeiboRunner(sContext).request(url, params, "GET") };
}
public void getFansList(RequestListener listener, int page, int count) {
String url = API_SERVER + "/friendships/friends/bilateral.json";
WeiboParameters params = new WeiboParameters(Constants.APP_KEY);
params.put("uid", sUid);
params.put("count", String.valueOf(count));
params.put("page", String.valueOf(page));
requestAsync(url, params, "GET", listener);
}
public String searchFans(String q, String count) throws WeiboException {
String url = API_SERVER + "/search/suggestions/at_users.json";
WeiboParameters params = new WeiboParameters(Constants.APP_KEY);
params.put("access_token", sAccessToken.getToken());
params.put("q", q);
params.put("count", count);
params.put("type", "3");
return new AsyncWeiboRunner(sContext).request(url, params, "GET");
}
public String getAddress(GeoInfo geo) throws WeiboException {
if (geo == null) {
return null;
}
String url = API_SERVER + "/location/geo/geo_to_address.json";
WeiboParameters params = new WeiboParameters(Constants.APP_KEY);
params.put("access_token", sAccessToken.getToken());
params.put("coordinate", geo.longitude + "," + geo.latitude);
return new AsyncWeiboRunner(sContext).request(url, params, "GET");
}
/*public String getGoogleAddress(GeoInfo geo) throws WeiboException {
if (geo == null) {
return null;
}
// http://ditu.google.com/maps/api/geocode/json
String url = "http://ditu.google.com/maps/api/geocode/json";
WeiboParameters params = new WeiboParameters(Constants.APP_KEY);
params.put("latlng", geo.latitude + "," + geo.longitude);
params.put("language", "zh-CN");
params.put("sensor", false);
Logger.d(TAG, "lat:" + geo.latitude + "; long:" + geo.longitude);
return new AsyncWeiboRunner(sContext).request(url, params, "GET");
}*/
public void getSelectTravelNotes(DandRequestListener listener,
boolean useCache) {
String url = DANDELION_SERVER + "/travel_select.php";
String res = null;
if (useCache) {
res = CacheUtils
.getCache(sContext, CacheUtils.getKey(
CacheUtils.CACHE_SELECTED_NOTES, null), 0);
}
if (res != null) {
listener.onCache(res);
} else {
WeiboParameters params = new WeiboParameters(Constants.APP_KEY);
requestAsync(url, params, "GET", listener);
}
}
public void getLatestTravelNotes(RequestListener listener, int num) {
String url = "http://1.infotravel.sinaapp.com/travel_latest.php";
WeiboParameters params = new WeiboParameters(Constants.APP_KEY);
params.put("note_num", num);
requestAsync(url, params, "GET", listener);
}
public void getTravelNotes(RequestListener listener, String uid) {
String url = "http://1.infotravel.sinaapp.com/travel_me.php";
WeiboParameters params = new WeiboParameters(Constants.APP_KEY);
params.put("uid", uid);
requestAsync(url, params, "POST", listener);
}
public void getWeiboBatchInfo(RequestListener listener, String weiboIds) {
// 需要高级别的权限
String url = API_SERVER + "/statuses/show_batch.json";
WeiboParameters params = new WeiboParameters(Constants.APP_KEY);
params.put("ids", weiboIds);
params.put("trim_user", "1");
requestAsync(url, params, "GET", listener);
}
public ArrayList<FootInfo> getWeiboInfo(String[] weiboIds) {
ArrayList<FootInfo> list = new ArrayList<FootInfo>();
FootInfo info;
for (int i = 0; i < weiboIds.length; i++) {
try {
String[] rs = getWeiboInfo(weiboIds[i]);
if (rs != null) {
JSONObject jo = new JSONObject(rs[1]);
info = FootInfo.create(jo, true);
list.add(info);
if ("false".equals(rs[0])) {
CacheUtils.updateCache(sContext, CacheUtils.getKey(
CacheUtils.CACHE_WEIBO_INFO, new String[] {
"id", weiboIds[i] }), rs[1]);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
return list;
}
public String[] getWeiboInfo(String weiboId) throws WeiboException {
String url = API_SERVER + "/statuses/show.json";
String res = CacheUtils.getCache(
sContext,
CacheUtils.getKey(CacheUtils.CACHE_WEIBO_INFO, new String[] {
"id", weiboId }), 3 * 24 * 60 * 60 * 1000);
if (res != null) {
return new String[] { "true", res };
}
WeiboParameters params = new WeiboParameters(Constants.APP_KEY);
params.put("id", weiboId);
params.put("access_token", sAccessToken.getToken());
return new String[] { "false",
new AsyncWeiboRunner(sContext).request(url, params, "GET") };
}
public void createTravelNote(RequestListener listener, NoteInfo info,
String weiboInfo) {
String url = "http://1.infotravel.sinaapp.com/travel_create.php";
WeiboParameters params = new WeiboParameters(Constants.APP_KEY);
params.put("note_folder_url", info.note_folder_url);
params.put("note_is_suggest", info.note_is_suggest);
params.put("note_location", info.note_location);
params.put("note_title", info.note_title);
params.put("note_uid", info.note_uid);
params.put("note_time_from", info.note_time_from);
params.put("note_time_to", info.note_time_to);
params.put("weiboInfo", weiboInfo);
requestAsync(url, params, "POST", listener);
}
public ArrayList<NearInfo> getNearTravelNote(double lat, double lon) {
String url = "http://1.infotravel.sinaapp.com/travel_near.php";
WeiboParameters params = new WeiboParameters(Constants.APP_KEY);
params.put("lat", String.valueOf(lat));
params.put("lon", String.valueOf(lon));
ArrayList<NearInfo> data;
try {
String response = new AsyncWeiboRunner(sContext).request(url, params, "GET");
JSONArray array = new JSONArray(response);
data = NearInfo.create(array);
} catch (Exception e) {
e.printStackTrace();
return null;
}
if (data != null) {
for (NearInfo nearInfo : data) {
try {
String[] rs = getWeiboInfo(nearInfo.weiboId);
if (!"[]".equals(rs) && rs != null) {
JSONObject jo = new JSONObject(rs[1]);
nearInfo.footInfo = FootInfo.create(jo, true);
if ("false".equals(rs[0])) {
CacheUtils.updateCache(sContext, CacheUtils.getKey(
CacheUtils.CACHE_WEIBO_INFO, new String[] {
"id", nearInfo.weiboId }), rs[1]);
}
}
} catch (Exception e) {
e.printStackTrace();
continue;
}
}
}
return data;
}
public NoteInfo getRandomTravelNote() {
String url = "http://1.infotravel.sinaapp.com/random_note_info.php";
WeiboParameters params = new WeiboParameters(Constants.APP_KEY);
try {
String rs = new AsyncWeiboRunner(sContext).request(url, params, "GET");
NoteInfo info = NoteInfo.create(new JSONObject(rs));
String[] userInfo = getUserInfo(info.note_uid);
if (userInfo != null) {
info.userIno = UserInfo.create(new JSONObject(userInfo[1]));
if ("false".equals(userInfo[0])) {
CacheUtils.updateCache(sContext, CacheUtils.getKey(
CacheUtils.CACHE_USER_INFO, new String[] { "uid",
info.note_uid }), userInfo[1]);
}
}
return info;
} catch (WeiboException e) {
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
public void deleteNote(RequestListener listener, NoteInfo info) {
String url = "http://1.infotravel.sinaapp.com/travel_delete.php";
WeiboParameters params = new WeiboParameters(Constants.APP_KEY);
params.put("note_id", info.note_id);
requestAsync(url, params, "POST", listener);
}
public void updateNote(RequestListener listener, NoteInfo info) {
String url = "http://1.infotravel.sinaapp.com/travel_update.php";
WeiboParameters params = new WeiboParameters(Constants.APP_KEY);
Logger.d(TAG, "note titl-->" + info.note_title);
params.put("note_id", info.note_id);
params.put("note_title", info.note_title);
params.put("note_folder_url", info.note_folder_url);
requestAsync(url, params, "POST", listener);
}
public void getComments(RequestListener listener, String weiboId) {
String url = API_SERVER + "/comments/show.json";
WeiboParameters params = new WeiboParameters(Constants.APP_KEY);
params.put("id", weiboId);
requestAsync(url, params, "GET", listener);
}
public void setComments(RequestListener listener, String weiboId,
String comment) {
String url = API_SERVER + "/comments/create.json";
WeiboParameters params = new WeiboParameters(Constants.APP_KEY);
params.put("id", weiboId);
params.put("comment", comment);
requestAsync(url, params, "POST", listener);
}
}