package com.fruit.launcher; import com.fruit.launcher.LauncherSettings.Applications; import com.fruit.launcher.LauncherSettings.BaseLauncherColumns; import com.fruit.launcher.LauncherSettings.Favorites; import com.fruit.launcher.setting.SettingUtils; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.graphics.Typeface; import android.graphics.drawable.BitmapDrawable; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import java.net.URISyntaxException; public class DockButton extends ImageView implements DropTarget, DragSource, LauncherMonitor.InfoCallback { private static final String TAG = "DockButton"; public boolean mIsEmpty; public boolean mIsHold; public boolean mIsHome; private Launcher mLauncher; private ShortcutInfo mBackupDockButtonInfo; private Paint mTrashPaint; private Paint mPaint; private Bitmap mCueBitmap; private CueNumber mCueNumber; public DockButton(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub mIsEmpty = true; mIsHold = false; mIsHome = false; mLauncher = null; mPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG); mPaint.setColor(Color.WHITE); mPaint.setTextSize(18); mPaint.setTypeface(Typeface.SANS_SERIF); mCueNumber = new CueNumber(); mCueNumber.mbNumber = false; mCueNumber.mMonitorType = LauncherMonitor.MONITOR_NONE; } @Override public void draw(Canvas canvas) { super.draw(canvas); if (mCueNumber.mbNumber) { mCueNumber.drawCueNumber(canvas, mPaint, this.getWidth(), this.getHeight(), mCueBitmap); } } public void setDrawCueNumberState(boolean draw, int type) { if (draw) { if (mCueBitmap == null) { BitmapDrawable drawable = (BitmapDrawable) getResources() .getDrawable(R.drawable.ic_cue_bg); mCueBitmap = drawable.getBitmap(); } if (mLauncher != null) { mLauncher.registerMonitor(type, this); } } else { if (mLauncher != null) { mLauncher.unregisterMonitor(type, this); } } mCueNumber.mMonitorType = type; mCueNumber.mbNumber = draw; } @Override public boolean acceptDrop(DragSource source, int x, int y, int xOffset, int yOffset, DragView dragView, Object dragInfo) { // TODO Auto-generated method stub final int itemType = ((ItemInfo) dragInfo).itemType; // Only support ITEM_TYPE_APPLICATION and ITEM_TYPE_SHORTCUT return (itemType == BaseLauncherColumns.ITEM_TYPE_APPLICATION || itemType == BaseLauncherColumns.ITEM_TYPE_SHORTCUT || itemType == Applications.APPS_TYPE_APP || itemType == Applications.APPS_TYPE_FOLDERAPP); } @Override public void onDrop(DragSource source, int x, int y, int xOffset, int yOffset, DragView dragView, Object dragInfo) { Log.d(TAG, "drag sequence,dockbutton onDrop"); // TODO Auto-generated method stub final ItemInfo info = (ItemInfo) dragInfo; final int itemType = info.itemType; final int index = ((DockBar.LayoutParams) getLayoutParams()).index; final Workspace workspace = mLauncher.getWorkspace(); CellLayout current = (CellLayout) workspace.getChildAt(workspace .getCurrentScreen()); if(workspace.getOriLayout()==null){ workspace.setOriLayout((CellLayout)workspace.getChildAt(workspace.getChildIndexByPageIndex(((ItemInfo) dragInfo).screen))); } if (itemType == Applications.APPS_TYPE_APP || itemType == Applications.APPS_TYPE_FOLDERAPP) { ApplicationInfoEx appInfo = (ApplicationInfoEx) dragInfo; ShortcutInfo dockItemInfo = mLauncher.getLauncherModel() .getShortcutInfo(mLauncher.getPackageManager(), appInfo.intent, getContext()); dockItemInfo.setActivity(appInfo.intent.getComponent(), Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); setImageBitmap(Utilities.createCompoundBitmapEx( dockItemInfo.title.toString(), dockItemInfo.getIcon(mLauncher.getIconCache()))); dockItemInfo.container = Favorites.CONTAINER_DOCKBAR; dockItemInfo.screen = -1; dockItemInfo.cellX = index; dockItemInfo.cellY = -1; if (mIsEmpty) { // Insert a new record to db, and got a new item id LauncherModel.addItemToDatabase(mLauncher, dockItemInfo, Favorites.CONTAINER_DOCKBAR, dockItemInfo.screen, dockItemInfo.cellX, dockItemInfo.cellY, false); mIsEmpty = false; } else { // Use old dock item's id dockItemInfo.id = ((ShortcutInfo) getTag()).id; LauncherModel.updateItemInDatabase(mLauncher, dockItemInfo); } setTag(dockItemInfo); return; } if (mIsEmpty) { ShortcutInfo appInfo = (ShortcutInfo) dragInfo; if (appInfo.container >= 0) { if (source instanceof UserFolder && ((UserFolder) source).mInfo.id == appInfo.container) { // Drag from user folder mLauncher.removeItemFromFolder(appInfo); } } setImageBitmap(Utilities.createCompoundBitmapEx( appInfo.title.toString(), appInfo.getIcon(mLauncher.getIconCache()))); mIsEmpty = false; appInfo.cellX = index; appInfo.cellY = -1; appInfo.container = Favorites.CONTAINER_DOCKBAR; appInfo.screen = -1; setTag(appInfo); LauncherModel.updateItemInDatabase(mLauncher, appInfo); Log.d(TAG, "dockbar, mIsEmpty,current has " + current.getChildCount() + " children"); } else { ShortcutInfo deskItemInfo = (ShortcutInfo) dragInfo; ShortcutInfo dockIteminfo = (ShortcutInfo) getTag(); if (source instanceof Workspace) { deskItemInfo.cellX = workspace.getmDragInfo().cellX; deskItemInfo.cellY = workspace.getmDragInfo().cellY; } if (deskItemInfo.container >= 0) { if (source instanceof UserFolder && ((UserFolder) source).mInfo.id == deskItemInfo.container) { // Drag from user folder // Remove this code block to add userfolder icon can // exchange with dockbar // mLauncher.removeItemFromFolder(deskItemInfo); // LauncherModel.deleteItemFromDatabase(mContext, dockIteminfo); // // deskItemInfo.cellX = index; deskItemInfo.cellY = -1; // deskItemInfo.container = Favorites.CONTAINER_DOCKBAR; // deskItemInfo.screen = -1; // LauncherModel.updateItemInDatabase(mLauncher, deskItemInfo); // setImageBitmap(Utilities.createCompoundBitmapEx(deskItemInfo.title.toString(), // deskItemInfo.getIcon(mLauncher.getIconCache()))); // setTag(deskItemInfo); // return; } } // Switch position of two items /* * if ((source instanceof Workspace) && current.isFull()) { int * newCell[] = new int[2]; int scrn = workspace.getCurrentScreen(); * int number = current.findLastVacantCell(); if (number < 0) { scrn * = deskItemInfo.screen; CellLayout temp = (CellLayout) * workspace.getChildAt(scrn); number = temp.findLastVacantCell(); } * * current.numberToCell(number, newCell); * * dockIteminfo.cellX = newCell[0];//deskItemInfo.cellX; * dockIteminfo.cellY = newCell[1];//deskItemInfo.cellY; * dockIteminfo.screen = scrn;//deskItemInfo.screen; } else */ Log.d(TAG,"onDrop::source instanceof "+source.toString()); if(source instanceof DockButton){ dockIteminfo.cellX = deskItemInfo.cellX; dockIteminfo.cellY = -1; dockIteminfo.screen = -1; dockIteminfo.container = Favorites.CONTAINER_DOCKBAR; }else if (source instanceof UserFolder){ dockIteminfo.cellX = deskItemInfo.cellX; dockIteminfo.cellY = deskItemInfo.cellY; FolderInfo folderInfo = ((Folder) source).mInfo; dockIteminfo.screen = folderInfo.screen; dockIteminfo.container = deskItemInfo.container; } else{ dockIteminfo.cellX = deskItemInfo.cellX; dockIteminfo.cellY = deskItemInfo.cellY; if(current.isFull()){ if (workspace.getOriLayout()!=null){ dockIteminfo.screen = workspace.getOriLayout().getPageIndex();// deskItemInfo.screen; }else { dockIteminfo.screen = -1;//current.getPageIndex(); } } else { dockIteminfo.screen = current.getPageIndex(); } dockIteminfo.container = Favorites.CONTAINER_DESKTOP; } dockIteminfo.orderId = deskItemInfo.orderId; LauncherModel.updateItemInDatabase(mLauncher, dockIteminfo); //deskItem deskItemInfo.cellX = index; deskItemInfo.cellY = -1; deskItemInfo.container = Favorites.CONTAINER_DOCKBAR; deskItemInfo.screen = -1; LauncherModel.updateItemInDatabase(mLauncher, deskItemInfo); setImageBitmap(Utilities.createCompoundBitmapEx( deskItemInfo.title.toString(), deskItemInfo.getIcon(mLauncher.getIconCache()))); setTag(deskItemInfo); if (dockIteminfo.screen == -1 || dockIteminfo.container == Favorites.CONTAINER_DOCKBAR) { // Switch dock button final DockBar dockBar = (DockBar) getParent(); DockButton view = (DockButton) dockBar .getChildAt(dockIteminfo.cellX); // view.setImageBitmap(dockIteminfo.getIcon(mLauncher.getIconCache())); view.setImageBitmap(Utilities.createCompoundBitmapEx( dockIteminfo.title.toString(), dockIteminfo.getIcon(mLauncher.getIconCache()))); view.setTag(dockIteminfo); view.mIsEmpty = false; } else if (dockIteminfo.container != Favorites.CONTAINER_DESKTOP) { // Drag from Folder to Dock bar FolderInfo folderInfo = ((Folder) source).mInfo; CellLayout cellLayout = (CellLayout) workspace .getChildAt(workspace.getChildIndexByPageIndex(folderInfo.screen)); for (int i = 0; i < cellLayout.getChildCount(); i++) { ItemInfo itemInfo = (ItemInfo) cellLayout.getChildAt(i) .getTag(); if (itemInfo != null && folderInfo.id == itemInfo.id) { ((FolderIcon) cellLayout.getChildAt(i)) .addItemInfo(dockIteminfo); // ((FolderIcon) // cellLayout.getChildAt(i)).refreshFolderIcon(); } } // if (source instanceof UserFolder) { // UserFolder uf = (UserFolder)source; // uf. // } } else { // Drag from workspace to Dock bar final View shortcut = mLauncher.createShortcut(R.layout.application, (ViewGroup) workspace.getChildAt(workspace.getChildIndexByPageIndex(dockIteminfo.screen)), dockIteminfo); // Log.d(TAG,"dockbar, before addInScreen,current has "+ // ((CellLayout)workspace.getChildAt(dockIteminfo.screen)).getChildCount()+" children"); workspace.addInScreen(shortcut, workspace.getChildIndexByPageIndex(dockIteminfo.screen), dockIteminfo.cellX, dockIteminfo.cellY, 1, 1, false); // Log.d(TAG,"dockbar, after addInScreen,current has "+ // ((CellLayout)workspace.getChildAt(dockIteminfo.screen)).getChildCount()+" children"); } } } @Override public void onDropCompleted(View target, boolean success) { Log.d(TAG, "drag sequence,dockbutton onDropCompleted"); // TODO Auto-generated method stub if (!success) { // if (target instanceof FolderIcon){ // FolderIcon fi = (FolderIcon) target; // UserFolderInfo info = (UserFolderInfo) (fi.getTag()); // if (info.getSize()>=SettingUtils.MAX_FOLDER_CHILD_COUNT){ // onDropCompletedInternal(); // } else { // onDropCompletedInternal(); // } // } else { onDropCompletedInternal(); // } } mBackupDockButtonInfo = null; mLauncher.getWorkspace().finishDropCompleted(); } /** * */ private void onDropCompletedInternal() { mBackupDockButtonInfo.cellY = -1; mBackupDockButtonInfo.screen = -1; setImageBitmap(((ShortcutInfo) mBackupDockButtonInfo).getIcon(mLauncher.getIconCache())); mIsEmpty = false; setTag(mBackupDockButtonInfo); LauncherModel .updateItemInDatabase(mLauncher, mBackupDockButtonInfo); } @Override public void onDragEnter(DragSource source, int x, int y, int xOffset, int yOffset, DragView dragView, Object dragInfo) { Log.d(TAG, "drag sequence,dockbutton onDragEnter"); // TODO Auto-generated method stub if (!acceptDrop(source, x, y, xOffset, yOffset, dragView, dragInfo)) { return; } if (mIsHold && mLauncher != null && !mLauncher.isAllAppsVisible()) { return; } dragView.setPaint(mTrashPaint); } @Override public void onDragOver(DragSource source, int x, int y, int xOffset, int yOffset, DragView dragView, Object dragInfo) { Log.d(TAG, "drag sequence,dockbutton onDragOver"); // TODO Auto-generated method stub } @Override public void onDragExit(DragSource source, int x, int y, int xOffset, int yOffset, DragView dragView, Object dragInfo) { Log.d(TAG, "drag sequence,dockbutton onDragExit"); // TODO Auto-generated method stub Log.d(TAG, "dragview exit,width=" + dragView.getWidth() + ",height=" + dragView.getHeight()); dragView.setPaint(null); } @Override public Rect estimateDropLocation(DragSource source, int x, int y, int xOffset, int yOffset, DragView dragView, Object dragInfo, Rect recycle) { // TODO Auto-generated method stub return null; } public void setLauncher(Launcher launcher) { mLauncher = launcher; } @Override public void setDragController(DragController dragger) { } public void setPaint(Paint paint) { mTrashPaint = paint; } public void setDockButtonInfo(ShortcutInfo info) { try { mBackupDockButtonInfo = (ShortcutInfo) info.clone(); } catch (CloneNotSupportedException e) { // TODO Auto-generated catch block mBackupDockButtonInfo=info; e.printStackTrace(); } } public ShortcutInfo getDockButtonInfo(){ return mBackupDockButtonInfo; } public void setTag(ShortcutInfo info) { // cancel previous state; if (mTag != null && mTag instanceof ShortcutInfo) { ShortcutInfo preInfo = (ShortcutInfo) mTag; if (preInfo.intent != null && mCueNumber.getMonitorType(preInfo.intent) != LauncherMonitor.MONITOR_NONE) { setDrawCueNumberState(false, mCueNumber.mMonitorType); } } super.setTag(info); // set new state if (info != null && info.intent != null) { int type = mCueNumber.getMonitorType(info.intent); if (type != LauncherMonitor.MONITOR_NONE) { setDrawCueNumberState(true, type); } } } @Override public void onInfoCountChanged(int number) { // TODO Auto-generated method stub if (number <= 0) { mCueNumber.mCueNum = null; return; } else if (number >= 100) { mCueNumber.mCueNum = new String(CueNumber.CUE_MAX); } else { mCueNumber.mCueNum = String.valueOf(number); } invalidate(); } // /* (non-Javadoc) // * @see android.widget.ImageView#setImageBitmap(android.graphics.Bitmap) // */ // @Override // public void setImageBitmap(Bitmap bm) { // // TODO Auto-generated method stub // //Bitmap icon = Utilities.changeBitmap4Launcher(bm); // super.setImageBitmap(bm); // } }