/* * The MIT License (MIT) * * Copyright (c) 2014-2015 Umeng, Inc * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package com.umeng.comm.ui.presenter.impl; import android.content.Context; import android.content.DialogInterface; import android.location.Location; import android.net.Uri; import android.os.AsyncTask; import android.util.Log; import com.umeng.comm.core.beans.CommConfig; import com.umeng.comm.core.beans.CommUser; import com.umeng.comm.core.beans.CommUser.SubPermission; import com.umeng.comm.core.beans.FeedItem; import com.umeng.comm.core.beans.ImageItem; import com.umeng.comm.core.beans.LocationItem; import com.umeng.comm.core.constants.ErrorCode; import com.umeng.comm.core.image.ImageUploader; import com.umeng.comm.core.listeners.Listeners.SimpleFetchListener; import com.umeng.comm.core.nets.responses.FeedItemResponse; import com.umeng.comm.core.nets.responses.LocationResponse; import com.umeng.comm.core.nets.uitls.NetworkUtils; import com.umeng.comm.core.sdkmanager.ImageUploaderManager; import com.umeng.comm.core.sdkmanager.LocationSDKManager; import com.umeng.comm.core.utils.DeviceUtils; import com.umeng.comm.core.utils.ResFinder; import com.umeng.comm.core.utils.ToastMsg; import com.umeng.comm.ui.dialogs.ConfirmDialog; import com.umeng.comm.ui.mvpview.MvpPostFeedActivityView; import com.umeng.comm.ui.notifycation.PostNotifycation; import com.umeng.comm.ui.presenter.BasePresenter; import com.umeng.comm.ui.utils.BroadcastUtils; import com.umeng.comm.ui.utils.ContentChecker; import com.umeng.comm.ui.utils.FeedMemento; import java.util.ArrayList; import java.util.List; public class FeedPostPresenter extends BasePresenter { /** * 内存检测,发布feed时自己输入的字符数量需要大于5个 */ ContentChecker mChecker; /** * 地理位置信息 */ Location mLocation; /** * 获取到的位置信息 */ List<LocationItem> mLocationItems = new ArrayList<LocationItem>(); /** * 是否是转发类型 */ boolean isForwardFeed = false; /** * 是否是重新发送 */ boolean isRepost = false; /** * 对应的Mvp View */ MvpPostFeedActivityView mActivityView; public FeedPostPresenter(MvpPostFeedActivityView activityView, ContentChecker checker) { mChecker = checker; mActivityView = activityView; } @Override public void attach(Context context) { super.attach(context); getMyLocation(); } public void postNewFeed(final FeedItem feedItem) { if (!DeviceUtils.isNetworkAvailable(mContext)) { ToastMsg.showShortMsgByResName("umeng_comm_not_network"); mActivityView.canNotPostFeed(); return; } if (!hasContent(feedItem)) { ToastMsg.showShortMsgByResName("umeng_comm_not_network"); mActivityView.canNotPostFeed(); return; } if (!isTextValid(feedItem)) { ToastMsg.showShortMsgByResName("umeng_comm_content_short_tips"); mActivityView.canNotPostFeed(); return; } CommUser loginUser = CommConfig.getConfig().loginedUser; if (!isForwardFeed && loginUser.subPermissions.contains(SubPermission.BULLETIN)) { // 当前用户有公告权限,此时需要确认是否发送为公告 String msg = ResFinder.getString("umeng_comm_bulletin_tips"); DialogInterface.OnClickListener confirmListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { executeRealPostFeed(feedItem, true); } }; DialogInterface.OnClickListener cancelListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { executeRealPostFeed(feedItem, false); } }; ConfirmDialog.showDialog(mContext, msg, confirmListener, cancelListener); } else { // 普通feed executeRealPostFeed(feedItem, false); } } public void setRepost(boolean isRepost) { this.isRepost = isRepost; if (isRepost && mActivityView != null) { mActivityView.restoreFeedItem(FeedMemento.restoreMemento(mContext)); } } public void setForwardFeed(boolean isForwardFeed) { this.isForwardFeed = isForwardFeed; } /** * 执行整整的发送请求</br> */ private void executeRealPostFeed(FeedItem feedItem, boolean isbulletin) { executePostFeed(feedItem, isbulletin); if (isRepost) { mCommunitySDK.openCommunity(mContext); } mActivityView.startPostFeed(); } /** * 发布新的feed</br> */ private void executePostFeed(final FeedItem feedItem, boolean isbulletin) { feedItem.type = isbulletin ? 1 : 0; new PostFeedTask(feedItem).execute(); } protected void postFeedResponse(FeedItemResponse response, FeedItem feedItem) { if (mActivityView != null && NetworkUtils.handleResponseComm(response)) { PostNotifycation.showPostNotifycation(mContext, ResFinder.getString( "umeng_comm_send_failed"), feedItem.text); return; } if (response.errCode == ErrorCode.NO_ERROR) { ToastMsg.showShortMsgByResName("umeng_comm_send_success"); PostNotifycation.clearPostNotifycation(mContext); FeedMemento.clear(mContext); // 发送广播 BroadcastUtils.sendFeedPostBroadcast(mContext, feedItem); } } /** * 检查除了好友、话题之外字符数是否大于等于5,对于转发无这个要求 * * @return */ protected boolean isTextValid(FeedItem feedItem) { return mChecker.isValidText(feedItem.text); } /** * 检查分享内容是否有效</br> * * @return */ protected boolean hasContent(FeedItem feedItem) { return feedItem.text.trim().length() > 0; } public void getMyLocation() { LocationSDKManager.getInstance().getCurrentSDK() .requestLocation(mContext, new SimpleFetchListener<Location>() { @Override public void onComplete(Location result) { mLocation = result; if (mLocation != null) { // 获取详细的信息 getLocationDetailAddr(); } else { // 修改位置信息的状态 mActivityView.changeLocLayoutState(mLocation, mLocationItems); } } }); } /** * 获取地理位置详细信息</br> */ private void getLocationDetailAddr() { mCommunitySDK.getLocationAddr(mLocation, new SimpleFetchListener<LocationResponse>() { @Override public void onComplete(LocationResponse response) { mLocationItems.clear(); mLocationItems.addAll(response.result); mActivityView.changeLocLayoutState(mLocation, mLocationItems); } }); } /** * 转发feed * * @param feedItem 发布的新feed * @param forwardFeedItem 被转发的feed */ public void forwardFeed(FeedItem feedItem, final FeedItem forwardFeedItem) { if (!DeviceUtils.isNetworkAvailable(mContext)) { ToastMsg.showShortMsgByResName("umeng_comm_not_network"); return; } mActivityView.startPostFeed(); feedItem.type = 0;// 转发的Feed都不能mark为公告,避免数据同步的影响 mCommunitySDK.forward(feedItem, new SimpleFetchListener<FeedItemResponse>() { @Override public void onComplete(FeedItemResponse response) { if (NetworkUtils.handleResponseComm(response)) { Log.w("", "forward error . code = " + response.errCode); return; } // 被转发的原始feed被删除 if (response.errCode == ErrorCode.ORIGIN_FEED_DELETE_ERR_CODE || response.errCode == ErrorCode.ERR_CODE_FEED_UNAVAILABLE) { ToastMsg.showShortMsgByResName("umeng_comm_origin_feed_delete"); return; } FeedItem feedItem = response.result; // 原始feed不是当前被转发的feed,也就是被转发的feed也是转发feed类型的情况 if (!feedItem.sourceFeedId.equals(feedItem.sourceFeed.id)) { // 原始feed 转发数量加1 BroadcastUtils.sendFeedUpdateBroadcast(mContext, feedItem.sourceFeed); // 被转发的feed数量加1 BroadcastUtils.sendFeedUpdateBroadcast(mContext, forwardFeedItem); } postFeedResponse(response, feedItem); } }); } public void handleBackKeyPressed() { if (isRepost) { mCommunitySDK.openCommunity(mContext); } } /** * 存储feed,以便发送失败时进行重发 * * @param feedItem */ private void saveFeedItem(FeedItem feedItem) { // 保存这次要提交的数据,用于发送失败时的重新发送 FeedMemento.createMemento(mContext, feedItem); // 清除状态 mActivityView.clearState(); final String title = ResFinder.getString("umeng_comm_send_ing"); PostNotifycation.showPostNotifycation(mContext, title, feedItem.text); } /** * 发布Feed的异步任务,先上传每张图片,图片传递成功之后再将图片url设置为Feed参数,最后发布feed * * @author mrsimple */ class PostFeedTask extends AsyncTask<Void, Void, Boolean> { FeedItem mFeedItem; // 图片上传组件 ImageUploader mImageUploader = ImageUploaderManager.getInstance().getCurrentSDK(); List<ImageItem> uploadedImageItems = new ArrayList<ImageItem>(); public PostFeedTask(FeedItem feedItem) { mFeedItem = feedItem; } @Override protected void onPreExecute() { saveFeedItem(mFeedItem); } private List<String> getImagePathList(List<ImageItem> imageItems) { List<String> imagesList = new ArrayList<String>(imageItems.size()); for (ImageItem item : imageItems) { imagesList.add(Uri.parse(item.originImageUrl).getPath()); } return imagesList; } private boolean uploadFeedImages(List<ImageItem> imageItems) { if (!DeviceUtils.isNetworkAvailable(mContext)) { return false; } final List<String> imageUrls = getImagePathList(imageItems); uploadedImageItems = mImageUploader.upload(imageUrls); // 要上传的数量与传递成功的数量是否相同,即所有图片是否全部上传成功 return imageItems.size() == uploadedImageItems.size(); } @Override protected Boolean doInBackground(Void... params) { return uploadFeedImages(mFeedItem.imageUrls); } protected void onPostExecute(Boolean result) { if (result) { mFeedItem.imageUrls.clear(); // 使用上传得到的图片Url更新Feed,因为传递给服务器端的是上传成功后的url mFeedItem.imageUrls.addAll(uploadedImageItems); mCommunitySDK.postFeed(mFeedItem, postFeedListener); } else { PostNotifycation.showPostNotifycation(mContext, ResFinder.getString( "umeng_comm_send_failed"), mFeedItem.text); } } SimpleFetchListener<FeedItemResponse> postFeedListener = new SimpleFetchListener<FeedItemResponse>() { @Override public void onComplete(FeedItemResponse response) { postFeedResponse(response, response.result); } }; } }