package com.smartisanos.sidebar.view; import java.util.HashMap; import java.util.List; import java.util.Map; import com.smartisanos.sidebar.R; import com.smartisanos.sidebar.SidebarController; import com.smartisanos.sidebar.SidebarMode; import com.smartisanos.sidebar.SidebarStatus; import com.smartisanos.sidebar.util.BitmapUtils; import com.smartisanos.sidebar.util.BookmarkManager; import com.smartisanos.sidebar.util.Constants; import com.smartisanos.sidebar.util.FileInfo; import com.smartisanos.sidebar.util.ImageInfo; import com.smartisanos.sidebar.util.LOG; import com.smartisanos.sidebar.util.RecentClipManager; import com.smartisanos.sidebar.util.RecentFileManager; import com.smartisanos.sidebar.util.RecentPhotoManager; import com.smartisanos.sidebar.util.Utils; import com.smartisanos.sidebar.util.anim.Anim; import com.smartisanos.sidebar.util.anim.AnimListener; import com.smartisanos.sidebar.util.anim.AnimStatusManager; import com.smartisanos.sidebar.util.anim.AnimTimeLine; import com.smartisanos.sidebar.util.anim.Vector3f; import com.smartisanos.sidebar.view.ContentView.ContentType; import android.content.Context; import android.content.CopyHistoryItem; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.ViewTreeObserver; import android.widget.FrameLayout; public class TopView extends FrameLayout { private static final LOG log = LOG.getInstance(TopView.class); private SidebarController mController; private DimSpaceView mDisableView; private DimSpaceView mLeft, mRight; private TopItemView mPhotos, mFile, mClipboard; private Map<ITopItem, ContentType> mViewToType; private RecentPhotoManager mPhotoManager; private RecentFileManager mFileManager; private RecentClipManager mClipManager; private int mTopbarPhotoIconContentSize ; private int mTopbarPhotoIconContentPaddingTop; private int mTopbarFileIconContentPaddingTop; private View mShadowLine; private Context mContext; public TopView(Context context) { this(context, null); } public TopView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public TopView(Context context, AttributeSet attrs, int defStyleAttr) { this(context, attrs, defStyleAttr, 0); } public TopView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); mContext = context; mController = SidebarController.getInstance(mContext); mTopbarPhotoIconContentSize = context.getResources().getDimensionPixelSize(R.dimen.topbar_photo_icon_content_size); mTopbarPhotoIconContentPaddingTop = context.getResources().getDimensionPixelSize(R.dimen.topbar_photo_icon_content_paddingTop); mTopbarFileIconContentPaddingTop = context.getResources().getDimensionPixelSize(R.dimen.topbar_file_icon_content_paddingTop); } @Override protected void onFinishInflate() { super.onFinishInflate(); mDisableView = (DimSpaceView) findViewById(R.id.topbar_disable_view); mLeft = (DimSpaceView) findViewById(R.id.top_dim_view_left); mRight = (DimSpaceView) findViewById(R.id.top_dim_view_right); mPhotos = (TopItemView) findViewById(R.id.photo); mPhotos.setText(R.string.topbar_photo); mPhotos.setIconBackground(R.drawable.topbar_photo, R.drawable.topbar_photo_dim); mFile = (TopItemView) findViewById(R.id.file); mFile.setText(R.string.topbar_file); mFile.setIconBackground(R.drawable.topbar_file, R.drawable.topbar_file_dim); mClipboard = (TopItemView) findViewById(R.id.clipboard); mClipboard.setText(R.string.topbar_clipboard); mClipboard.setIconBackground(R.drawable.topbar_clipboard, R.drawable.topbar_clipboard_dim); mViewToType = new HashMap<ITopItem, ContentType>(); mViewToType.put(mLeft, ContentType.NONE); mViewToType.put(mPhotos, ContentType.PHOTO); mViewToType.put(mFile, ContentType.FILE); mViewToType.put(mClipboard, ContentType.CLIPBOARD); mViewToType.put(mRight, ContentType.NONE); mPhotos.setOnClickListener(mItemOnClickListener); mFile.setOnClickListener(mItemOnClickListener); mClipboard.setOnClickListener(mItemOnClickListener); // update icon content mPhotos.setIconContentPaddingTop(mTopbarPhotoIconContentPaddingTop); mPhotoManager = RecentPhotoManager.getInstance(mContext); mFile.setIconContentPaddingTop(mTopbarFileIconContentPaddingTop); mFileManager = RecentFileManager.getInstance(mContext); mClipManager = RecentClipManager.getInstance(mContext); mShadowLine = findViewById(R.id.top_view_shadow_line); } public void requestStatus(SidebarStatus status) { if (status == SidebarStatus.NORMAL) { resumeToNormal(); } else if (status == SidebarStatus.UNNAME) { dimAll(); } } private View.OnClickListener mItemOnClickListener = new View.OnClickListener() { @Override public void onClick(View v) { if (!(v instanceof TopItemView)) { // error ! return; } if (!AnimStatusManager.getInstance().canShowContentView()) { AnimStatusManager.getInstance().dumpStatus(); return; } TopItemView itemView = (TopItemView) v; if (mController.getCurrentContentType() == ContentType.NONE) { AnimStatusManager.getInstance().setStatus(AnimStatusManager.ON_TOP_VIEW_CLICK, true); AnimTimeLine animTimeLine = new AnimTimeLine(); mController.showContent(mViewToType.get(itemView)); for (ITopItem view : mViewToType.keySet()) { if (view == itemView) { animTimeLine.addTimeLine(view.highlight()); } else { animTimeLine.addTimeLine(view.dim()); } } animTimeLine.setAnimListener(new AnimListener() { @Override public void onStart() { } @Override public void onComplete(int type) { AnimStatusManager.getInstance().setStatus(AnimStatusManager.ON_TOP_VIEW_CLICK, false); } }); animTimeLine.start(); } else { if (mController.getCurrentContentType() == mViewToType.get(itemView)) { mController.dismissContent(true); resumeToNormal(); } else { // never happen ! } } } }; public void dimAll(){ AnimTimeLine timeLine = new AnimTimeLine(); for (ITopItem view : mViewToType.keySet()) { timeLine.addTimeLine(view.dim()); } timeLine.start(); } public void resumeToNormal() { if (AnimStatusManager.getInstance().getStatus(AnimStatusManager.ON_TOP_VIEW_RESUME)) { log.error("ON_TOP_VIEW_RESUME is true, return !"); return; } AnimStatusManager.getInstance().setStatus(AnimStatusManager.ON_TOP_VIEW_RESUME, true); AnimTimeLine timeLine = new AnimTimeLine(); for (ITopItem view : mViewToType.keySet()) { timeLine.addTimeLine(view.resume()); } timeLine.setAnimListener(new AnimListener() { @Override public void onStart() { } @Override public void onComplete(int type) { AnimStatusManager.getInstance().setStatus(AnimStatusManager.ON_TOP_VIEW_RESUME, false); } }); timeLine.start(); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: if (mController.getCurrentContentType() != ContentType.NONE) { if (AnimStatusManager.getInstance().canShowContentView()) { Utils.resumeSidebar(mContext); log.error("content not none ! resume sidebar..."); return true; } } } return super.dispatchTouchEvent(ev); } private AnimTimeLine mEnterAnimTimeLine = null; private void doAnimWhenEnter() { mShadowLine.setVisibility(View.INVISIBLE); int time = 200; int height = getHeight(); int fromY = -height; mPhotos.setAlpha(0); mFile.setAlpha(0); mClipboard.setAlpha(0); Vector3f moveFrom = new Vector3f(0, fromY); Vector3f moveTo = new Vector3f(); Anim photoMove = new Anim(mPhotos, Anim.MOVE, time, Anim.CUBIC_OUT, moveFrom, moveTo); Anim fileMove = new Anim(mFile, Anim.MOVE, time, Anim.CUBIC_OUT, moveFrom, moveTo); Anim clipboardMove = new Anim(mClipboard, Anim.MOVE, time, Anim.CUBIC_OUT, moveFrom, moveTo); Vector3f alphaFrom = new Vector3f(); Vector3f alphaTo = new Vector3f(0, 0, 1); Anim photoAlpha = new Anim(mPhotos, Anim.TRANSPARENT, time, Anim.CUBIC_OUT, alphaFrom, alphaTo); Anim fileAlpha = new Anim(mFile, Anim.TRANSPARENT, time, Anim.CUBIC_OUT, alphaFrom, alphaTo); Anim clipboardAlpha = new Anim(mClipboard, Anim.TRANSPARENT, time, Anim.CUBIC_OUT, alphaFrom, alphaTo); Anim showShadowLine = new Anim(mShadowLine, Anim.TRANSPARENT, 30, Anim.CUBIC_OUT, alphaFrom, alphaTo); showShadowLine.setListener(new AnimListener() { @Override public void onStart() { mShadowLine.setVisibility(VISIBLE); } @Override public void onComplete(int type) { mShadowLine.setAlpha(1); } }); showShadowLine.setDelay(170); setVisibility(View.INVISIBLE); Anim showBgShadow = new Anim(this, Anim.TRANSPARENT, 200, Anim.CUBIC_OUT, alphaFrom, alphaTo); showBgShadow.setListener(new AnimListener() { @Override public void onStart() { setVisibility(View.VISIBLE); } @Override public void onComplete(int type) { setAlpha(1); } }); showBgShadow.setDelay(120); mEnterAnimTimeLine = new AnimTimeLine(); mEnterAnimTimeLine.addAnim(photoMove); mEnterAnimTimeLine.addAnim(fileMove); mEnterAnimTimeLine.addAnim(clipboardMove); mEnterAnimTimeLine.addAnim(photoAlpha); mEnterAnimTimeLine.addAnim(fileAlpha); mEnterAnimTimeLine.addAnim(clipboardAlpha); mEnterAnimTimeLine.addAnim(showShadowLine); mEnterAnimTimeLine.addAnim(showBgShadow); mEnterAnimTimeLine.setAnimListener(new AnimListener() { @Override public void onStart() { AnimStatusManager.getInstance().setStatus(AnimStatusManager.ON_TOP_VIEW_ENTER, true); } @Override public void onComplete(int type) { if (mEnterAnimTimeLine != null) { AnimStatusManager.getInstance().setStatus(AnimStatusManager.ON_TOP_VIEW_ENTER, false); setBackgroundResource(R.drawable.background); mPhotos.setAlpha(1); mFile.setAlpha(1); mClipboard.setAlpha(1); mPhotos.setTranslationY(0); mFile.setTranslationY(0); mClipboard.setTranslationY(0); if (SidebarController.getInstance(mContext).getSidebarStatus() == SidebarStatus.UNNAME) { dimAll(); } mEnterAnimTimeLine = null; } } }); mEnterAnimTimeLine.start(); } private AnimTimeLine mExitAnimTimeLine = null; private void doAnimWhenExit() { setBackgroundResource(android.R.color.transparent); mShadowLine.setVisibility(View.INVISIBLE); int time = 200; Anim move = new Anim(this, Anim.MOVE, time, 0, new Vector3f(), new Vector3f(0, - getHeight())); Anim alpha = new Anim(this, Anim.TRANSPARENT, time, Anim.CUBIC_OUT, new Vector3f(0, 0, 1), new Vector3f()); mExitAnimTimeLine = new AnimTimeLine(); mExitAnimTimeLine.addAnim(move); mExitAnimTimeLine.addAnim(alpha); mExitAnimTimeLine.setAnimListener(new AnimListener() { @Override public void onStart() { AnimStatusManager.getInstance().setStatus(AnimStatusManager.ON_TOP_VIEW_EXIT, true); } @Override public void onComplete(int type) { if (mExitAnimTimeLine != null) { AnimStatusManager.getInstance().setStatus(AnimStatusManager.ON_TOP_VIEW_EXIT, false); resumeToNormal(); setTranslationY(0); setAlpha(1); setVisibility(View.GONE); mExitAnimTimeLine = null; } } }); mExitAnimTimeLine.start(); } public void show(boolean show) { if (show) { if (mExitAnimTimeLine != null) { log.error("mExitAnimTimeLine not null"); mExitAnimTimeLine.cancel(); } setVisibility(View.VISIBLE); final ViewTreeObserver observer = getViewTreeObserver(); observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { observer.removeOnGlobalLayoutListener(this); doAnimWhenEnter(); } }); } else { if (mEnterAnimTimeLine != null) { mEnterAnimTimeLine.cancel(); } doAnimWhenExit(); } } public void setEnabled(boolean enabled) { super.setEnabled(enabled); if (enabled) { mDisableView.resume().start(); } else { mDisableView.dim().start(); } } }