package com.tencent.tws.pluginhost.ui.view; import java.util.ArrayList; import java.util.Iterator; import java.util.Locale; import tws.component.log.TwsLog; import android.content.Context; import android.graphics.drawable.Drawable; import android.text.TextUtils; import android.util.AttributeSet; import android.view.View; import android.view.View.OnClickListener; import android.widget.LinearLayout; import com.tencent.tws.pluginhost.ui.HostHomeActivity.DisplayInfo; import com.tencent.tws.pluginhost.ui.view.CellItem.ActionBarInfo; import com.tencent.tws.pluginhost.ui.view.CellItem.ComponentName; import com.tws.plugin.content.DisplayConfig; import com.tws.plugin.manager.PluginManagerHelper; public class Hotseat extends LinearLayout implements OnClickListener { private final String TAG = "rick_Print_dm:Hotseat"; public static final String HOST_HOME_FRAGMENT = "host_home_fragment"; public static final int FRAGMENT_COMPONENT = DisplayConfig.TYPE_FRAGMENT; public static final int ACTIVITY_COMPONENT = DisplayConfig.TYPE_ACTIVITY; public static final int SERVICE_COMPONENT = DisplayConfig.TYPE_SERVICE; public static final int VIEW_COMPONENT = DisplayConfig.TYPE_VIEW; private ArrayList<OnHotseatClickListener> onListeners = new ArrayList<OnHotseatClickListener>(); private ArrayList<CellItem> mHomeBottomButtons = new ArrayList<CellItem>(); private CellItem mFoucsButton = null; private static int mAddChildIndex = 0; public Hotseat(Context context) { this(context, null); } public Hotseat(Context context, AttributeSet attrs) { this(context, attrs, 0); } public Hotseat(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setOrientation(LinearLayout.HORIZONTAL); } public interface OnHotseatClickListener { public void onItemClick(int tagIndex); public void onItemClick(int tagIndex, int extras); public void updateActionBar(final ActionBarInfo actionBarInfo); } public void addHotseatClickObserver(OnHotseatClickListener onClickListener) { if (onListeners == null) { TwsLog.e(TAG, "removeHomeBottomTabObserver, mHomeBottomTabCallbacksObserver is null, ignore"); return; } if (onListeners.contains(onClickListener)) { TwsLog.d(TAG, "mHomeBottomTabCallbacksObserver, mHomeBottomTabCallbacksObserver had it, ignore"); return; } onListeners.add(onClickListener); } public void removeHotseatClickObserver(OnHotseatClickListener onClickListener) { if (onListeners == null) { TwsLog.e(TAG, "removeHomeBottomTabObserver, mHomeBottomTabCallbacksObserver is null, ignore"); return; } if (onListeners.contains(onClickListener)) { onListeners.remove(onClickListener); } } // type 1:fragment 2:activity 3:service // 专给我的手表等DM固有的Pos位提供的 public void addOneBottomButton(String classId, String packageName, int componentType, CharSequence text, Drawable normalBackground, Drawable focusBackground, int textNormalColor, int textFocusColor, int location) { CellItem button = new CellItem(getContext()); button.setActionClass(classId, packageName, componentType); button.setText(text); button.setNormalBackground(normalBackground); button.setFocusBackground(focusBackground); button.setTextColorNormal(textNormalColor); button.setTextColorFocus(textFocusColor); LayoutParams params = new LayoutParams(0, LayoutParams.MATCH_PARENT, 1.0f); button.setLayoutParams(params); button.setOnClickListener(this); button.setLocation(location); button.setTagIndex(mAddChildIndex); ++mAddChildIndex; addView(button); // 这里需要入队列跟My_fragment有些差异,因为fragment的切换需要依赖这个队列 mHomeBottomButtons.add(button); } public int addOneBottomButtonForPlugin(final DisplayInfo info, int textNormalColor, int textFocusColor, boolean newInstallPlugin) { // 当前显示在Hotseat的内容暂只接收fragment if (info.componentType != DisplayConfig.TYPE_FRAGMENT) { return -1; } if (!isEnabledDisplayInfo(info)) { TwsLog.e(TAG, "info is illegal(already exists), This will be ignored!"); return -1; } CellItem button = new CellItem(getContext()); button.setActionClass(info.classId, info.packageName, info.componentType); final Locale locale = getResources().getConfiguration().locale; if ("zh".equals(locale.getLanguage())) { if ("HK".equals(locale.getCountry())) { button.setText(info.title_zh_HK); } else if ("TW".equals(locale.getCountry())) { button.setText(info.title_zh_TW); } else { button.setText(info.title_zh_CN); } } else { button.setText(info.title_en); } button.setNormalBackground(PluginManagerHelper.getPluginIcon(info.normalResName)); button.setFocusBackground(PluginManagerHelper.getPluginIcon(info.focusResName)); button.setTextColorNormal(textNormalColor); button.setTextColorFocus(textFocusColor); LayoutParams params = new LayoutParams(0, LayoutParams.MATCH_PARENT, 1.0f); button.setLayoutParams(params); button.setOnClickListener(this); button.setLocation(info.location); button.setVisibility(info.establishedDependOn ? View.VISIBLE : View.GONE); button.setTagIndex(mAddChildIndex); ++mAddChildIndex; if ("zh".equals(locale.getLanguage())) { if ("HK".equals(locale.getCountry())) { button.mActionBarInfo.ab_title = info.ab_title_zh_HK; } else if ("TW".equals(locale.getCountry())) { button.mActionBarInfo.ab_title = info.ab_title_zh_TW; } else { button.mActionBarInfo.ab_title = info.ab_title_zh_CN; } } else { button.mActionBarInfo.ab_title = info.ab_title_en; } button.mActionBarInfo.ab_rbtnctype = info.ab_rbtnctype; button.mActionBarInfo.ab_rbtncontent = info.ab_rbtncontent; button.mActionBarInfo.ab_rbtnrestype = info.ab_rbtnrestype; button.mActionBarInfo.ab_rbtnres_normal = info.ab_rbtnres_normal; button.mActionBarInfo.ab_rbtnres_focus = info.ab_rbtnres_focus; boolean insertRlt = false; int index = 1; // 注意这里第一个是我的手表 这个位置是不动的 if (0 < button.getLocation()) { for (index = 1; index < mHomeBottomButtons.size(); index++) { if (button.getLocation() < mHomeBottomButtons.get(index).getLocation()) { insertRlt = true; mHomeBottomButtons.add(index, button); break; } } } if (!insertRlt) { mHomeBottomButtons.add(button); } TwsLog.d(TAG, "addOneBottomButton:" + button.getText() + " add index " + index); addView(button, index); return index; } public boolean isEnabledDisplayInfo(final DisplayInfo info) { if (info == null || TextUtils.isEmpty(info.packageName) || TextUtils.isEmpty(info.classId)) return false; for (CellItem item : mHomeBottomButtons) { if (info.packageName.equals(item.getPluginPackageName()) && info.classId.equals(item.getClassId())) { return false; } } return true; } public int childCount() { return mHomeBottomButtons.size(); } // 当前暂时只处理一个,底部Hotseat一个packageName只让放置一个 public int removePlugin(String packageName) { if (TextUtils.isEmpty(packageName)) return -1; Iterator<CellItem> iter = mHomeBottomButtons.iterator(); boolean foucsChanged = false; CellItem removeItem = null, preItem = null; while (iter.hasNext()) { CellItem button = iter.next(); if (packageName.equals(button.getPluginPackageName())) { if (mFoucsButton == button) { foucsChanged = true; mFoucsButton = preItem; } removeItem = button; // 从Hotseat界面移除 removeView(button); // 从缓存数组里面移除 mHomeBottomButtons.remove(button); if (foucsChanged) { break; // 需要退出遍历执行切换焦点流程 } else { return button.getTagIndex(); } } preItem = button; } if (foucsChanged && onListeners != null) { for (OnHotseatClickListener listener : onListeners) { listener.updateActionBar(mFoucsButton.mActionBarInfo); listener.onItemClick(mFoucsButton == null ? 0 : mFoucsButton.getTagIndex()); } } return removeItem == null ? -1 : removeItem.getTagIndex(); } @Override public void onClick(View view) { if (view instanceof CellItem) { if (view == mFoucsButton) return; setFocus((CellItem) view); ((CellItem) view).setHighlight(false); if (onListeners != null && mFoucsButton != null) { for (OnHotseatClickListener listener : onListeners) { listener.updateActionBar(mFoucsButton.mActionBarInfo); listener.onItemClick(mFoucsButton.getTagIndex()); } } } else { TwsLog.d(TAG, "onClick view=" + view); } } public String getFouceTabClassId() { return mFoucsButton == null ? "" : mFoucsButton.getClassId(); } public int getFouceTagIndex() { return mFoucsButton == null ? 0 : mFoucsButton.getTagIndex(); } private void setFocus(final CellItem button) { TwsLog.d(TAG, "call setFocus HomeBottomButton"); if (null == button) { Exception here = new Exception("call setFouce on null object"); here.fillInStackTrace(); TwsLog.d(TAG, "call setFouce on null object", here); return; } boolean matched = false; for (CellItem btn : mHomeBottomButtons) { if (btn.equals(button)) { button.setFocus(true); mFoucsButton = button; matched = true; } else { btn.setFocus(false); } } if (!matched) { mFoucsButton = null; TwsLog.d(TAG, "setFouce:HomeBottomButton - classId is " + button.getClassId() + " no matching to the right!!!"); printHomeBottomButtonsInfo(); } } /** * @return FoucsButton TagIndex */ public int setFocusIndex(int arrayIndex) { if (mHomeBottomButtons.size() < 1) return -1; int focusTagIndex = -1; mFoucsButton = null; if (arrayIndex < 0) { arrayIndex = 0; } else if (mHomeBottomButtons.size() <= arrayIndex) { arrayIndex = mHomeBottomButtons.size() - 1; } for (int index = 0; index < mHomeBottomButtons.size(); index++) { if (index == arrayIndex) { mFoucsButton = mHomeBottomButtons.get(index); mFoucsButton.setFocus(true); focusTagIndex = mFoucsButton.getTagIndex(); } else { mHomeBottomButtons.get(index).setFocus(false); } } if (mFoucsButton != null && onListeners != null) { for (OnHotseatClickListener listener : onListeners) { listener.updateActionBar(mFoucsButton.mActionBarInfo); } } return focusTagIndex; } private void printHomeBottomButtonsInfo() { TwsLog.d(TAG, "===========================printHomeBottomButtonsInfo begin==========================="); int index = 0; for (CellItem button : mHomeBottomButtons) { TwsLog.d(TAG, "[" + index + "] classId:" + button.getClassId() + " type is " + button.getComponentType()); } TwsLog.d(TAG, "===========================printHomeBottomButtonsInfo end==========================="); } public ComponentName getComponentNameByTagIndex(int tagIndex) { if (mFoucsButton == null) { setFocusIndex(0); } if (mFoucsButton != null && mFoucsButton.getTagIndex() == tagIndex) { return mFoucsButton.getComponentName(); } for (CellItem item : mHomeBottomButtons) { if (item.getTagIndex() == tagIndex) { return mFoucsButton.getComponentName(); } } return null; } public int getPosByClassId(String classId) { if (TextUtils.isEmpty(classId)) return 0; for (int index = 0; index < mHomeBottomButtons.size(); index++) { if (classId.equals(mHomeBottomButtons.get(index).getClassId())) return index; } return 0; } public void switchToFragment(String classId, int extras) { for (CellItem item : mHomeBottomButtons) { if (item.getClassId().equals(classId)) { setFocus(item); if (onListeners != null && mFoucsButton != null) { for (OnHotseatClickListener listener : onListeners) { listener.updateActionBar(mFoucsButton.mActionBarInfo); listener.onItemClick(mFoucsButton.getTagIndex(), extras); } } return; } } } public void setHighlightCellItem(String classId, boolean needHighlight) { for (CellItem item : mHomeBottomButtons) { if (item.getClassId().equals(classId)) { item.setHighlight(needHighlight); return; } } } public void unEstablishedDependOnForPlugin(String pid) { if (TextUtils.isEmpty(pid)) return; for (CellItem item : mHomeBottomButtons) { if (pid.equals(item.getPluginPackageName())) { item.setVisibility(View.GONE); } } } public void establishedDependOnForPlugin(String pid) { if (TextUtils.isEmpty(pid)) return; for (CellItem item : mHomeBottomButtons) { if (pid.equals(item.getPluginPackageName())) { item.setVisibility(View.VISIBLE); } } } }