package com.smartisanos.sidebar.view; import java.util.HashMap; import java.util.Map; import android.content.Context; import android.content.res.Configuration; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.widget.RelativeLayout; import com.smartisanos.sidebar.R; import com.smartisanos.sidebar.SidebarController; import com.smartisanos.sidebar.util.LOG; import com.smartisanos.sidebar.util.Utils; import com.smartisanos.sidebar.util.anim.Anim; import com.smartisanos.sidebar.util.anim.Vector3f; public class ContentView extends RelativeLayout { private static final LOG log = LOG.getInstance(ContentView.class); public interface ISubView{ void show(boolean anim); void dismiss(boolean anim); } public enum ContentType{ NONE, PHOTO, FILE, CLIPBOARD, } private RecentPhotoViewGroup mRecentPhotoViewGroup; private RecentFileViewGroup mRecentFileViewGroup; private ClipboardViewGroup mClipboardViewGroup; private ContentType mCurType = ContentType.NONE; private Map<ContentType, ISubView> mMapTypeToView = new HashMap<ContentType, ISubView>(); public ContentView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ContentView(Context context, AttributeSet attrs, int defStyleAttr) { this(context, attrs, defStyleAttr, 0); } public ContentView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); } public ContentType getCurrentContent(){ return mCurType; } public void setCurrent(ContentType ct){ mCurType = ct; } private static final int ANIMATION_DURA = 300; public void show(ContentType ct, boolean anim) { if (mCurType != ContentType.NONE || !mMapTypeToView.containsKey(ct)) { return; } mCurType = ct; mMapTypeToView.get(ct).show(anim); if (anim) { Anim alphaAnim = new Anim(this, Anim.TRANSPARENT, ANIMATION_DURA, Anim.CUBIC_OUT, new Vector3f(), new Vector3f(0, 0, 1)); alphaAnim.start(); } else { setAlpha(1.0f); } } public void dismiss(ContentType ct, boolean anim) { if (mCurType != ct || !mMapTypeToView.containsKey(ct)) { return; } mCurType = ContentType.NONE; mMapTypeToView.get(ct).dismiss(anim); if(anim){ Anim alphaAnim = new Anim(this, Anim.TRANSPARENT, ANIMATION_DURA, Anim.CUBIC_OUT, new Vector3f(0, 0, 1), new Vector3f()); alphaAnim.start(); } } @Override protected void onFinishInflate() { super.onFinishInflate(); mRecentPhotoViewGroup = (RecentPhotoViewGroup)findViewById(R.id.recent_photo_view_group); mRecentPhotoViewGroup.setContentView(this); mRecentFileViewGroup = (RecentFileViewGroup)findViewById(R.id.recent_file_view_group); mRecentFileViewGroup.setContentView(this); mClipboardViewGroup = (ClipboardViewGroup)findViewById(R.id.clipboard_view_group); mClipboardViewGroup.setContentView(this); mMapTypeToView.put(ContentType.PHOTO, mRecentPhotoViewGroup); mMapTypeToView.put(ContentType.FILE, mRecentFileViewGroup); mMapTypeToView.put(ContentType.CLIPBOARD, mClipboardViewGroup); } @Override protected void onChildVisibilityChanged(View child, int oldVisibility, int newVisibility) { super.onChildVisibilityChanged(child, oldVisibility, newVisibility); if(newVisibility != View.VISIBLE){ int count = getChildCount(); for(int i = 0;i < count; ++ i){ if(getChildAt(i).getVisibility() == View.VISIBLE){ // do nothing return ; } } setVisibility(View.GONE); }else{ setVisibility(View.VISIBLE); } } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: Utils.resumeSidebar(mContext); return true; default: break; } return super.onTouchEvent(event); } @Override public boolean dispatchKeyEvent(KeyEvent event) { switch (event.getKeyCode()) { case KeyEvent.KEYCODE_BACK: boolean isUp = event.getAction() == KeyEvent.ACTION_UP; if (isUp && getCurrentContent() != ContentType.NONE) { Utils.resumeSidebar(mContext); } break; default: break; } return super.dispatchKeyEvent(event); } }