/*
* Copyright (c) 2012 Socialize 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.socialize.api.action.share;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.location.Location;
import com.socialize.api.SocializeSession;
import com.socialize.api.action.ShareType;
import com.socialize.api.action.SocializeActionUtilsBase;
import com.socialize.entity.Entity;
import com.socialize.entity.Share;
import com.socialize.entity.User;
import com.socialize.error.SocializeException;
import com.socialize.listener.share.ShareAddListener;
import com.socialize.listener.share.ShareGetListener;
import com.socialize.listener.share.ShareListListener;
import com.socialize.networks.PostData;
import com.socialize.networks.SocialNetwork;
import com.socialize.networks.SocialNetworkListener;
import com.socialize.ui.auth.AuthDialogListener;
import com.socialize.ui.auth.AuthPanelView;
import com.socialize.ui.auth.IAuthDialogFactory;
import com.socialize.ui.dialog.SafeProgressDialog;
import com.socialize.ui.share.DialogFlowController;
import com.socialize.ui.share.IShareDialogFactory;
import com.socialize.ui.share.ShareDialogListener;
import com.socialize.ui.share.SharePanelView;
import org.json.JSONObject;
/**
* @author Jason Polites
*/
public class SocializeShareUtils extends SocializeActionUtilsBase implements ShareUtilsProxy {
private ShareSystem shareSystem;
private IShareDialogFactory shareDialogFactory;
private IAuthDialogFactory authDialogFactory;
/*
* (non-Javadoc)
* @see com.socialize.api.action.share.ShareUtilsProxy#getUserShareOptions(android.content.Context)
*/
@Override
public ShareOptions getUserShareOptions(Context context) {
ShareOptions options = new ShareOptions();
populateActionOptions(context, options);
return options;
}
/*
* (non-Javadoc)
* @see com.socialize.api.action.share.ShareUtilsProxy#showLinkDialog(android.app.Activity, com.socialize.ui.auth.AuthDialogListener)
*/
@Override
public void showLinkDialog(Activity context, AuthDialogListener listener) {
authDialogFactory.show(context, listener, !config.isAllowSkipAuthOnAllActions());
}
@Override
public void preloadShareDialog(Activity context) {
shareDialogFactory.preload(context);
}
@Override
public void preloadLinkDialog(Activity context) {
authDialogFactory.preload(context);
}
/*
* (non-Javadoc)
* @see com.socialize.api.action.share.ShareUtilsProxy#showShareDialog(android.app.Activity, com.socialize.entity.Entity, int, com.socialize.api.action.share.SocialNetworkShareListener, com.socialize.ui.share.ShareDialogListener)
*/
@Override
public void showShareDialog(final Activity context, final Entity entity, int options, final SocialNetworkShareListener socialNetworkListener, final ShareDialogListener dialogListener) {
shareDialogFactory.show(context, entity, socialNetworkListener, new ShareDialogListener() {
SharePanelView dialogView;
@Override
public void onCancel(Dialog dialog) {
if(dialogListener != null) {
dialogListener.onCancel(dialog);
}
}
@Override
public void onShow(Dialog dialog, SharePanelView dialogView) {
if(dialogListener != null) {
dialogListener.onShow(dialog, dialogView);
}
this.dialogView = dialogView;
}
@Override
public void onSimpleShare(ShareType type) {
if(dialogListener != null) {
dialogListener.onSimpleShare(type);
}
}
@Override
public void onFlowInterrupted(DialogFlowController controller) {
// Will not be called.
}
@Override
public boolean onContinue(final Dialog dialog, boolean remember, final SocialNetwork... networks) {
boolean consumed = false;
if(dialogListener != null) {
consumed = dialogListener.onContinue(dialog, remember, networks);
}
if(!consumed) {
doShare(dialog, context, entity, socialNetworkListener, networks);
}
else {
dialogListener.onFlowInterrupted(new DialogFlowController() {
@Override
public void onContinue(String text) {
ShareOptions options = new ShareOptions();
options.setText(text);
doShare(dialog, context, entity, socialNetworkListener, options, networks);
}
@Override
public void onCancel() {
if(dialogView != null) {
dialogView.getContinueButton().setEnabled(true);
}
dialogListener.onCancel(dialog);
}
});
}
return false;
}
}, options);
}
protected void doShare(final Activity context, final Entity entity, final SocialNetworkShareListener socialNetworkListener, final ShareOptions shareOptions, final SocialNetwork... networks) {
doShare(null, context, entity, socialNetworkListener, shareOptions, networks);
}
protected void doShare(final Dialog dialog, final Activity context, final Entity entity, final SocialNetworkShareListener socialNetworkListener, final SocialNetwork... networks) {
doShare(dialog, context, entity, socialNetworkListener, null, networks);
}
protected void doShare(final Dialog dialog, final Activity context, final Entity entity, final SocialNetworkShareListener socialNetworkListener, final ShareOptions shareOptions, final SocialNetwork... networks) {
final ProgressDialog progress = SafeProgressDialog.show(context);
ShareType shareType = ShareType.OTHER;
if(networks != null && networks.length == 1) {
shareType = ShareType.valueOf(networks[0]);
}
String text = null;
if(shareOptions != null) {
text = shareOptions.getText();
}
if(text == null) {
text = "";
}
final String fText = text;
shareSystem.addShare(context, getSocialize().getSession(), entity, text, shareType, new ShareAddListener() {
@Override
public void onError(SocializeException error) {
if(socialNetworkListener != null) {
socialNetworkListener.onError(error);
}
progress.dismiss();
if(dialog != null) {
dialog.dismiss();
}
}
@Override
public void onCreate(Share share) {
if(socialNetworkListener != null) {
socialNetworkListener.onCreate(share);
}
if(share != null && shareSystem != null && networks != null && networks.length > 0) {
for (final SocialNetwork network : networks) {
shareSystem.share(context, getSocialize().getSession(), share, fText, null, ShareType.valueOf(network), socialNetworkListener);
}
}
progress.dismiss();
if(dialog != null) {
dialog.dismiss();
}
}
}, networks);
}
/*
* (non-Javadoc)
* @see com.socialize.api.action.share.ShareUtilsProxy#registerShare(android.app.Activity, com.socialize.entity.Entity, com.socialize.api.action.share.ShareOptions, com.socialize.listener.share.ShareAddListener, com.socialize.networks.SocialNetwork[])
*/
@Override
public void registerShare(Activity context, Entity entity, ShareOptions shareOptions, ShareAddListener listener, SocialNetwork...networks) {
String text = null;
if(shareOptions != null) text = shareOptions.getText();
if(text == null) text = "";
ShareType shareType = ShareType.OTHER;
if(networks != null && networks.length > 0) {
if(networks.length == 1) {
shareType = ShareType.valueOf(networks[0]);
}
}
shareSystem.addShare(context, getSocialize().getSession(), entity, text, shareType, listener, networks);
}
/*
* (non-Javadoc)
* @see com.socialize.api.action.share.ShareUtilsProxy#shareViaEmail(android.app.Activity, com.socialize.entity.Entity, com.socialize.listener.share.ShareAddListener)
*/
@Override
public void shareViaEmail(Activity context, Entity entity, ShareAddListener listener) {
doShare(context, entity, ShareType.EMAIL, listener);
}
/*
* (non-Javadoc)
* @see com.socialize.api.action.share.ShareUtilsProxy#shareViaGooglePlus(android.app.Activity, com.socialize.entity.Entity, com.socialize.listener.share.ShareAddListener)
*/
@Override
public void shareViaGooglePlus(Activity context, Entity entity, ShareAddListener listener) {
doShare(context, entity, ShareType.GOOGLE_PLUS, listener);
}
/*
* (non-Javadoc)
* @see com.socialize.api.action.share.ShareUtilsProxy#shareViaOther(android.app.Activity, com.socialize.entity.Entity, com.socialize.listener.share.ShareAddListener)
*/
@Override
public void shareViaOther(Activity context, Entity entity, ShareAddListener listener) {
doShare(context, entity, ShareType.OTHER, listener);
}
/*
* (non-Javadoc)
* @see com.socialize.api.action.share.ShareUtilsProxy#shareViaSMS(android.app.Activity, com.socialize.entity.Entity, com.socialize.listener.share.ShareAddListener)
*/
@Override
public void shareViaSMS(Activity context, Entity entity, ShareAddListener listener) {
doShare(context, entity, ShareType.SMS, listener);
}
// Creates the socialize share object.
protected void doShare(final Activity context, final Entity entity, final ShareType shareType, final ShareAddListener shareAddListener) {
final SocializeSession session = getSocialize().getSession();
shareSystem.addShare(context, session, entity, "", shareType, null, new ShareAddListener() {
@Override
public void onError(SocializeException error) {
if(shareAddListener != null) {
shareAddListener.onError(error);
}
}
@Override
public void onCreate(Share share) {
if(share != null && shareSystem != null) {
handleNonNetworkShare(context, session, shareType, share, "", null, shareAddListener);
}
}
});
}
// Handles a non-network share like email or SMS.
protected void handleNonNetworkShare(Activity activity, final SocializeSession session, final ShareType shareType, final Share share, String shareText, Location location, final ShareAddListener shareAddListener) {
SocialNetworkListener snListener = new SocialNetworkListener() {
@Override
public void onNetworkError(Activity context, SocialNetwork network, Exception error) {
if(shareAddListener != null) {
shareAddListener.onError(SocializeException.wrap(error));
}
}
@Override
public void onCancel() {
if(shareAddListener != null) {
shareAddListener.onCancel();
}
}
@Override
public boolean onBeforePost(Activity parent, SocialNetwork socialNetwork, PostData postData) {
return shareAddListener instanceof SocialNetworkListener && ((SimpleShareListener) shareAddListener).onBeforePost(parent, socialNetwork, postData);
}
@Override
public void onAfterPost(Activity parent, SocialNetwork socialNetwork, JSONObject responseObject) {
if(shareAddListener != null) {
shareAddListener.onCreate(share);
}
}
};
shareSystem.share(activity, session, share, shareText, location, shareType, snListener);
}
/*
* (non-Javadoc)
* @see com.socialize.api.action.share.ShareUtilsProxy#shareViaSocialNetworks(android.app.Activity, com.socialize.entity.Entity, com.socialize.api.action.share.ShareOptions, com.socialize.api.action.share.SocialNetworkShareListener, com.socialize.networks.SocialNetwork[])
*/
@Override
public void shareViaSocialNetworks(Activity context, final Entity entity, final ShareOptions shareOptions, final SocialNetworkShareListener listener, final SocialNetwork...networks) {
final SocializeSession session = getSocialize().getSession();
if(isDisplayAuthDialog(context, session, shareOptions, networks)) {
authDialogFactory.show(context, new AuthDialogListener() {
@Override
public void onShow(Dialog dialog, AuthPanelView dialogView) {}
@Override
public void onCancel(Dialog dialog) {
if(listener != null) {
listener.onCancel();
}
}
@Override
public void onSkipAuth(Activity context, Dialog dialog) {
dialog.dismiss();
doShare(context, entity, listener, shareOptions, networks);
}
@Override
public void onError(Activity context, Dialog dialog, Exception error) {
dialog.dismiss();
if(listener != null) {
listener.onError(SocializeException.wrap(error));
}
}
@Override
public void onAuthenticate(Activity context, Dialog dialog, SocialNetwork network) {
dialog.dismiss();
doShare(context, entity, listener, shareOptions, network);
}
}, !config.isAllowSkipAuthOnAllActions());
}
else {
doShare(context, entity, listener, shareOptions, networks);
}
}
/*
* (non-Javadoc)
* @see com.socialize.api.action.share.ShareUtilsProxy#getShare(android.app.Activity, com.socialize.listener.share.ShareGetListener, long)
*/
@Override
public void getShare(Activity context, ShareGetListener listener, long id) {
shareSystem.getShare(getSocialize().getSession(), id, listener);
}
/*
* (non-Javadoc)
* @see com.socialize.api.action.share.ShareUtilsProxy#getShares(android.app.Activity, com.socialize.listener.share.ShareListListener, long[])
*/
@Override
public void getShares(Activity context, ShareListListener listener, long... ids) {
shareSystem.getSharesById(getSocialize().getSession(), listener, ids);
}
/*
* (non-Javadoc)
* @see com.socialize.api.action.share.ShareUtilsProxy#getSharesByUser(android.app.Activity, long, int, int, com.socialize.listener.share.ShareListListener)
*/
@Override
public void getSharesByUser(Activity context, User user, int start, int end, ShareListListener listener) {
shareSystem.getSharesByUser(getSocialize().getSession(), user.getId(), start, end, listener);
}
/*
* (non-Javadoc)
* @see com.socialize.api.action.share.ShareUtilsProxy#getSharesByEntity(android.app.Activity, java.lang.String, int, int, com.socialize.listener.share.ShareListListener)
*/
@Override
public void getSharesByEntity(Activity context, String entityKey, int start, int end, ShareListListener listener) {
shareSystem.getSharesByEntity(getSocialize().getSession(), entityKey, start, end, listener);
}
/*
* (non-Javadoc)
* @see com.socialize.api.action.share.ShareUtilsProxy#getSharesByApplication(android.app.Activity, int, int, com.socialize.listener.share.ShareListListener)
*/
@Override
public void getSharesByApplication(Activity context, int start, int end, ShareListListener listener) {
shareSystem.getSharesByApplication(getSocialize().getSession(), start, end, listener);
}
/*
* (non-Javadoc)
* @see com.socialize.api.action.share.ShareUtilsProxy#canShareViaEmail(android.app.Activity)
*/
@Override
public boolean canShareViaEmail(Activity context) {
return getSocialize().canShare(context, ShareType.EMAIL);
}
/*
* (non-Javadoc)
* @see com.socialize.api.action.share.ShareUtilsProxy#canShareViaSMS(android.app.Activity)
*/
@Override
public boolean canShareViaSMS(Activity context) {
return getSocialize().canShare(context, ShareType.SMS);
}
public void setShareSystem(ShareSystem shareSystem) {
this.shareSystem = shareSystem;
}
public void setShareDialogFactory(IShareDialogFactory shareDialogFactory) {
this.shareDialogFactory = shareDialogFactory;
}
public void setAuthDialogFactory(IAuthDialogFactory authDialogFactory) {
this.authDialogFactory = authDialogFactory;
}
}