package com.fruit.launcher; import java.io.IOException; import java.util.ArrayList; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.ActivityInfo; import android.content.pm.PackageManager; import android.content.res.TypedArray; import android.content.res.XmlResourceParser; import android.graphics.Paint; import android.graphics.PorterDuff; import android.graphics.PorterDuffColorFilter; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.Log; import android.util.Xml; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.android.internal.util.XmlUtils; import com.fruit.launcher.LauncherSettings.BaseLauncherColumns; import com.fruit.launcher.LauncherSettings.Favorites; public class DockBar extends ViewGroup { public static final String TAG = "DockBar"; public static final int DEFAULT_CELL_NUM_IDEAL = 4;// yfzhao//5; public static final int DEFAULT_CELL_NUM_ALL_APP = 3; private static final int ORIENTATION_HORIZONTAL = 1; public static final int MAX_CELL_NUM_ALL_APP = 4; private static final String TAG_Favorite_All_Apps = "favorite_allapps"; public int mIdealHomeIndex = -1; // yfzhao public int mAllAppHomeIndex = -1; // yfzhao private float mDensity; private boolean mFirstMeasure; private boolean mPortrait; private int mCellNum; private int mLeftPadding; private int mRightPadding; private int mTopPadding; private int mBottomPadding; private int mWidthGap; private int mHeightGap; private int mCellNumAllApp = 0; private DragController mDragController; private Paint mTrashPaint; private boolean mIsDockItemShow; private DockButton[] mDockButtons; private DockButton[] mAllAppDockButtons; private boolean mInAllAppMode; private View.OnClickListener mDockButtonClickListener; private IconCache mIconCache; private ArrayList<ShortcutInfo> mAllAppHomeBar; public DockBar(Context context, AttributeSet attrs) { this(context, attrs, 0); // TODO Auto-generated constructor stub } public DockBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub mDensity = Utilities.sDensity; mFirstMeasure = true; TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.DockBar, defStyle, 0); int orientation = typedArray.getInt(R.styleable.DockBar_direction, ORIENTATION_HORIZONTAL); if (orientation == ORIENTATION_HORIZONTAL) { mPortrait = true; } else { mPortrait = false; } mCellNum = typedArray.getInt(R.styleable.DockBar_cellNum, DEFAULT_CELL_NUM_IDEAL); mLeftPadding = typedArray.getDimensionPixelOffset( R.styleable.DockBar_leftPadding, 10); mRightPadding = typedArray.getDimensionPixelOffset( R.styleable.DockBar_rightPadding, 10); mTopPadding = typedArray.getDimensionPixelOffset( R.styleable.DockBar_topPadding, 0); mBottomPadding = typedArray.getDimensionPixelOffset( R.styleable.DockBar_bottomPadding, 0); // mIdealHomeIndex = mCellNum / 2; // mAllAppHomeIndex = mCellNumAllApp / 2; mIsDockItemShow = true; mDockButtons = new DockButton[DEFAULT_CELL_NUM_IDEAL]; final int srcColor = context.getResources().getColor( R.color.dock_color_filter); mTrashPaint = new Paint(); mTrashPaint.setColorFilter(new PorterDuffColorFilter(srcColor, PorterDuff.Mode.SRC_ATOP)); LauncherApplication app = (LauncherApplication) context .getApplicationContext(); mIconCache = app.getIconCache(); // loadAllAppHomeBar(getContext()); // mAllAppHomeIndex = getAppHomeBarCount() / 2; // mCellNumAllApp = getAppHomeBarCount() + 1; // mAllAppDockButtons = new DockButton[mCellNumAllApp]; // initAllAppDockButton(); // initIdealDockButton(); // setBackgroundDrawable(null); setBackgroundDrawable(mIconCache.getLocalIcon( R.drawable.dock_background, "dock_background")); } public int getDockCount(){ int count = 0; for (int i=0;i<mDockButtons.length;i++){ if (!mDockButtons[i].mIsEmpty) count++; } return count; } // private void initAllAppDockButton() { // // TODO Auto-generated method stub // LayoutInflater inflater = LayoutInflater.from(mContext); // // mInAllAppMode = false; // mDockButtonClickListener = new View.OnClickListener() { // // @Override // public void onClick(View v) { // // TODO Auto-generated method stub // if (mInAllAppMode && v.getTag() != null) { // ShortcutInfo appInfo = (ShortcutInfo) v.getTag(); // if (appInfo.intent != null) { // mContext.startActivity(appInfo.intent); // } // } // } // }; // // int dockBarCount = mAllAppHomeBar.size() + 1; // // for (int i = 0; i < dockBarCount; i++) { // // DockButton dockButton = (DockButton) // inflater.inflate(R.layout.dock_button, null); // ShortcutInfo info = null; // if(i == mAllAppHomeIndex){ // info = new ShortcutInfo(); // // dockButton.mIsHome = true; // dockButton.setImageDrawable(mIconCache.getLocalIcon(R.drawable.home_button, // "ic_home_button")); // }else{ // int allAppHomeIndex = i > mAllAppHomeIndex ? i-1 : i; // // info = mAllAppHomeBar.get(allAppHomeIndex); // dockButton.mIsHome = false; // dockButton.setImageBitmap(mIconCache.getIcon(info.intent)); // } // // info.cellX = i; // info.cellY = -1; // info.container = Favorites.CONTAINER_DOCKBAR; // info.screen = -1; // // dockButton.mIsHold = true; // dockButton.mIsEmpty = false; // dockButton.setTag(info); // dockButton.setPaint(mTrashPaint); // dockButton.setClickable(true); // dockButton.setOnClickListener(mDockButtonClickListener); // mAllAppDockButtons[i] = dockButton; // } // } // // private void initIdealDockButton(){ // LayoutInflater inflater = LayoutInflater.from(mContext); // // Initialize Home button // ShortcutInfo info = new ShortcutInfo(); // info.container = Favorites.CONTAINER_DOCKBAR; // info.cellX = mIdealHomeIndex; // info.cellY = -1; // info.screen = -1; // info.itemType = BaseLauncherColumns.ITEM_TYPE_APPLICATION; // // try { // DockButton dockButton =(DockButton) // inflater.inflate(R.layout.dock_button, null); // // dockButton.mIsHome = true; // dockButton.mIsHold = true; // dockButton.mIsEmpty = false; // dockButton.setPaint(mTrashPaint); // dockButton.setClickable(true); // dockButton.setTag(info); // dockButton.setImageDrawable(mIconCache.getLocalIcon(R.drawable.all_apps_button, // "ic_all_apps_button")); // // mDockButtons[mIdealHomeIndex] = dockButton; // } catch (Exception e) { // e.printStackTrace(); // } // } /** * Loads the default set of default to packages from an xml file. * * @modify guo * @param context * The context */ // private boolean loadAllAppHomeBar(Context context) { // boolean bRet = false; // // if (mAllAppHomeBar == null) { // mAllAppHomeBar = new ArrayList<ShortcutInfo>(); // } else { // return true; // } // // PackageManager packageManager = mContext.getPackageManager(); // ActivityInfo actInfo; // try { // XmlResourceParser parser = // context.getResources().getXml(R.xml.default_allapp_slider); // AttributeSet attrs = Xml.asAttributeSet(parser); // XmlUtils.beginDocument(parser, TAG_Favorite_All_Apps); // // final int depth = parser.getDepth(); // // int type; // int i = 0; // while (((type = parser.next()) != XmlPullParser.END_TAG || // parser.getDepth() > depth) // && type != XmlPullParser.END_DOCUMENT) { // // if (type != XmlPullParser.START_TAG) { // continue; // } // // TypedArray a = context.obtainStyledAttributes(attrs, // R.styleable.Favorite_Allapp); // String packageName = // a.getString(R.styleable.Favorite_Allapp_AllappPackageName); // String className = // a.getString(R.styleable.Favorite_Allapp_AllappClassName); // try { // ComponentName cn; // try { // cn = new ComponentName(packageName, className); // actInfo = packageManager.getActivityInfo(cn, 0); // } catch (PackageManager.NameNotFoundException nnfe) { // String[] packages = packageManager.currentToCanonicalPackageNames( // new String[] { packageName }); // cn = new ComponentName(packages[0], className); // actInfo = packageManager.getActivityInfo(cn, 0); // } // // ShortcutInfo info = new ShortcutInfo(); // Intent intent = new Intent(); // intent.setAction(Intent.ACTION_MAIN); // intent.setComponent(cn); // intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | // Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED); // info.intent = intent; // mAllAppHomeBar.add(info); // } catch (PackageManager.NameNotFoundException e) { // Log.w(TAG, "Unable to add favorite: " + packageName + "/" + className, // e); // continue; // } // // a.recycle(); // i++; // if(i > MAX_CELL_NUM_ALL_APP){ // break; // } // } // } catch (XmlPullParserException e) { // Log.w(TAG, "Got exception parsing AllAppHomeBar.", e); // } catch (IOException e) { // Log.w(TAG, "Got exception parsing AllAppHomeBar.", e); // } // // return bRet; // } // private int getAppHomeBarCount() { // return mAllAppHomeBar.size(); // } // boolean hasShortcut(Intent data) { // try { // final String className = data.getComponent().getClassName(); // // for (int i = 0; i < getChildCount(); i++){ // final DockButton button = (DockButton) getChildAt(i); // if (!button.mIsEmpty){ // final ShortcutInfo info = (ShortcutInfo) button.getTag(); // final Intent eachIntent = info.intent; // final String eachClassName = eachIntent.getComponent().getClassName(); // if (className.equals(eachClassName)) { // return true; // } // } // } // // } catch (Exception e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // // // return false; // // } // // boolean hasShortcut(String title) { // try { // for (int i = 0; i < getChildCount(); i++){ // final DockButton button = (DockButton) getChildAt(i); // if (!button.mIsEmpty){ // final ShortcutInfo info = (ShortcutInfo) button.getTag(); // if (title.equals(info.title.toString())) { // return true; // } // } // } // } catch (Exception e) { // // TODO Auto-generated catch block // e.printStackTrace(); // } // // return false; // } int getShortcutCount(ShortcutInfo info){ int counter = 0; try { final String title = info.title.toString(); //final String className = info.intent.getComponent().getClassName(); final String pkgName = Launcher.getPackageName(info); final int count = getChildCount(); for (int i = 0; i < count; i++){ final DockButton button = (DockButton) getChildAt(i); if (!button.mIsEmpty){ final ShortcutInfo sInfo = (ShortcutInfo) button.getTag(); if (sInfo.itemType==Favorites.ITEM_TYPE_APPLICATION){ //final String eachClassName = sInfo.intent.getComponent().getClassName(); final String eachPkgName = Launcher.getPackageName(sInfo); if (title.equals(sInfo.title.toString()) && pkgName.equals(eachPkgName)) { counter++; } } } else { final ShortcutInfo sInfo = button.getDockButtonInfo(); if (sInfo != null){ final String eachPkgName = Launcher.getPackageName(sInfo); if (title.equals(sInfo.title.toString()) && pkgName.equals(eachPkgName)) { counter++; } } } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return counter; } boolean hasShortcut(ShortcutInfo info, Intent data){ try { final String title = info.title.toString(); final String className = Launcher.getClassName(info, data); final int count = getChildCount(); for (int i = 0; i < count; i++){ final DockButton button = (DockButton) getChildAt(i); if (!button.mIsEmpty){ final ShortcutInfo sInfo = (ShortcutInfo) button.getTag(); if (sInfo.itemType==Favorites.ITEM_TYPE_APPLICATION){ final String eachClassName = Launcher.getClassName(sInfo); if (title.equals(sInfo.title.toString()) && className.equals(eachClassName)) { return true; } } } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return false; } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { // TODO Auto-generated method stub for (int i = 0; i < getChildCount(); i++) { View view = getChildAt(i); view.clearAnimation(); if (view.getVisibility() != View.GONE) { DockBar.LayoutParams layoutParams = (DockBar.LayoutParams) view .getLayoutParams(); view.layout(layoutParams.left, layoutParams.top, layoutParams.width + layoutParams.left, layoutParams.height + layoutParams.top); } } } public boolean onLongClick(View v) { if (v.isInTouchMode()) { if (v.getTag() != null) { return true; } } return false; } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // TODO Auto-generated method stub int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec); int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec); int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec); int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec); if (widthSpecMode == MeasureSpec.UNSPECIFIED || heightSpecMode == MeasureSpec.UNSPECIFIED) { throw new RuntimeException( "DockBar cannot have UNSPECIFIED dimensions"); } if (mFirstMeasure) { if (mPortrait) { mWidthGap = (widthSpecSize - mLeftPadding - mRightPadding) / mCellNum; mHeightGap = heightSpecSize - (int) (0.0f * mDensity) - mTopPadding - mBottomPadding; } else { mWidthGap = widthSpecSize - (int) (0.0f * mDensity) - mTopPadding - mBottomPadding; mHeightGap = (heightSpecSize - mLeftPadding - mRightPadding) / mCellNum; } mFirstMeasure = false; } for (int i = 0; i < getChildCount(); i++) { View child = getChildAt(i); DockBar.LayoutParams lp = (DockBar.LayoutParams) child .getLayoutParams(); lp.width = mWidthGap - lp.leftMargin - lp.rightMargin; lp.height = mHeightGap - lp.topMargin - lp.bottomMargin; if (mPortrait) { lp.left = mWidthGap * lp.index + lp.leftMargin + mLeftPadding; // if (mDensity == 1.0f) { lp.top = lp.topMargin + (int) (2.0f * mDensity) + mTopPadding; // } else if (mDensity >= 1.5f) { // lp.top = lp.topMargin - (int) (4.0f * mDensity) + // mTopPadding; // } } else { lp.left = lp.leftMargin + (int) (4.0f * mDensity) + mTopPadding; lp.top = mHeightGap * lp.index + lp.topMargin + mLeftPadding; } int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(lp.width, MeasureSpec.EXACTLY); int childheightMeasureSpec = MeasureSpec.makeMeasureSpec(lp.height, MeasureSpec.EXACTLY); child.measure(childWidthMeasureSpec, childheightMeasureSpec); } setMeasuredDimension(widthSpecSize, heightSpecSize); } final static class LayoutParams extends ViewGroup.MarginLayoutParams { public int index; int left; int top; public LayoutParams(int index) { super(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); // TODO Auto-generated constructor stub this.index = index; } public LayoutParams(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } public LayoutParams(ViewGroup.LayoutParams layoutParams) { super(layoutParams); // TODO Auto-generated constructor stub } } public void setItemVisibity(boolean bIsShow) { // TODO Auto-generated method stub if (mIsDockItemShow != bIsShow) { mIsDockItemShow = bIsShow; int visible = bIsShow ? View.VISIBLE : View.GONE; for (int i = 0; i < getChildCount(); i++) { if (i != mIdealHomeIndex) { View child = getChildAt(i); child.setVisibility(visible); } } } } public void setCellInfo(int num) { if (mCellNum != num) { mCellNum = num; invalidate(); } } public void switchDisplay(boolean isAllAppMode) { DockBar.LayoutParams lp = null; if (isAllAppMode) { // Remove all dock buttons removeAllViews(); // Add mAllAppDockButtons to dock bar for (int i = 0; i < mCellNumAllApp; i++) { lp = new DockBar.LayoutParams(i); if (mAllAppDockButtons[i] != null) { addView(mAllAppDockButtons[i], -1, lp); } } mCellNum = mCellNumAllApp; } else { // Remove all dock buttons removeAllViews(); // Add mDockButtons to dock bar for (int i = 0; i < DEFAULT_CELL_NUM_IDEAL; i++) { lp = new DockBar.LayoutParams(i); if (mDockButtons[i] != null) { addView(mDockButtons[i], -1, lp); } } mCellNum = DEFAULT_CELL_NUM_IDEAL; } mInAllAppMode = isAllAppMode; processDragController(!isAllAppMode); // Force to let dock bar re-measure size mFirstMeasure = true; invalidate(); } public Paint getPaint() { return mTrashPaint; } public void setIdealButton(View view, int index) { if (index < 0 || index >= DEFAULT_CELL_NUM_IDEAL && !(view instanceof DockButton)) { return; } if (mDockButtons[index] != null) { DockButton button = mDockButtons[index]; button.setVisibility(View.GONE); mDragController.removeDropTarget(button); button.setTag(null); removeView(button); } mDockButtons[index] = (DockButton) view; } public DockButton getIdealButtons(int index) { if (index < 0 || index >= DEFAULT_CELL_NUM_IDEAL) { return null; } return mDockButtons[index]; } public DockButton getAllAppButtons(int index) { if (index < 0 || index >= mCellNumAllApp) { return null; } return mAllAppDockButtons[index]; } private void processDragController(boolean isAdd) { // TODO Auto-generated method stub if (mDragController == null) { return; } for (int i = 0; i < DEFAULT_CELL_NUM_IDEAL; i++) { DockButton dockButton = mDockButtons[i]; if (dockButton != null && !dockButton.mIsHome) { if (isAdd) { mDragController.removeDropTarget(dockButton); mDragController.addDropTarget(dockButton); } else { mDragController.removeDropTarget(dockButton); } } } } public void setDragController(DragController dragController) { // TODO Auto-generated method stub mDragController = dragController; } public void applyTheme() { DockButton button = null; ShortcutInfo info = null; for (int i = 0; i < DockBar.DEFAULT_CELL_NUM_IDEAL; i++) { if (i != mIdealHomeIndex) { button = getIdealButtons(i); info = (ShortcutInfo) button.getTag(); if (info != null && !button.mIsEmpty) { info.setIcon(null); button.setImageBitmap(info.getIcon(mIconCache)); } } } // jinzhimin add for apply theme in all app 2010-06-15 for (int i = 0; i < DockBar.DEFAULT_CELL_NUM_ALL_APP; i++) { if (i != mAllAppHomeIndex) { button = getIdealButtons(i); info = (ShortcutInfo) button.getTag(); if (info != null && !button.mIsEmpty) { info.setIcon(null); button.setImageBitmap(info.getIcon(mIconCache)); } } } applyThemeOnHolderBar(); } public void applyThemeOnHolderBar() { // TODO Auto-generated method stub final IconCache iconCache = mIconCache; // DockButton allAppLeftButton = getAllAppButtons(0); // DockButton allAppRightButton = getAllAppButtons(2); // DockButton allAppButton = getAllAppButtons(mAllAppHomeIndex); // DockButton homeButton = getIdealButtons(mIdealHomeIndex); // Drawable allAppIcon = // iconCache.getLocalIcon(R.drawable.all_apps_button, // "ic_all_apps_button"); // Drawable homeIcon = iconCache.getLocalIcon(R.drawable.home_button, // "ic_home_button"); // allAppButton.setImageDrawable(homeIcon); // homeButton.setImageDrawable(allAppIcon); // Drawable leftIcon = // iconCache.getLocalIcon(R.drawable.ic_launcher_market_normal, // "ic_market_button"); // allAppLeftButton.setImageDrawable(leftIcon); // // Drawable rightIcon = // iconCache.getLocalIcon(R.drawable.ic_launcher_search_normal, // "ic_search_button"); // allAppRightButton.setImageDrawable(rightIcon); Drawable dockBg = iconCache.getLocalIcon(R.drawable.dock_background, "dock_background"); setBackgroundDrawable(dockBg); } /** * @return the mCellNum */ public int getmCellNum() { return mCellNum; } /** * @param mCellNum the mCellNum to set */ public void setmCellNum(int mCellNum) { this.mCellNum = mCellNum; } }