package com.tv.ui.metro.menu; import android.animation.AnimatorSet; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Paint; import android.graphics.Point; import android.graphics.PorterDuff; import android.graphics.PorterDuffXfermode; import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.animation.Animation; import android.view.animation.Animation.AnimationListener; import android.view.animation.AnimationUtils; import android.view.animation.LayoutAnimationController; import android.view.animation.TranslateAnimation; import android.widget.*; import android.widget.FrameLayout.LayoutParams; import android.widget.ViewSwitcher.ViewFactory; import com.tv.ui.metro.*; public class MainMenuMgr implements MenuListListener, ViewFactory { private final static String TAG = MainMenuMgr.class.getName(); private final static float LayoutAnimDelay = 0.5f; public static final Point WinSize = new Point(1920, 1080); public static final int KAnimTimeShort = 180; private final static long AnimationBlockTimer = KAnimTimeShort * 4; private FrameLayout mainMenu; private ListView mainMenuItems; private LayoutAnimationController mAnimIn; private LayoutAnimationController mAnimOut; private HideShowListener mHideShowListener; // focus anim bgn private FocusListener menuFocusListener; /*private*/ Animation[] mFocusAnims = new Animation[2]; // focus anim end // confirm anim bgn /*private*/ Animation[] mConfirmAnims = new Animation[4]; // confirm anim bgn /*private*/ ImageSwitcher mCursor; private TransientBoolean mReady; ValueAnimator [] mCursorMov = new ValueAnimator[2]; ValueAnimator [] mArrowMov = new ValueAnimator[2]; AnimatorSet mCursorConfirm; AnimatorSet mArrowConfirm; MainMenuController mainMenuController; MainMenuOptions mOptions; OnMenuCancelListener mMenuCancelListener; public interface OnMenuCancelListener { public void onMenuCancel(); } public MainMenuMgr(Context context, FrameLayout aMenuParent, OnMenuCancelListener menuCancelListener) { mMenuCancelListener = menuCancelListener; TxtViewFactoryMaker.getInstance().init(context);; mainMenuController = new MainMenuController(context); mainMenu = (FrameLayout) View.inflate(context, R.layout.main_menu, aMenuParent); ViewGroup.LayoutParams lpMenu = new LayoutParams(WinSize.x/2, WinSize.y, Gravity.LEFT); if( aMenuParent.getParent() instanceof RelativeLayout) { RelativeLayout.LayoutParams rlpMenu = new RelativeLayout.LayoutParams(WinSize.x/2, WinSize.y); rlpMenu.addRule(RelativeLayout.ALIGN_LEFT); rlpMenu.addRule(RelativeLayout.CENTER_VERTICAL); lpMenu = rlpMenu; } mainMenu.setLayoutParams(lpMenu); mCursor = (ImageSwitcher)mainMenu.findViewById(R.id.cursor); mCursor.setFactory(this); mCursor.setInAnimation(AnimationUtils.loadAnimation(context, android.R.anim.fade_in)); mCursor.setOutAnimation(AnimationUtils.loadAnimation(context, android.R.anim.fade_out)); mCursor.setImageResource(R.drawable.menu_highlight); mReady = new TransientBoolean(true); mainMenuItems = (ListView)mainMenu.findViewById(R.id.main_menu_items); Space header = new Space(mainMenuItems.getContext()); header.setMinimumHeight(WinSize.y); mainMenuItems.addHeaderView(header, null, false); Space footer = new Space(mainMenuItems.getContext()); footer.setMinimumHeight(WinSize.y); mainMenuItems.addFooterView(footer, null, false); mainMenuItems.setAdapter(mainMenuController.getMenuAdapter()); mOptions = mainMenuController.getMenuOptions(); mainMenuItems.setChoiceMode(ListView.CHOICE_MODE_SINGLE); mainMenuItems.setItemChecked(0 + mainMenuItems.getHeaderViewsCount(), true); int menuToSpace = context.getResources().getDimensionPixelSize(R.dimen.menu_top_space); mainMenuItems.setSelectionFromTop(0 + mainMenuItems.getHeaderViewsCount(), menuToSpace); mainMenuItems.setOnKeyListener(new MenuListController(mainMenuItems, this, menuToSpace)); mainMenuItems.setFocusable(true); mainMenuItems.setFocusableInTouchMode(true); View menuPanel = mainMenu.findViewById(R.id.main_menu_panel); Paint paint = new Paint(); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP)); menuPanel.setLayerType(View.LAYER_TYPE_HARDWARE, paint); View maskTop = mainMenu.findViewById(R.id.mask_top); paint = new Paint(); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); maskTop.setLayerType(View.LAYER_TYPE_HARDWARE, paint); View maskBottom = mainMenu.findViewById(R.id.mask_bottom); paint = new Paint(); paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT)); maskBottom.setLayerType(View.LAYER_TYPE_HARDWARE, paint); intLayoutAnim(); buildFocusAnimations(); } private void updatePreFocusView(ViewGroup aParent) { View focused = null; View cursor = aParent.getFocusedChild(); while(cursor != null && cursor instanceof ViewGroup) { focused = cursor; cursor = ((ViewGroup)cursor).getFocusedChild(); } // UIConfig.DesktopState.setLastFocus(focused); } private void buildFocusAnimations() { menuFocusListener = new FocusListener(); mFocusAnims[0] = AnimationUtils.loadAnimation(mainMenu.getContext(), android.R.anim.fade_out); mFocusAnims[1] = AnimationUtils.loadAnimation(mainMenu.getContext(), android.R.anim.fade_in); mFocusAnims[0].setDuration(KAnimTimeShort / 2); mFocusAnims[0].setFillAfter(true); mFocusAnims[0].setAnimationListener(menuFocusListener); mFocusAnims[1].setDuration(KAnimTimeShort / 2); } private void intLayoutAnim() { Animation slideIn = new TranslateAnimation(TranslateAnimation.RELATIVE_TO_SELF, -1, TranslateAnimation.ABSOLUTE, 0, TranslateAnimation.ABSOLUTE, 0, TranslateAnimation.ABSOLUTE, 0); slideIn.setDuration(KAnimTimeShort); mAnimIn = new LayoutAnimationController(slideIn, LayoutAnimDelay); Animation slideOut = new TranslateAnimation(TranslateAnimation.ABSOLUTE, 0, TranslateAnimation.RELATIVE_TO_SELF, -1, TranslateAnimation.ABSOLUTE, 0, TranslateAnimation.ABSOLUTE, 0); slideOut.setDuration(KAnimTimeShort); slideOut.setFillAfter(true); mAnimOut = new LayoutAnimationController(slideOut, LayoutAnimDelay); mAnimOut.setOrder(LayoutAnimationController.ORDER_REVERSE); mainMenu.setLayoutAnimation(mAnimIn); mHideShowListener = new HideShowListener(); mainMenu.setLayoutAnimationListener(mHideShowListener); mReady.autoSetVal(true, AnimationBlockTimer); } public void showMenu(FrameLayout aMenuParent) { Log.d(TAG, "isInTouchMode " + mainMenuItems.isInTouchMode()); mainMenuController.getMenuAdapter().notifyDataSetChanged(); mReady.autoSetVal(true, AnimationBlockTimer); mainMenu.setVisibility(View.VISIBLE); mainMenu.setLayoutAnimation(mAnimIn); mainMenu.startLayoutAnimation(); mainMenu.setLayoutAnimationListener(mHideShowListener); mainMenuItems.requestFocus(); } private void hideMenu(boolean aDoAnim, boolean aShowHomeFocus) { mainMenuItems.clearFocus(); if(aDoAnim) { mReady.autoSetVal(true, AnimationBlockTimer); mainMenu.setLayoutAnimation(mAnimOut); mainMenu.startLayoutAnimation(); mainMenu.setLayoutAnimationListener(mHideShowListener); } else { mainMenu.setVisibility(View.GONE); } if(aShowHomeFocus) { // mHomeCursor.setVisibility(View.VISIBLE); } } public void hideMenu() { hideMenu(true, true); } @Override public void onRightPressed() { int idx = mainMenuItems.getCheckedItemPosition() - mainMenuItems.getHeaderViewsCount(); int menuId = MainMenuOptions.MenuItems[idx][3]; onMenuItemSelected(menuId); } @Override public void onMenuItemSelected(int aID) { Log.d(TAG, "onMenuItemSelected " + aID); boolean showHomeCursor = mainMenuController.onMenuSelected(aID); hideMenu(showHomeCursor, showHomeCursor); } @Override public void onMenuPressed() { hideMenu(); } @Override public void onBackPressed() { hideMenu(); if ( mMenuCancelListener != null) { mMenuCancelListener.onMenuCancel(); } } @Override public void onLeftPressed() { onBackPressed(); } class HideShowListener implements AnimationListener { @Override public void onAnimationStart(Animation animation) { Log.d(TAG, "HideShowListener onAnimationStart"); } @Override public void onAnimationEnd(Animation animation) { Log.d(TAG, "HideShowListener onAnimationEnd " + animation); if(mainMenu.getLayoutAnimation() == mAnimOut) { mainMenu.setVisibility(View.GONE); } mReady.setValue(true); } @Override public void onAnimationRepeat(Animation animation) { Log.d(TAG, "HideShowListener onAnimationRepeat"); } } class FoldListener implements AnimationListener { @Override public void onAnimationStart(Animation animation) { Log.d(TAG, "FoldListener onAnimationStart"); } @Override public void onAnimationEnd(Animation animation) { Log.d(TAG, "FoldListener onAnimationEnd " + animation); mReady.setValue(true); } @Override public void onAnimationRepeat(Animation animation) { Log.d(TAG, "FoldListener onAnimationRepeat"); } } @Override public void onMenuMoved(int aTgtPos) { // TODO Auto-generated method stub Log.d(TAG, "onMenuMov"); mCursor.startAnimation(mFocusAnims[0]); } @Override public void onMenuMoving() { // ((ViewGroup)mainMenuItems.getSelectedView()).findViewById(R.id.menu_icon) // .setBackgroundResource(MenuItems[mainMenuItems.getSelectedItemPosition() - mainMenuItems.getHeaderViewsCount()][1]); } @Override public boolean isReady() { return mReady.getValue(); } @Override public View makeView() { ImageView img = new ImageView(mainMenu.getContext()); // img.setBackgroundColor(0xFF000000); img.setScaleType(ImageView.ScaleType.FIT_CENTER); img.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); return img; } class FocusListener implements AnimationListener { @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationRepeat(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { mCursor.startAnimation(mFocusAnims[1]); } } public void hide() { hideMenu(); } }