/* * 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.action; import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.graphics.drawable.Drawable; import android.widget.ImageView; import android.widget.LinearLayout; import com.socialize.CommentUtils; import com.socialize.Socialize; import com.socialize.UserUtils; import com.socialize.android.ioc.IBeanFactory; import com.socialize.entity.Comment; import com.socialize.entity.SocializeAction; import com.socialize.entity.User; import com.socialize.error.SocializeException; import com.socialize.i18n.I18NConstants; import com.socialize.listener.ListenerHolder; import com.socialize.listener.comment.CommentGetListener; import com.socialize.listener.user.UserGetListener; import com.socialize.log.SocializeLogger; import com.socialize.ui.dialog.ProgressDialogFactory; import com.socialize.ui.image.ImageLoadListener; import com.socialize.ui.image.ImageLoadRequest; import com.socialize.ui.image.ImageLoader; import com.socialize.util.Drawables; import com.socialize.util.SafeBitmapDrawable; import com.socialize.util.StringUtils; import com.socialize.view.BaseView; /** * @author Jason Polites */ public class ActionDetailLayoutView extends BaseView { private String userId; // may be null private String actionId; private ProgressDialog dialog = null; private Drawable defaultProfilePicture; private SocializeAction currentAction; private ActionDetailContentView content; private OnActionDetailViewListener onActionDetailViewListener; private User currentUser; private int count = 0; // Injected private Drawables drawables; private IBeanFactory<ActionDetailContentView> actionDetailContentViewFactory; private ProgressDialogFactory progressDialogFactory; private ImageLoader imageLoader; private ListenerHolder listenerHolder; // End injected public ActionDetailLayoutView(Activity context, String userId) { this(context); this.userId = userId; if(this.userId != null) { this.userId = this.userId.trim(); } } public ActionDetailLayoutView(Activity context, String userId, String actionId) { this(context, userId); this.actionId = actionId; } public ActionDetailLayoutView(Context context) { super(context); } public void init() { LayoutParams fill = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT,LinearLayout.LayoutParams.FILL_PARENT); setOrientation(LinearLayout.VERTICAL); setLayoutParams(fill); setPadding(0, 0, 0, 0); setVerticalFadingEdgeEnabled(false); content = actionDetailContentViewFactory.getBean(); defaultProfilePicture = drawables.getDrawable(Socialize.DEFAULT_USER_ICON); onActionDetailViewListener = listenerHolder.pop("action_view"); addView(content); } @Override public void onViewLoad() { super.onViewLoad(); if(onActionDetailViewListener != null) { onActionDetailViewListener.onCreate(this); } reload(); } @Override public void onViewRendered(int width, int height) { super.onViewRendered(width, height); if(onActionDetailViewListener != null) { onActionDetailViewListener.onRender(this); } } public void reload() { if(getSocialize().isAuthenticated()) { dialog = progressDialogFactory.show(getContext(), I18NConstants.LOADING, I18NConstants.PLEASE_WAIT); count = 1; doGetAction(); } else { showError(getContext(), new SocializeException("Socialize not authenticated")); } } protected void countdown() { count--; if(count <= 0) { if(dialog != null) { dialog.dismiss(); } count = 0; } } public void doGetAction() { if(!StringUtils.isEmpty(actionId) && (currentAction == null || !currentAction.getId().equals(actionId))) { int id = Integer.parseInt(actionId); // TODO: this should be able to process generic actions. CommentUtils.getComment(getActivity(), new CommentGetListener() { @Override public void onError(SocializeException error) { countdown(); showError(getContext(), error); } @Override public void onGet(Comment entity) { ActionDetailLayoutView.this.currentAction = entity; content.setAction(entity); if(entity.getUser() != null) { doGetUserProfile(entity.getUser().getId(), entity); } else if(!StringUtils.isEmpty(userId)) { doGetUserProfile(Long.parseLong(userId), entity); } } }, id); } else if(!StringUtils.isEmpty(userId)) { doGetUserProfile(Long.parseLong(userId), null); } } protected void doGetUserProfile(SocializeAction action) { if(action != null && action.getUser() != null) { doGetUserProfile(action.getUser().getId(), action); } else if(!StringUtils.isEmpty(userId)) { doGetUserProfile(Long.parseLong(userId), action); } } protected void doGetUserProfile(final long userId, final SocializeAction action) { if(userId >= 0 && (currentUser == null || !currentUser.getId().equals(userId))) { UserUtils.getUser(getActivity(), userId, new UserGetListener() { @Override public void onGet(User user) { // Set the user details into the view elements currentUser = user; setUserDetails(user, action); countdown(); } @Override public void onError(SocializeException error) { countdown(); showError(getContext(), error); } }); } else { countdown(); } } public void setUserDetails(User user, SocializeAction action) { String profilePicData = user.getSmallImageUri(); final ImageView userIcon = content.getProfilePicture(); if(!StringUtils.isEmpty(profilePicData)) { userIcon.getBackground().setAlpha(64); imageLoader.loadImageByUrl(profilePicData, new ImageLoadListener() { @Override public void onImageLoadFail(ImageLoadRequest request, Exception error) { SocializeLogger.e(error.getMessage(), error); userIcon.post(new Runnable() { public void run() { userIcon.setImageDrawable(defaultProfilePicture); userIcon.getBackground().setAlpha(255); } }); } @Override public void onImageLoad(ImageLoadRequest request, final SafeBitmapDrawable drawable) { // Must be run on UI thread userIcon.post(new Runnable() { public void run() { drawable.setAlpha(255); userIcon.setImageDrawable(drawable); userIcon.getBackground().setAlpha(255); } }); } }); } else { userIcon.setImageDrawable(defaultProfilePicture); userIcon.getBackground().setAlpha(255); } content.getDisplayName().setText(user.getDisplayName()); content.loadUserActivity(user, action); } public void setDrawables(Drawables drawables) { this.drawables = drawables; } public void setUserId(String entityKey) { this.userId = entityKey; } public void setActionId(String actionId) { this.actionId = actionId; } public void setProgressDialogFactory(ProgressDialogFactory progressDialogFactory) { this.progressDialogFactory = progressDialogFactory; } public void setActionDetailContentViewFactory(IBeanFactory<ActionDetailContentView> actionDetailContentViewFactory) { this.actionDetailContentViewFactory = actionDetailContentViewFactory; } public void setImageLoader(ImageLoader imageLoader) { this.imageLoader = imageLoader; } public SocializeAction getCurrentAction() { return currentAction; } public void onProfileUpdate() { dialog = progressDialogFactory.show(getContext(), I18NConstants.LOADING, I18NConstants.PLEASE_WAIT); count = 1; currentUser = null; doGetUserProfile(currentAction); } public ActionDetailContentView getContent() { return content; } }