package com.smartisanos.sidebar.view; import android.app.ActivityManager; import android.content.Context; import android.content.Intent; import android.os.RemoteException; import android.os.ServiceManager; import android.util.AttributeSet; import android.view.DragEvent; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.view.onestep.OneStepManager; import android.widget.AdapterView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; 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.AppItem; import com.smartisanos.sidebar.util.ContactItem; import com.smartisanos.sidebar.util.ContactManager; import com.smartisanos.sidebar.util.DingDingContact; import com.smartisanos.sidebar.util.LOG; import com.smartisanos.sidebar.util.MailContact; import com.smartisanos.sidebar.util.MmsContact; import com.smartisanos.sidebar.util.Tracker; import com.smartisanos.sidebar.util.Utils; import com.smartisanos.sidebar.util.WechatContact; 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 java.util.ArrayList; import java.util.List; public class SideView extends RelativeLayout { private static final LOG log = LOG.getInstance(SideView.class); private View mExitAndAdd; private View mLeftShadow, mRightShadow; private ImageView mExit, mSetting; private SidebarListView mOngoingList, mContactList, mAppList; private SidebarListView mOngoingListFake, mContactListFake, mShareList; private OngoingAdapter mOngoingAdapter; private AppListAdapter mAppAdapter; private ResolveInfoListAdapter mResolveAdapter; private DragScrollView mScrollViewNormal, mScrollViewDragged; private ContactListAdapter mContactAdapter; private Context mContext; private SidebarListView mDraggedListView; private LinearLayout mSideViewContentDragged; private DimSpaceView mDimView; private OneStepManager mOneStepManager; public SideView(Context context) { this(context, null); } public SideView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public SideView(Context context, AttributeSet attrs, int defStyleAttr) { this(context, attrs, defStyleAttr, 0); } public SideView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); mContext = context; } public void setDraggedList(SidebarListView listview) { mDraggedListView = listview; } public SidebarListView getDraggedListView() { return mDraggedListView; } @Override protected void onFinishInflate() { super.onFinishInflate(); mDimView = (DimSpaceView)findViewById(R.id.side_dim_view); mExitAndAdd = findViewById(R.id.exit_and_add); mExit = (ImageView) findViewById(R.id.exit); mLeftShadow = findViewById(R.id.left_shadow); mRightShadow = findViewById(R.id.right_shadow); mOneStepManager = (OneStepManager)mContext.getSystemService(Context.ONE_STEP_SERVICE); updateUIBySidebarMode(); mExit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (ActivityManager.isUserAMonkey()) { return; } AnimStatusManager asm = AnimStatusManager.getInstance(); if (asm.isEnterAnimOngoing() || asm.isExitAnimOngoing()) { return; } mOneStepManager.resetWindow(); } }); mSetting = (ImageView) findViewById(R.id.setting); mSetting.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Utils.dismissAllDialog(mContext); Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_LAUNCHER); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); intent.setPackage(mContext.getPackageName());// ourself mContext.startActivity(intent); Tracker.onClick(Tracker.EVENT_SET); } }); mSideViewContentDragged = (LinearLayout) findViewById(R.id.side_view_dragged); // //ongoing mOngoingList = (SidebarListView) findViewById(R.id.ongoinglist); mOngoingList.setSideView(this); mOngoingList.setAdapter(mOngoingAdapter = new OngoingAdapter(mContext)); mOngoingListFake = (SidebarListView) findViewById(R.id.ongoinglist_fake); mOngoingListFake.setSideView(this); mOngoingListFake.setAdapter(new OngoingAdapter(mContext)); //contact mContactList = (SidebarListView) findViewById(R.id.contactlist); mContactList.setSideView(this); mContactList.setNeedFootView(true); mContactAdapter = new ContactListAdapter(mContext); mContactAdapter.isEnableIconShadow = true; mContactList.setAdapter(mContactAdapter); mContactList.setOnItemClickListener(mContactItemOnClickListener); mContactListFake = (SidebarListView) findViewById(R.id.contactlist_fake); mContactListFake.setSideView(this); mContactListFake.setNeedFootView(true); mContactListFake.setAdapter(new ContactListAdapter(mContext)); mAppList = (SidebarListView) findViewById(R.id.applist); mAppList.setSideView(this); mAppAdapter = new AppListAdapter(mContext, mAppList); mAppList.setAdapter(mAppAdapter); mAppList.setOnItemClickListener(mAppItemOnClickListener); mShareList = (SidebarListView) findViewById(R.id.sharelist); mShareList.setSideView(this); mShareList.setAdapter(mResolveAdapter = new ResolveInfoListAdapter(mContext, mShareList)); mScrollViewNormal = (DragScrollView) findViewById(R.id.sideview_scroll_list_normal); mScrollViewDragged = (DragScrollView) findViewById(R.id.sideview_scroll_list_dragged); Utils.setAlwaysCanAcceptDragForAll(mSideViewContentDragged, true); mScrollViewDragged.setOnDragListener(new View.OnDragListener() { @Override public boolean onDrag(View v, DragEvent event) { //this is necessary, if the parent of mSideViewContentDragged return false, the sideview //will not dispatch event to mSideViewContentDragged ... return true; } }); ViewGroup vg= (ViewGroup) mScrollViewDragged.getParent(); vg.setOnDragListener(new View.OnDragListener() { @Override public boolean onDrag(View v, DragEvent event) { //this is necessary, if the parent of mSideViewContentDragged return false, the sideview //will not dispatch event to mSideViewContentDragged ... return true; } }); } public void notifyDataSetChanged() { mAppAdapter.notifyDataSetChanged(); mResolveAdapter.notifyDataSetChanged(); } public void requestStatus(SidebarStatus status) { if(status == SidebarStatus.NORMAL) { //show mSideViewContentNormal onDragEnd(null); } else { //show mSideViewContentDragged onDragStart(null); } } public View getShadowLineView() { if (mLeftShadow != null) { if (mLeftShadow.getVisibility() == VISIBLE) { return mLeftShadow; } } if (mRightShadow != null) { if (mRightShadow.getVisibility() == VISIBLE) { return mRightShadow; } } return null; } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); refreshDivider(); } private void refreshDivider() { // for normal int now = 0; mOngoingList.setNeedFootView(now > 0); now += mOngoingList.getChildCount(); mContactList.setNeedFootView(now > 0); now += mContactList.getChildCount(); mAppList.setNeedFootView(now > 0); // for fake now = 0; mOngoingListFake.setNeedFootView(now > 0); now += mOngoingListFake.getChildCount(); mContactListFake.setNeedFootView(now > 0); now += mContactListFake.getChildCount(); mShareList.setNeedFootView(now > 0); } private AnimTimeLine mSwitchContentAnim; private void onDragStart(final DragEvent event) { if (mSwitchContentAnim != null) { mSwitchContentAnim.cancel(); } int deltaWidth = mContext.getResources().getDimensionPixelSize(R.dimen.sidebar_list_anim_padding); boolean leftMode = (SidebarController.getInstance(mContext).getSidebarMode() == SidebarMode.MODE_LEFT); int width = getWidth() + deltaWidth; int outTo = leftMode ? -width : width; mSwitchContentAnim = new AnimTimeLine(); int time = 300; final List<View> disappearViews = new ArrayList<View>(); disappearViews.addAll(mOngoingList.getViewList()); disappearViews.addAll(mContactList.getViewList()); disappearViews.addAll(mAppList.getViewList()); if (disappearViews.size() > 0) { Vector3f scaleFrom = new Vector3f(1, 1); Vector3f scaleTo = new Vector3f(0.2f, 0.2f); Vector3f alphaFrom = new Vector3f(0, 0, 1); Vector3f alphaTo = new Vector3f(0, 0, 0); int count = disappearViews.size(); for (int i = 0; i < count; i++) { View view = disappearViews.get(i); Anim scale = new Anim(view, Anim.SCALE, time, Anim.CUBIC_OUT, scaleFrom, scaleTo); Anim alpha = new Anim(view, Anim.TRANSPARENT, time, Anim.CUBIC_OUT, alphaFrom, alphaTo); mSwitchContentAnim.addAnim(scale); mSwitchContentAnim.addAnim(alpha); } } if (event != null) { mOngoingListFake.onDragStart(event); mContactListFake.onDragStart(event); mShareList.onDragStart(event); } mScrollViewDragged.setTranslationX(outTo); Anim inAnim = new Anim(mScrollViewDragged, Anim.MOVE, time, Anim.CUBIC_OUT, new Vector3f(outTo, 0), new Vector3f()); inAnim.setDelay(time / 4); mSwitchContentAnim.addAnim(inAnim); mSwitchContentAnim.setAnimListener(new AnimListener() { @Override public void onStart() { mScrollViewDragged.setVisibility(VISIBLE); } @Override public void onComplete(int type) { if (mSwitchContentAnim != null) { int count = disappearViews.size(); for (int i = 0; i < count; i++) { View view = disappearViews.get(i); view.setAlpha(1); view.setScaleX(1); view.setScaleY(1); } mScrollViewNormal.setVisibility(GONE); mScrollViewDragged.setVisibility(VISIBLE); mScrollViewDragged.setTranslationX(0); mSwitchContentAnim = null; } } }); mSwitchContentAnim.start(); } private void onDragEnd(DragEvent event) { if (mSwitchContentAnim != null) { mSwitchContentAnim.cancel(); } int deltaWidth = mContext.getResources().getDimensionPixelSize(R.dimen.sidebar_list_anim_padding); boolean leftMode = (SidebarController.getInstance(mContext).getSidebarMode() == SidebarMode.MODE_LEFT); int width = getWidth() + deltaWidth; int outTo = leftMode ? -width : width; mSwitchContentAnim = new AnimTimeLine(); int time = 300; final List<View> disappearViews = new ArrayList<View>(); disappearViews.addAll(mOngoingList.getViewList()); disappearViews.addAll(mContactList.getViewList()); disappearViews.addAll(mAppList.getViewList()); int subViewCount = disappearViews.size(); if (subViewCount > 0) { AnimTimeLine timeLine = new AnimTimeLine(); Vector3f scaleFrom = new Vector3f(0.2f, 0.2f); Vector3f scaleTo = new Vector3f(1, 1); Vector3f alphaFrom = new Vector3f(0, 0, 0); Vector3f alphaTo = new Vector3f(0, 0, 1); for (int i = 0; i < subViewCount; i++) { View view = disappearViews.get(i); Anim scale = new Anim(view, Anim.SCALE, time, Anim.CUBIC_OUT, scaleFrom, scaleTo); Anim alpha = new Anim(view, Anim.TRANSPARENT, time, Anim.CUBIC_OUT, alphaFrom, alphaTo); timeLine.addAnim(scale); timeLine.addAnim(alpha); } timeLine.setDelay(time / 4); mSwitchContentAnim.addTimeLine(timeLine); } Anim outAnim = new Anim(mScrollViewDragged, Anim.MOVE, time, Anim.CUBIC_OUT, new Vector3f(), new Vector3f(outTo, 0)); mSwitchContentAnim.addAnim(outAnim); mSwitchContentAnim.setAnimListener(new AnimListener() { @Override public void onStart() { mScrollViewNormal.setVisibility(VISIBLE); } @Override public void onComplete(int type) { if (mSwitchContentAnim != null) { int count = disappearViews.size(); for (int i = 0; i < count; i++) { View view = disappearViews.get(i); view.setAlpha(1); view.setScaleX(1); view.setScaleY(1); } mOngoingListFake.onDragEnd(); mContactListFake.onDragEnd(); mShareList.onDragEnd(); mScrollViewNormal.setVisibility(VISIBLE); mScrollViewDragged.setTranslationX(0); mScrollViewDragged.setVisibility(GONE); mScrollViewDragged.scrollTo(0, 0); mSwitchContentAnim = null; } } }); mSwitchContentAnim.start(); } @Override public boolean dispatchDragEvent(DragEvent event) { int action = event.getAction(); switch (action) { case DragEvent.ACTION_DRAG_STARTED: FloatText.getInstance(mContext).start(); onDragStart(event); return super.dispatchDragEvent(event); case DragEvent.ACTION_DRAG_ENDED: FloatText.getInstance(mContext).end(); boolean ret = super.dispatchDragEvent(event); onDragEnd(event); return ret; } return super.dispatchDragEvent(event); } private void updateUIBySidebarMode() { if (SidebarController.getInstance(mContext).getSidebarMode() == SidebarMode.MODE_LEFT) { //mExit.setBackgroundResource(R.drawable.exit_icon_left); mExit.setImageResource(R.drawable.exit_icon_left); mExitAndAdd.setBackgroundResource(R.drawable.exitandadd_bg_left); mLeftShadow.setVisibility(View.VISIBLE); mRightShadow.setVisibility(View.GONE); } else { //mExit.setBackgroundResource(R.drawable.exit_icon_right); mExit.setImageResource(R.drawable.exit_icon_right); mExitAndAdd.setBackgroundResource(R.drawable.exitandadd_bg_right); mLeftShadow.setVisibility(View.GONE); mRightShadow.setVisibility(View.VISIBLE); } } public void onSidebarModeChanged(){ updateUIBySidebarMode(); mResolveAdapter.notifyDataSetChanged(); } private AdapterView.OnItemClickListener mAppItemOnClickListener = new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { Object obj = adapterView.getAdapter().getItem(position); if (obj != null && obj instanceof AppItem) { AppItem ai = (AppItem) obj; Utils.dismissAllDialog(mContext); ai.openUI(mContext); Tracker.onClick(Tracker.EVENT_CLICK_APP, "package", ai.getPackageName()); } else { if (position < mAppList.getHeaderViewsCount()) { //this is divider return; } log.info("launch previous app!"); Utils.dismissAllDialog(mContext); Utils.launchPreviousApp(mContext); Tracker.onClick(Tracker.EVENT_CLICK_CHANGE); } } }; private AdapterView.OnItemClickListener mContactItemOnClickListener = new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { if (view == null || view.getTag() == null) { return; } Object obj = adapterView.getAdapter().getItem(position); if (obj != null && obj instanceof ContactItem) { ContactItem ci = (ContactItem) obj; Utils.dismissAllDialog(mContext); ci.openUI(mContext); } } }; public void dragObjectMove(MotionEvent event, long eventTime) { if (mScrollViewNormal.getVisibility() == View.VISIBLE) { mScrollViewNormal.scrollByMotionEvent(event); } else { mScrollViewDragged.scrollByMotionEvent(event); } mDraggedListView.dragObjectMove((int)(event.getRawX()), (int)(event.getRawY())); } private void restoreListItemView(SidebarListView listView) { if (listView != null) { try { int count = listView.getCount(); if (count == 0) { return; } for (int i = 0; i < count; i++) { View view = listView.getChildAt(i); if (view == null) { continue; } view.setScaleX(1); view.setScaleY(1); } } catch (Exception e) { e.printStackTrace(); } } } public void restoreView() { restoreListItemView(mContactList); restoreListItemView(mAppList); } public void setEnabled(boolean enabled) { super.setEnabled(enabled); if (enabled) { mDimView.resume().start(); } else { mDimView.dim().start(); } } public void reportToTracker() { int countWechat = 0; int countDingDing = 0; int countMms = 0; int countEmail = 0; for (ContactItem item : ContactManager.getInstance(mContext).getContactList()) { if (item instanceof WechatContact) { countWechat++; } else if (item instanceof DingDingContact) { countDingDing++; } else if (item instanceof MmsContact) { countMms++; } else if (item instanceof MailContact) { countEmail++; } } int appNum = 0; if (mAppAdapter != null) { appNum = mAppAdapter.getCount(); } int shareNum = 0; if (mResolveAdapter != null) { shareNum = mResolveAdapter.getCount(); } Tracker.reportStatus(Tracker.STATUS_APPNAME, "wechat_contacts", countWechat + "", "dingding_contacts", countDingDing + "", "message_contacts", countMms + "", "email_contacts", countEmail + "", "app_num", appNum + "", "share_num", shareNum + ""); } }