/*
* 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.ui.auth;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.GradientDrawable.Orientation;
import android.text.SpannableString;
import android.text.style.UnderlineSpan;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.socialize.android.ioc.IBeanFactory;
import com.socialize.api.SocializeSession;
import com.socialize.api.SocializeSessionPersister;
import com.socialize.auth.AuthProviderType;
import com.socialize.config.SocializeConfig;
import com.socialize.error.SocializeException;
import com.socialize.i18n.I18NConstants;
import com.socialize.i18n.LocalizationService;
import com.socialize.listener.SocializeAuthListener;
import com.socialize.log.SocializeLogger;
import com.socialize.networks.SocialNetwork;
import com.socialize.networks.facebook.FacebookSignInCell;
import com.socialize.networks.twitter.TwitterSignInCell;
import com.socialize.ui.dialog.DialogPanelView;
import com.socialize.ui.profile.UserSettings;
import com.socialize.ui.share.RememberCell;
import com.socialize.ui.util.Colors;
import com.socialize.ui.util.CompatUtils;
import com.socialize.ui.view.ClickableSectionCell;
import com.socialize.util.DisplayUtils;
import com.socialize.util.Drawables;
/**
* @author Jason Polites
*/
public class AuthPanelView extends DialogPanelView {
private Colors colors;
private Drawables drawables;
private DisplayUtils displayUtils;
private IBeanFactory<FacebookSignInCell> facebookSignInCellFactory;
private IBeanFactory<TwitterSignInCell> twitterSignInCellFactory;
private IBeanFactory<AnonymousCell> anonCellFactory;
private IBeanFactory<RememberCell> rememberAuthCellFactory;
private SocializeConfig config;
private SocializeSessionPersister sessionPersister;
private LocalizationService localizationService;
public AuthPanelView(Context context) {
super(context);
}
public AuthPanelView(Context context, AuthDialogListener listener) {
super(context);
this.authDialogListener = listener;
}
private AuthDialogListener authDialogListener;
private FacebookSignInCell facebookSignInCell;
private TwitterSignInCell twitterSignInCell;
private AnonymousCell anonymousCell;
private RememberCell rememberCell;
private TextView skipAuth;
float radii = 6;
int padding = 8;
int headerHeight = 45;
float headerRadius = 3;
private final float[] fbRadii = new float[]{radii, radii, radii, radii, 0.0f, 0.0f, 0.0f, 0.0f};
private final int[] fbStroke = new int[]{1, 1, 0, 1};
private final float[] twRadii = new float[]{0.0f, 0.0f, 0.0f, 0.0f, radii, radii, radii, radii};
private final int[] twStroke = new int[]{1, 1, 1, 1};
public void init() {
boolean landscape = false;
boolean lowRes = false;
if(displayUtils != null) {
padding = displayUtils.getDIP(12);
headerRadius = displayUtils.getDIP(3);
headerHeight = displayUtils.getDIP(45);
radii = displayUtils.getDIP(8);
landscape = displayUtils.isLandscape();
lowRes = displayUtils.isLowRes();
}
LayoutParams masterParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
masterParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL;
setLayoutParams(masterParams);
setOrientation(VERTICAL);
RelativeLayout container = new RelativeLayout(getContext());
LayoutParams containerParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
containerParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.TOP;
containerParams.weight = 1.0f;
container.setLayoutParams(containerParams);
makeAuthButtons();
View header = makeHeaderView(headerHeight, headerRadius);
RelativeLayout.LayoutParams contentParams = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
contentParams.addRule(RelativeLayout.CENTER_IN_PARENT);
LinearLayout contentLayout = new LinearLayout(getContext());
contentLayout.setPadding(padding, padding, padding, 0);
contentLayout.setLayoutParams(contentParams);
contentLayout.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.TOP);
LayoutParams socialNetworkButtonParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
contentLayout.setOrientation(VERTICAL);
LinearLayout socialNetworkButtonLayout = new LinearLayout(getContext());
socialNetworkButtonLayout.setPadding(0, 0, 0, 0);
socialNetworkButtonLayout.setOrientation(VERTICAL);
socialNetworkButtonLayout.setLayoutParams(socialNetworkButtonParams);
if(!landscape && !lowRes) {
View shareBadge = makeShareBadge();
contentLayout.addView(shareBadge);
}
if(facebookSignInCell != null || twitterSignInCell != null) {
if(facebookSignInCell != null) {
socialNetworkButtonLayout.addView(facebookSignInCell);
}
if(twitterSignInCell != null) {
socialNetworkButtonLayout.addView(twitterSignInCell);
}
contentLayout.addView(socialNetworkButtonLayout);
}
if(anonymousCell != null) {
contentLayout.addView(anonymousCell);
}
LayoutParams skipAuthParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
skipAuthParams.gravity = Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL;
skipAuthParams.weight = 1.0f;
if(displayUtils != null) {
skipAuthParams.setMargins(0, displayUtils.getDIP(30), 0, 0);
}
skipAuth = new TextView(getContext());
skipAuth.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 14);
if(colors != null) skipAuth.setTextColor(colors.getColor(Colors.ANON_CELL_TITLE));
skipAuth.setGravity(Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL);
skipAuth.setPadding(0, 0, 0, padding);
skipAuth.setLayoutParams(skipAuthParams);
if(rememberCell != null) {
contentLayout.addView(rememberCell);
}
contentLayout.addView(skipAuth);
container.addView(contentLayout);
addView(header);
addView(container);
}
public void setAuthRequired(final boolean required) {
if(!required) {
if(rememberCell != null) {
rememberCell.setVisibility(View.VISIBLE);
}
String mystring = localizationService.getString(I18NConstants.AUTH_RATHER_NOT);
SpannableString content = new SpannableString(mystring);
content.setSpan(new UnderlineSpan(), 0, mystring.length(), 0);
skipAuth.setText(content);
skipAuth.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(rememberCell != null && rememberCell.isToggled()) {
// Never auth again
UserSettings settings = getSocialize().getSession().getUserSettings();
settings.setShowAuthDialog(false);
sessionPersister.saveUserSettingsAsync(getContext(), settings);
}
if(authDialogListener != null) {
authDialogListener.onSkipAuth(getActivity(), dialog);
}
}
});
}
else {
if(rememberCell != null) {
rememberCell.setVisibility(View.GONE);
}
skipAuth.setText(localizationService.getString(I18NConstants.AUTH_REQUIRED));
}
}
protected View makeShareBadge() {
RelativeLayout.LayoutParams badgeParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
LayoutParams badgeLayoutParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
badgeLayoutParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL;
badgeParams.addRule(RelativeLayout.CENTER_IN_PARENT);
RelativeLayout badgeLayout = new RelativeLayout(getContext());
badgeLayout.setLayoutParams(badgeLayoutParams);
if(drawables != null) {
ImageView authBadge = new ImageView(getContext());
authBadge.setImageDrawable(drawables.getDrawable("auth_badge.png"));
authBadge.setLayoutParams(badgeParams);
authBadge.setPadding(0, 0, 0, padding);
badgeLayout.addView(authBadge);
}
return badgeLayout;
}
protected void makeAuthButtons() {
LayoutParams cellParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
boolean fbOK = getSocialize().isSupported(getContext(), AuthProviderType.FACEBOOK) && facebookSignInCellFactory != null;
boolean twOK = getSocialize().isSupported(getContext(), AuthProviderType.TWITTER) && twitterSignInCellFactory != null;
boolean rememberOk = rememberAuthCellFactory != null && config.isAllowNeverAuth();
if(fbOK) {
facebookSignInCell = facebookSignInCellFactory.getBean();
if(facebookSignInCell != null) {
facebookSignInCell.setLayoutParams(cellParams);
facebookSignInCell.setPadding(padding, padding, padding, padding);
if(twOK) {
twitterSignInCell = twitterSignInCellFactory.getBean();
twitterSignInCell.setPadding(padding, padding, padding, padding);
twitterSignInCell.setLayoutParams(cellParams);
facebookSignInCell.setBackgroundData(fbRadii, fbStroke, Color.BLACK);
twitterSignInCell.setBackgroundData(twRadii, twStroke, Color.BLACK);
}
}
}
else if(twOK) {
twitterSignInCell = twitterSignInCellFactory.getBean();
if(twitterSignInCell != null) {
twitterSignInCell.setLayoutParams(cellParams);
twitterSignInCell.setPadding(padding, padding, padding, padding);
}
}
if(facebookSignInCell != null) {
facebookSignInCell.setAuthListener(getAuthClickListener(facebookSignInCell, SocialNetwork.FACEBOOK));
}
if(twitterSignInCell != null) {
twitterSignInCell.setAuthListener(getAuthClickListener(twitterSignInCell, SocialNetwork.TWITTER));
}
if(rememberOk) {
rememberCell = rememberAuthCellFactory.getBean();
if(rememberCell != null) {
LayoutParams rememberCellParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
rememberCellParams.setMargins(0, padding, 0, 0);
rememberCell.setLayoutParams(rememberCellParams);
}
}
if(anonCellFactory != null) {
anonymousCell = anonCellFactory.getBean();
if(anonymousCell != null) {
LayoutParams anonCellParams = new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
anonCellParams.setMargins(0, padding, 0, 0);
anonymousCell.setLayoutParams(anonCellParams);
}
}
}
protected View makeHeaderView(int headerHeight, float headerRadius) {
LayoutParams headerParams = new LayoutParams(LayoutParams.FILL_PARENT, headerHeight);
TextView header = new TextView(getContext());
if(colors != null) {
GradientDrawable headerBG = new GradientDrawable(Orientation.BOTTOM_TOP, new int[]{colors.getColor(Colors.AUTH_PANEL_BOTTOM), colors.getColor(Colors.AUTH_PANEL_TOP)});
headerBG.setCornerRadii(new float[]{headerRadius, headerRadius, headerRadius, headerRadius, 0.0f, 0.0f, 0.0f, 0.0f});
CompatUtils.setBackgroundDrawable(header, headerBG);
}
if(localizationService != null) {
header.setText(localizationService.getString(I18NConstants.AUTH_HEADER));
}
header.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18);
header.setTextColor(Color.WHITE);
header.setGravity(Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL);
header.setLayoutParams(headerParams);
return header;
}
public void setFacebookSignInCellFactory(IBeanFactory<FacebookSignInCell> facebookSignInCellFactory) {
this.facebookSignInCellFactory = facebookSignInCellFactory;
}
public void setTwitterSignInCellFactory(IBeanFactory<TwitterSignInCell> twitterSignInCellFactory) {
this.twitterSignInCellFactory = twitterSignInCellFactory;
}
public void setDrawables(Drawables drawables) {
this.drawables = drawables;
}
public void setDisplayUtils(DisplayUtils deviceUtils) {
this.displayUtils = deviceUtils;
}
public FacebookSignInCell getFacebookSignInCell() {
return facebookSignInCell;
}
public TwitterSignInCell getTwitterSignInCell() {
return twitterSignInCell;
}
public void setAuthDialogListener(AuthDialogListener authDialogListener) {
this.authDialogListener = authDialogListener;
}
public void setAnonCellFactory(IBeanFactory<AnonymousCell> anonCellFactory) {
this.anonCellFactory = anonCellFactory;
}
public void setColors(Colors colors) {
this.colors = colors;
}
public void setConfig(SocializeConfig config) {
this.config = config;
}
public void setRememberAuthCellFactory(IBeanFactory<RememberCell> rememberAuthCellFactory) {
this.rememberAuthCellFactory = rememberAuthCellFactory;
}
public void setSessionPersister(SocializeSessionPersister sessionPersister) {
this.sessionPersister = sessionPersister;
}
public void setLocalizationService(LocalizationService localizationService) {
this.localizationService = localizationService;
}
protected SocializeAuthListener getAuthClickListener(final ClickableSectionCell cell, final SocialNetwork network) {
return new SocializeAuthListener() {
@Override
public void onError(SocializeException error) {
SocializeLogger.e(error.getMessage(), error);
showErrorToast(getContext(), error);
if(authDialogListener != null) {
authDialogListener.onError(getActivity(), dialog, error);
}
}
@Override
public void onAuthSuccess(SocializeSession session) {
if(authDialogListener != null) {
authDialogListener.onAuthenticate(getActivity(), dialog, network);
}
}
@Override
public void onAuthFail(SocializeException error) {
SocializeLogger.e(error.getMessage(), error);
showErrorToast(getContext(), error);
if(authDialogListener != null) {
authDialogListener.onError(getActivity(), dialog, error);
}
}
@Override
public void onCancel() {
if(authDialogListener != null) {
authDialogListener.onCancel(dialog);
}
}
};
}
}