package com.socialize.view;
import android.app.Activity;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.LinearLayout;
import android.widget.Toast;
import com.socialize.Socialize;
import com.socialize.SocializeService;
import com.socialize.error.SocializeErrorHandler;
import com.socialize.log.SocializeLogger;
public abstract class BaseView extends LinearLayout implements SocializeView {
private SocializeErrorHandler errorHandler;
private int loadCount = 0;
private int lastId = 0;
private boolean rendered = false;
private Toast toast;
public BaseView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public BaseView(Context context) {
super(context);
}
public void showErrorToast(Context context, Exception e) {
if(toast != null) toast.cancel();
toast = Toast.makeText(context, "Error: " + e.getMessage(), Toast.LENGTH_LONG);
toast.show();
}
public void showError(Context context, Exception e) {
if(errorHandler != null) {
errorHandler.handleError(context, e);
}
else {
SocializeLogger.e("", e);
}
}
public SocializeErrorHandler getErrorHandler() {
return errorHandler;
}
public void setErrorHandler(SocializeErrorHandler errorHandler) {
this.errorHandler = errorHandler;
}
protected SocializeService getSocialize() {
return Socialize.getSocialize();
}
/* (non-Javadoc)
* @see com.socialize.view.SocializeView#getActivity()
*/
@Override
public Activity getActivity() {
Context context = getContext();
if(context instanceof Activity) {
return (Activity) context;
}
return null;
}
@Override
protected void onWindowVisibilityChanged(int visibility) {
super.onWindowVisibilityChanged(visibility);
if(!isInEditMode()) {
if(visibility == VISIBLE) {
try {
if(!checkLoaded()) {
onViewLoad();
}
else {
onViewUpdate();
}
}
catch (Exception e) {
onViewError(e);
}
}
else {
rendered = false;
}
}
else {
// Add the default Socialize View for display
View editView = getEditModeView();
if(editView != null) {
addView(editView);
}
}
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
onRender(w, h);
}
protected void onRender(int w, int h) {
if(!rendered) {
rendered = true;
try {
onViewRendered(w, h);
}
catch (Exception e) {
onViewError(e);
}
}
}
protected void incrementLoaded() {
loadCount++;
}
protected boolean checkLoaded() {
boolean loaded = (loadCount > 0);
incrementLoaded();
return loaded;
}
// Subclasses override
protected View getEditModeView() {
return null;
}
public void assignId(View parent) {
setId(getNextViewId(parent));
}
/* (non-Javadoc)
* @see com.socialize.view.SocializeView#onViewUpdate()
*/
@Override
public void onViewUpdate() {}
/* (non-Javadoc)
* @see com.socialize.view.SocializeView#onViewLoad()
*/
@Override
public void onViewLoad() {}
@Override
public void onViewError(Exception e) {
setVisibility(View.GONE);
}
/* (non-Javadoc)
* @see com.socialize.view.SocializeView#onViewRendered(int, int)
*/
@Override
public void onViewRendered(int width, int height) {}
protected View getParentView() {
ViewParent parent = getParent();
if(parent instanceof View) {
return (View) parent;
}
return this;
}
protected int getNextViewId(View parent) {
if(parent instanceof ViewGroup) {
ViewGroup group = (ViewGroup) parent;
int childCount = group.getChildCount();
if(childCount > 0) {
int id = 0;
for (int i = 0; i < childCount; i++) {
View child = group.getChildAt(i);
int childId = child.getId();
if(childId > id) {
id = childId;
}
}
while(id < lastId) {
id++;
}
lastId = id+1;
return lastId;
}
}
return ++lastId;
}
}