/** * 文 件 名: MT_VibrationController.java * 描 述: * 版 权: Copyright (c)20010-2011 motone All Rights Reserved. * 公 司: 摩通科技 * 作 者: 黄悦 * 版 本: 1.0 * 创建时间: 2011-1-22 * * 修改历史: * 时间 作者 版本 描述 * ------------------------------------------------------------------ * 2011-1-22 黄悦 1.0 1.0 Version */ package com.mogoo.launcher2; import com.mogoo.launcher.R; import com.mogoo.launcher2.config.Mogoo_GlobalConfig; import com.mogoo.launcher2.taskManager.ui.Mogoo_TaskWorkspace; import com.mogoo.launcher2.utils.CheckUtils; import com.mogoo.launcher2.utils.Mogoo_BitmapCache; import com.mogoo.launcher2.utils.Mogoo_ComponentBus; import com.mogoo.launcher2.utils.Mogoo_WorkspaceInface; import android.content.Context; import android.os.Handler; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.view.ViewParent; import java.security.acl.Group; public class Mogoo_VibrationController implements Runnable { private static final String TAG = "Mogoo_VibrationController"; //全局抖动标志 public static boolean isVibrate; //抖动启动完成标示 public static boolean setVibrateFinish = false; public static boolean isLoading = false; //抖动参与组件 private int[] resIds; //图片缓存 private Mogoo_BitmapCache bitmapCache; private Context context; private Handler handler = new Handler(); //开启抖动线程 // private Runnable startVibrateRunable = new Runnable() { public void startVibrateRunable() { Mogoo_ComponentBus bus = Mogoo_ComponentBus.getInstance(); if(bus.getActivityComp(R.id.titleEdit, context) != null){ bus.getActivityComp(R.id.titleEdit, context).setVisibility(View.VISIBLE); bus.getActivityComp(R.id.title, context).setVisibility(View.GONE); } new Thread(Mogoo_VibrationController.this).start(); // handler.removeCallbacks(startVibrateRunable); setVibrateFinish = true; } // }; public Mogoo_VibrationController(Mogoo_BitmapCache cache, int[] resIds) { bitmapCache = cache; this.resIds = resIds; // MT_GlobalConfig.getVibrationViewID() } public void setResIds(int[] resIds){ this.resIds = resIds; } /** * * 启动图标抖动 * @ author: 黄悦 *@param cache */ public void startVibrate(Context context){ if(isVibrate){ return; } bitmapCache.recycleAllByType(Mogoo_BitmapCache.RECYCLE_COMPONENT_NAME_VIBRATION); this.context = context; isVibrate = true; isLoading = true; oprateVibrationFlag(true); startVibrateRunable(); if(context instanceof Launcher){ ((Launcher)context).unLockClick(); } // handler.post(startVibrateRunable); } /** * * 停止图标抖动 * @ author: 黄悦 */ public void stopVibrate() { // add by 袁业奔 2011-9-14 Workspace workspace = (Workspace)Mogoo_ComponentBus.getInstance().getActivityComp(R.id.workspace, context); if(workspace!=null){ workspace.refreshWorkspace(); CheckUtils.reCheck(workspace.getContext()); } // end handler.post(new Runnable() { public void run() { if(!isVibrate){ return; } isVibrate = false; Mogoo_ComponentBus bus = Mogoo_ComponentBus.getInstance(); if(bus.getActivityComp(R.id.titleEdit, context) != null){ bus.getActivityComp(R.id.titleEdit, context).setVisibility(View.GONE); bus.getActivityComp(R.id.title, context).setVisibility(View.VISIBLE); } setVibrateFinish = false; oprateVibrationFlag(false); context = null; System.gc(); } }); } /** * 抖动激发 * @ author: 黄悦 */ public void run() { while(true){ Mogoo_ComponentBus bus = Mogoo_ComponentBus.getInstance(); View view = null; Workspace worksapce = null; for(int resId : resIds) { view = bus.getActivityComp(resId, context); if(view == null || view.getVisibility() != View.VISIBLE) { continue; } if (view instanceof Workspace) { worksapce = (Workspace) view; int index = worksapce.getCurrentScreen(); int count = worksapce.getChildCount(); int searchScreen = Mogoo_GlobalConfig.getSearchScreen(); activeIconVibrate(worksapce.getChildAt(index)); if(index + 1 < count && index + 1 != searchScreen){ activeIconVibrate(worksapce.getChildAt(index + 1)); } if(index - 1 != searchScreen && index - 1 >= 0){ activeIconVibrate(worksapce.getChildAt(index - 1)); } } else { activeIconVibrate(view); } } worksapce = null; bus = null; try { Thread.sleep(90); } catch (InterruptedException e) { Log.e("Mogoo_VibrationController", "", e); } if(!isVibrate){ break; } } } /* * 操作抖动标志入口 */ private void oprateVibrationFlag(final boolean start) { Mogoo_ComponentBus bus = Mogoo_ComponentBus.getInstance(); ViewGroup viewGroup = null; Mogoo_WorkspaceInface wsTemp = null; for(int resId : resIds) { viewGroup = (ViewGroup) bus.getActivityComp(resId, context) ; if(viewGroup == null){ continue; } if(!(bus.getActivityComp(resId, context) instanceof ViewGroup)){ return; } if(viewGroup instanceof Mogoo_WorkspaceInface && start){ wsTemp = (Mogoo_WorkspaceInface)viewGroup; excuteWorkspaceFlag(wsTemp); final Mogoo_WorkspaceInface ws = wsTemp; new Thread(){ public void run() { excuteWorkspaceOtherFlag(ws); }; }.start(); }else{ oprateVibrationFlag(viewGroup, start); } } bus = null; viewGroup = null; wsTemp = null; } private boolean isWorkSpaceType(ViewGroup vg){ return vg instanceof Workspace || vg instanceof Mogoo_TaskWorkspace; } private void excuteWorkspaceFlag(Mogoo_WorkspaceInface ws){ if(ws == null){ return; } oprateVibrationFlag(((ViewGroup)ws).getChildAt(ws.getCurrentScreen()), true); isLoading = false; } public void excuteWorkspaceOtherFlag(Mogoo_WorkspaceInface ws) { if (ws == null) { return; } ViewGroup vg = (ViewGroup) ws; int screenIndex = ws.getCurrentScreen(); for (int i = 0; i < vg.getChildCount(); i++) { if (i == screenIndex || i == (screenIndex + 1) || i == (screenIndex - 1)) { oprateVibrationFlag(vg.getChildAt(i), true); } else { oprateVibrationFlag(vg.getChildAt(i), false); } } } /* * 操作抖动标志 */ private void oprateVibrationFlag(View view, boolean start){ if(!(view instanceof ViewGroup)){ return; } ViewGroup viewGroup = (ViewGroup) view; View v = null; int size = viewGroup.getChildCount(); ShortcutInfo info = null; for(int i = 0; i < size; i++){ v = viewGroup.getChildAt(i); if(v instanceof ViewGroup){ oprateVibrationFlag(v, start); } else if(v instanceof Mogoo_BubbleTextView) { if(start) { if(v.getVisibility() != View.VISIBLE){ if(Mogoo_GlobalConfig.LOG_DEBUG){ Log.d(TAG, "Drag View start vibrate"); } final View temp = v; handler.post(new Runnable() { public void run() { ((Mogoo_BubbleTextView)temp).startVibrate(bitmapCache, 0); } }); } else { ((Mogoo_BubbleTextView)v).startVibrate(bitmapCache, i % 4); } } else { ((Mogoo_BubbleTextView)v).stopVibrate(); info = (ShortcutInfo) ((Mogoo_BubbleTextView)v).getTag(); bitmapCache.recycle(info.intent.getComponent(), Mogoo_BitmapCache.RECYCLE_COMPONENT_NAME_VIBRATION); } } else { return; } } info = null; v = null; } /* * 图标刷新 */ private void activeIconVibrate(View view) { if(view instanceof ViewGroup) { ViewGroup viewGroup = (ViewGroup) view; int size = viewGroup.getChildCount(); View child = null; for(int i = 0; i < size; i++) { child = viewGroup.getChildAt(i); if(child instanceof Mogoo_BubbleTextView && child != null && ((Mogoo_BubbleTextView)child).isVibration() && child.getVisibility() == View.VISIBLE){ child.postInvalidate(); }else if(view instanceof ViewGroup){ activeIconVibrate(child); } } viewGroup = null; child = null; } } }