package com.smartandroid.sa.view;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Locale;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.LinearLayout.LayoutParams;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.ViewSwitcher;
/**
*
* @author Mehdi Sakout
* @author Danny Tsegai
*
*/
public class AutoLoading {
private View mTargetView;
private View.OnClickListener mClickListener;
private Context mContext;
private LayoutInflater mInflater;
private RelativeLayout mContainer;
private ArrayList<View> mCustomViews;
private ArrayList<View> mDefaultViews;
private ViewSwitcher mSwitcher;
// Default Tags
private final String TAG_INTERNET_OFF = "INTERNET_OFF";
private final String TAG_LOADING_CONTENT = "LOADING_CONTENT";
private final String TAG_OTHER_EXCEPTION = "OTHER_EXCEPTION";
// Default Strings
private final String MESSAGE_LOADING = "";
private final String TITLE_LOADING = "Loading";
private final String MESSAGE_NO_INTERNET = "Internet is off, please enable it";
private final String TITLE_NO_INTERNET = "Error";
private final String MESSAGE_FAILURE = "An error has occurred, retry again";
private final String TITLE_FAILURE = "Error";
private final String[] mSupportedAbsListViews = new String[] { "listview",
"gridview", "expandablelistView" };
private final String[] mSupportedViews = new String[] { "linearlayout",
"relativelayout", "scrollview" };
public AutoLoading(Context context, View targetView) {
this.mContext = context;
this.mInflater = ((Activity) mContext).getLayoutInflater();
this.mTargetView = targetView;
this.mContainer = new RelativeLayout(mContext);
this.mCustomViews = new ArrayList<View>();
this.mDefaultViews = new ArrayList<View>();
String type = mTargetView
.getClass()
.getName()
.substring(
mTargetView.getClass().getName().lastIndexOf('.') + 1)
.toLowerCase(Locale.getDefault());
if (Arrays.asList(mSupportedAbsListViews).contains(type))
initializeAbsListView();
else if (Arrays.asList(mSupportedViews).contains(type))
initializeViewContainer();
else
throw new IllegalArgumentException(
"TargetView type is not supported !");
}
public AutoLoading(Context context, int viewID) {
this.mContext = context;
this.mInflater = ((Activity) mContext).getLayoutInflater();
this.mTargetView = mInflater.inflate(viewID, null, false);
this.mContainer = new RelativeLayout(mContext);
this.mCustomViews = new ArrayList<View>();
this.mDefaultViews = new ArrayList<View>();
String type = mTargetView
.getClass()
.getName()
.substring(
mTargetView.getClass().getName().lastIndexOf('.') + 1)
.toLowerCase(Locale.getDefault());
if (Arrays.asList(mSupportedAbsListViews).contains(type))
initializeAbsListView();
else if (Arrays.asList(mSupportedViews).contains(type))
initializeViewContainer();
else
throw new IllegalArgumentException("ViewId type is not supported !");
}
private void initializeViewContainer() {
setDefaultViews();
mSwitcher = new ViewSwitcher(mContext);
ViewSwitcher.LayoutParams params = new ViewSwitcher.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
mSwitcher.setLayoutParams(params);
ViewGroup group = (ViewGroup) mTargetView.getParent();
int index = 0;
Clonner target = new Clonner(mTargetView);
if (group != null) {
index = group.indexOfChild(mTargetView);
group.removeView(mTargetView);
}
mSwitcher.addView(mContainer, 0);
mSwitcher.addView(target.getmView(), 1);
mSwitcher.setDisplayedChild(1);
if (group != null) {
group.addView(mSwitcher, index);
} else {
((Activity) mContext).setContentView(mSwitcher);
}
}
private void setDefaultViews() {
View mLayoutInternetOff = initView(
mContext.getResources().getIdentifier("exception_no_internet",
"layout", mContext.getPackageName()), TAG_INTERNET_OFF,
TITLE_NO_INTERNET, MESSAGE_NO_INTERNET);
// View mLayoutInternetOff =
// initView(R.layout.exception_no_internet,TAG_INTERNET_OFF,TITLE_NO_INTERNET,MESSAGE_NO_INTERNET);
View mLayoutLoadingContent = initView(
mContext.getResources().getIdentifier(
"exception_loading_content", "layout",
mContext.getPackageName()), TAG_LOADING_CONTENT,
TITLE_LOADING, MESSAGE_LOADING);
// View mLayoutLoadingContent =
// initView(R.layout.exception_loading_content,TAG_LOADING_CONTENT,TITLE_LOADING,MESSAGE_LOADING);
View mLayoutOther = initView(
mContext.getResources().getIdentifier("exception_failure",
"layout", mContext.getPackageName()),
TAG_OTHER_EXCEPTION, TITLE_FAILURE, MESSAGE_FAILURE);
// View mLayoutOther =
// initView(R.layout.exception_failure,TAG_OTHER_EXCEPTION,TITLE_FAILURE,MESSAGE_FAILURE);
mDefaultViews.add(0, mLayoutInternetOff);
mDefaultViews.add(1, mLayoutLoadingContent);
mDefaultViews.add(2, mLayoutOther);
// Hide all layouts at first initialization
mLayoutInternetOff.setVisibility(View.GONE);
mLayoutLoadingContent.setVisibility(View.GONE);
mLayoutOther.setVisibility(View.GONE);
// init Layout params
RelativeLayout.LayoutParams containerParams = new RelativeLayout.LayoutParams(
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
containerParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
containerParams.addRule(RelativeLayout.CENTER_VERTICAL);
// init new RelativeLayout Wrapper
mContainer.setLayoutParams(containerParams);
// Add default views
mContainer.addView(mLayoutLoadingContent);
mContainer.addView(mLayoutInternetOff);
mContainer.addView(mLayoutOther);
}
private void initializeAbsListView() {
setDefaultViews();
AbsListView abslistview = (AbsListView) mTargetView;
abslistview.setVisibility(View.GONE);
ViewGroup parent = (ViewGroup) abslistview.getParent();
if (mContainer != null) {
parent.addView(mContainer);
abslistview.setEmptyView(mContainer);
} else
throw new IllegalArgumentException("mContainer is null !");
}
public void showLoadingLayout() {
show(TAG_LOADING_CONTENT);
}
public void showInternetOffLayout() {
show(TAG_INTERNET_OFF);
}
public void showExceptionLayout() {
show(TAG_OTHER_EXCEPTION);
}
public void showCustomView(String tag) {
show(tag);
}
public void hideAll() {
ArrayList<View> views = new ArrayList<View>(mDefaultViews);
views.addAll(mCustomViews);
for (View view : views) {
view.setVisibility(View.GONE);
}
if (mSwitcher != null) {
mSwitcher.setDisplayedChild(1);
}
}
private void show(String tag) {
ArrayList<View> views = new ArrayList<View>(mDefaultViews);
views.addAll(mCustomViews);
for (View view : views) {
if (view.getTag() != null && view.getTag().toString().equals(tag)) {
view.setVisibility(View.VISIBLE);
} else {
view.setVisibility(View.GONE);
}
}
if (mSwitcher != null && mSwitcher.getDisplayedChild() != 0) {
mSwitcher.setDisplayedChild(0);
}
}
/**
* Return a view based on layout id
*
* @param layout
* Layout Id
* @param tag
* Layout Tag
* @return View
*/
private View initView(int layout, String tag, String title,
String description) {
View view = mInflater.inflate(layout, null, false);
view.setTag(tag);
view.setVisibility(View.GONE);
((TextView) view.findViewById(mContext.getResources().getIdentifier(
"exception_title", "id", mContext.getPackageName())))
.setText(title);
// ((TextView) view.findViewById(R.id.exception_title)).setText(title);
((TextView) view.findViewById(mContext.getResources().getIdentifier(
"exception_message", "id", mContext.getPackageName())))
// ((TextView) view.findViewById(R.id.exception_message))
.setText(description);
View buttonView = view.findViewById(mContext.getResources()
.getIdentifier("exception_button", "id",
mContext.getPackageName()));
// View buttonView = view.findViewById(R.id.exception_button);
if (buttonView != null)
buttonView.setOnClickListener(this.mClickListener);
return view;
}
/**
*
* @see <a
* href="http://developer.android.com/design/building-blocks/progress.html#activity">Android
* Design Guidelines for Activity Circles</a>
* @deprecated This method has been deprecated because it does not adhere to
* the Android design guidelines. Activity circle's should not
* display any text.
*
*/
public void setLoadingMessage(String message) {
((TextView) mDefaultViews.get(1).findViewById(
mContext.getResources().getIdentifier("exception_message",
"id", mContext.getPackageName())))
// ((TextView)
// mDefaultViews.get(1).findViewById(R.id.exception_message))
.setText(message);
}
public void setInternetOffMessage(String message) {
((TextView) mDefaultViews.get(0).findViewById(
mContext.getResources().getIdentifier("exception_message",
"id", mContext.getPackageName())))
// ((TextView)
// mDefaultViews.get(0).findViewById(R.id.exception_message))
.setText(message);
}
public void setOtherExceptionMessage(String message) {
((TextView) mDefaultViews.get(2).findViewById(
mContext.getResources().getIdentifier("exception_message",
"id", mContext.getPackageName())))
// ((TextView)
// mDefaultViews.get(2).findViewById(R.id.exception_message))
.setText(message);
}
public void setInternetOffTitle(String message) {
((TextView) mDefaultViews.get(0).findViewById(
mContext.getResources().getIdentifier("exception_title", "id",
mContext.getPackageName())))
// ((TextView) mDefaultViews.get(0).findViewById(R.id.exception_title))
.setText(message);
}
public void setOtherExceptionTitle(String message) {
((TextView) mDefaultViews.get(2).findViewById(
mContext.getResources().getIdentifier("exception_title", "id",
mContext.getPackageName())))
// ((TextView) mDefaultViews.get(2).findViewById(R.id.exception_title))
.setText(message);
}
public void setClickListener(View.OnClickListener clickListener) {
this.mClickListener = clickListener;
for (View view : mDefaultViews) {
View buttonView = view.findViewById(mContext.getResources()
.getIdentifier("exception_button", "id",
mContext.getPackageName()));
// View buttonView = view.findViewById(R.id.exception_button);
if (buttonView != null)
buttonView.setOnClickListener(this.mClickListener);
}
}
public void addCustomView(View customView, String tag) {
customView.setTag(tag);
customView.setVisibility(View.GONE);
mCustomViews.add(customView);
mContainer.addView(customView);
}
private class Clonner {
private View mView;
public Clonner(View view) {
this.setmView(view);
}
public View getmView() {
return mView;
}
public void setmView(View mView) {
this.mView = mView;
}
}
}