/** * $id$ * Copyright 2011-2012 Renren Inc. All rights reserved. */ package com.renren.api.connect.android.feed; import java.util.concurrent.Executor; import org.json.JSONException; import org.json.JSONObject; import android.app.Activity; import android.os.Bundle; import com.renren.api.connect.android.Renren; import com.renren.api.connect.android.Util; import com.renren.api.connect.android.common.AbstractRequestListener; import com.renren.api.connect.android.exception.RenrenError; import com.renren.api.connect.android.exception.RenrenException; import com.renren.api.connect.android.view.RenrenWidgetListener; /** * 封装根据人人开放平台新鲜事的相关操作 * * @author Shaofeng Wang (shaofeng.wang@renren-inc.com) * */ //TODO: 修复某些手机上调用pageOnstart和pageOnBegin先后顺序不一致的问题 public class FeedHelper { /** * 服务器的响应字段 */ private static final String RESPONSE = "post_id"; /** * 用来发送请求的{@link Renren}对象 */ private Renren renren; /** * 用来在bundle中传递的是否进行验证的boolean值的key */ public static final String AUTH_OPTION = "auth_option"; public FeedHelper(Renren renren) { this.renren = renren; } /** * 同步调用feed.publishFeed发布新鲜事 * * @param feed * 要发送的新鲜事 * @return * 若发送成功,返回已发送的新鲜事,否则返回null * @throws RenrenException * @throws Throwable */ public FeedPublishResponseBean publish(FeedPublishRequestParam feed) throws RenrenException, Throwable { if (!renren.isSessionKeyValid()) { String errorMsg = "Session key is not valid."; throw new RenrenException(RenrenError.ERROR_CODE_TOKEN_ERROR, errorMsg, errorMsg); } //参数不能为空 if(feed == null) { String errorMsg = "The parameter is null."; throw new RenrenException( RenrenError.ERROR_CODE_NULL_PARAMETER, errorMsg, errorMsg); } // 发送发布状态请求 String response; try { Bundle params = feed.getParams(); response = renren.requestJSON(params); } catch (RenrenException rre) { Util.logger(rre.getMessage()); throw rre; } catch (RuntimeException re) { Util.logger(re.getMessage()); throw new Throwable(re); } RenrenError rrError = Util.parseRenrenError(response, Renren.RESPONSE_FORMAT_JSON); if (rrError != null) { Util.logger(rrError.getMessage()); throw new RenrenException(rrError); } else { try { JSONObject json = new JSONObject(response); int postId = json.optInt(RESPONSE); if (postId > 0) { return new FeedPublishResponseBean(response); } String errorMsg = "Cannot parse the response."; throw new RenrenException( RenrenError.ERROR_CODE_UNABLE_PARSE_RESPONSE, errorMsg, errorMsg); } catch (JSONException je) { Util.logger(je.getMessage()); throw new RenrenException( RenrenError.ERROR_CODE_UNABLE_PARSE_RESPONSE, je.getMessage(), je.getMessage()); } } } /** * 异步调用feed.publishFeed发布新鲜事 * * @param pool * 执行发送新鲜事操作的线程池 * @param feed * 要发布的新鲜事 * @param listener * 用以监听发布新鲜事结果的监听器对象 * @param truncOption * 若超出了长度,是否自动截短至限制的长度 */ public void asyncPublish(Executor pool, final FeedPublishRequestParam feed, final AbstractRequestListener<FeedPublishResponseBean> listener, final boolean truncOption) { pool.execute(new Runnable() { @Override public void run() { try { FeedPublishResponseBean bean = publish(feed); if (listener != null) { listener.onComplete(bean); } } catch (RenrenException rre) { // 参数、服务器等错误或异常 Util.logger(rre.getMessage()); if (listener != null) { listener.onRenrenError(new RenrenError(rre .getErrorCode(), rre.getMessage(), rre .getOrgResponse())); } } catch (Throwable t) { // 一般为网络异常 Util.logger(t.getMessage()); if (listener != null) { listener.onFault(t); } } } }); } /** * 使用Widget窗口发新鲜事 * * @param appID * 应用的app ID * @param activity * 显示此widget的activity * @param listener * 监听发送新鲜事结果的listener * @throws RenrenException */ public void startFeedPublishWidget(String appID, Activity activity, FeedPublishRequestParam feed, final AbstractRequestListener<FeedPublishResponseBean> listener) throws RenrenException { /* * 使用widgetDialog发布状态跟权限授予没有关系,此处不必要做权限限制。 * fixed:shaopeng.han */ // if (!renren.isSessionKeyValid()) { // String errorMsg = "Session key is not valid."; // throw new RenrenException(RenrenError.ERROR_CODE_TOKEN_ERROR, // errorMsg, errorMsg); // } Bundle params = feed.getWidgetParams(); params.putString("app_id", appID); renren.widgetDialog(activity, params, new RenrenWidgetListener() { @Override public void onError(Bundle retParams) { if(listener != null) { listener.onRenrenError( new RenrenError(retParams.getString("error") + retParams.getString("error_description"))); } } @Override public void onComplete(Bundle retParams) { if(listener != null) { if(retParams.containsKey(FeedPublishResponseBean.RESPONSE)) { listener.onComplete(new FeedPublishResponseBean( retParams.getString(FeedPublishResponseBean.RESPONSE))); } else { listener.onComplete(null); } } } @Override public void onCancel(Bundle retParams) { if(listener != null) { String errorMsg = "operation cancelled."; RenrenError error = new RenrenError(RenrenError.ERROR_CODE_OPERATION_CANCELLED, errorMsg, errorMsg); listener.onRenrenError(error); } } }, "http://widget.renren.com/dialog/feed"); } }