package de.theknut.xposedgelsettings.hooks.appdrawer.tabsandfolders; import android.app.AlertDialog; import android.content.ComponentName; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.os.Handler; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.FrameLayout.LayoutParams; import android.widget.HorizontalScrollView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.Spinner; import android.widget.TabHost; import android.widget.TabWidget; import android.widget.TextView; import android.widget.Toast; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import de.theknut.xposedgelsettings.R; import de.theknut.xposedgelsettings.hooks.Common; import de.theknut.xposedgelsettings.hooks.ObfuscationHelper.Classes; import de.theknut.xposedgelsettings.hooks.ObfuscationHelper.Fields; import de.theknut.xposedgelsettings.hooks.ObfuscationHelper.Methods; import de.theknut.xposedgelsettings.hooks.PreferencesHelper; import de.theknut.xposedgelsettings.hooks.Utils; import de.theknut.xposedgelsettings.hooks.appdrawer.tabsandfolders.AppDrawerItem.SortType; import de.theknut.xposedgelsettings.ui.AllAppsList; import de.theknut.xposedgelsettings.ui.AllWidgetsList; import static de.robv.android.xposed.XposedHelpers.callMethod; import static de.robv.android.xposed.XposedHelpers.callStaticMethod; import static de.robv.android.xposed.XposedHelpers.getIntField; import static de.robv.android.xposed.XposedHelpers.getObjectField; import static de.robv.android.xposed.XposedHelpers.newInstance; import static de.robv.android.xposed.XposedHelpers.setIntField; import static de.robv.android.xposed.XposedHelpers.setObjectField; /** * Created by Alexander Schulz on 21.08.2014. */ public final class TabHelperKK extends TabHelper implements View.OnClickListener, View.OnLongClickListener { private static final TabHelperKK INSTANCE = new TabHelperKK(); private static Context XGELSContext; public static final int MOVE_LEFT = -1; public static final int MOVE_RIGHT = 1; private Tab tmpWidgetTab; TabHost tabHost; HorizontalScrollView hsv; ImageView addButton; FrameLayout tabsContainer; View progressBar; View tabHostDivider; AlertDialog tabSettingsDialog; public static TabHelperKK getInstance() { return INSTANCE; } public TabHost getTabHost() { return tabHost; } public void init(TabHost tabhost) { XGELSContext = Common.XGELS_CONTEXT; this.tabHost = tabhost; this.tabs = new ArrayList<Tab>(); addHorizontalScrollView(PreferencesHelper.moveTabHostBottom); //addProgressBar(); showTabBar(); tabHost.setOnTabChangedListener(null); initTabs(); addTabs(false); tabHost.setOnTabChangedListener((TabHost.OnTabChangeListener) tabhost); tabHost.setCurrentTab(0); tabhost.getTabWidget().setCurrentTab(0); int id = tabhost.getContext().getResources().getIdentifier("market_button", "id", Common.HOOKED_PACKAGE); tabhost.removeView(tabhost.findViewById(id)); } private void addHorizontalScrollView(boolean alignBottom) { TabWidget tabWidget = tabHost.getTabWidget(); tabsContainer = (FrameLayout) tabWidget.getParent(); tabsContainer.removeView(tabWidget); LayoutParams lptw = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); lptw.gravity = Gravity.START; RelativeLayout relativeLayout = (RelativeLayout) LayoutInflater.from(XGELSContext).inflate(R.layout.tab_widget, null, false); hsv = (HorizontalScrollView) relativeLayout.findViewById(R.id.horizontalscrollview); hsv.setSmoothScrollingEnabled(true); hsv.addView(tabWidget, lptw); addButton = (ImageView) relativeLayout.findViewById(R.id.addbutton); addButton.setOnClickListener(this); tabHostDivider = relativeLayout.findViewById(R.id.tab_host_divider); if (alignBottom) { ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) hsv.getLayoutParams(); layoutParams.setMargins(0, 0, 0, Utils.dpToPx(-2)); hsv.requestLayout(); FrameLayout tabContent = (FrameLayout) tabHost.findViewById(android.R.id.tabcontent); ViewGroup parent = (ViewGroup) tabContent.getParent(); parent.removeView(tabContent); parent.addView(tabContent, 0, new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, 1f)); } else { relativeLayout.removeView(tabHostDivider); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(tabHostDivider.getLayoutParams()); params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, relativeLayout.getId()); relativeLayout.addView(tabHostDivider, params); } tabsContainer.addView(relativeLayout); } private void addProgressBar() { FrameLayout tabContent = (FrameLayout) tabHost.findViewById(android.R.id.tabcontent); ViewGroup parent = (ViewGroup) tabContent.getParent(); parent.removeView(tabContent); RelativeLayout tabContentWithProgressBar = (RelativeLayout) LayoutInflater.from(XGELSContext).inflate(R.layout.tab_content_progressbar, null, false); tabContentWithProgressBar.addView(tabContent); progressBar = tabContentWithProgressBar.findViewById(R.id.tab_progressbar); progressBar.bringToFront(); parent.addView(tabContentWithProgressBar); } public void showTabBar() { tabsContainer.setVisibility(PreferencesHelper.enableAppDrawerTabs ? View.VISIBLE : View.GONE); } public void hideTabBar() { tabsContainer.setVisibility(View.GONE); } public void initTabs() { if (!PreferencesHelper.enableAppDrawerTabs) { tabs.add(new Tab("idx=" + 0 + "|id=" + Tab.APPS_ID + "|contenttype=" + ContentType.Applications + "|title=" + tabHost.getTabWidget().getChildTabViewAt(0).getContentDescription().toString() + "|hide=" + false, false)); tabs.add(new Tab("idx=" + 1 + "|id=" + Tab.WIDGETS_ID + "|contenttype=" + ContentType.Widgets + "|title=" + tabHost.getTabWidget().getChildTabViewAt(1).getContentDescription().toString() + "|hide=" + false, false)); tabHost.getTabWidget().removeAllViews(); return; } Tab appsTab = new Tab("idx=" + 0 + "|id=" + Tab.APPS_ID + "|contenttype=" + ContentType.Applications + "|title=" + tabHost.getTabWidget().getChildTabViewAt(0).getContentDescription().toString() + "|hide=" + false, false); tabHost.getTabWidget().removeAllViews(); for (String item : PreferencesHelper.appdrawerTabData) { tabs.add(new Tab(item, false)); } boolean hasApps = false; for (int i = 0; i < tabs.size(); i++) { if (tabs.get(i).isAppsTab()) { hasApps = true; } } if (!hasApps) { tabs.add(0, appsTab); } } private void addTabs(boolean focusLastTab) { Collections.sort(tabs, new Comparator<Tab>() { @Override public int compare(Tab lhs, Tab rhs) { return lhs.getIndex() - rhs.getIndex(); } }); for (Tab tab : tabs) { addTabInternal(tab, focusLastTab); } } public void addTab(Tab tab) { tabs.add(tab); addTabInternal(tab, true); Toast.makeText(tabHost.getContext(), XGELSContext.getString(R.string.toast_appdrawer_tabadded_title), Toast.LENGTH_LONG).show(); Toast.makeText(tabHost.getContext(), XGELSContext.getString(R.string.toast_appdrawer_tabadded_title), Toast.LENGTH_LONG).show(); } private void addTabInternal(final Tab tab, boolean focus) { if (DEBUG) log("Add tab " + tab.toString()); TabHost.TabContentFactory contentFactory = new TabHost.TabContentFactory() { public View createTabContent(String tag) { return (View) getObjectField(tabHost, Fields.acthAppsCustomizePane); } }; LayoutInflater mLayoutInflater = (LayoutInflater) getObjectField(tabHost, "mLayoutInflater"); int tab_widget_indicator = Common.LAUNCHER_CONTEXT.getResources().getIdentifier("tab_widget_indicator", "layout", Common.HOOKED_PACKAGE); TextView tabView = (TextView) mLayoutInflater.inflate(tab_widget_indicator, tabHost.getTabWidget(), false); tabView.setBackground(XGELSContext.getResources().getDrawable(R.drawable.tab_indicator)); tabView.setText(tab.getTitle()); tabView.setTag(tab); tabView.setContentDescription(tab.getTitle()); tabView.setOnLongClickListener(this); tabView.getBackground().setColorFilter(tab.getPrimaryColor(), PorterDuff.Mode.MULTIPLY); tabHost.addTab(tabHost.newTabSpec(tab.isWidgetsTab() ? "WIDGETS" : "APPS").setIndicator(tabView).setContent(contentFactory)); if (focus) { tabHost.setCurrentTab(tabHost.getTabWidget().getTabCount() - 1); scroll(); } } @Override public void removeTab(Tab tab) { tabHost.setOnTabChangedListener(null); tabHost.getTabWidget().removeAllViews(); if (tabs.contains(tab)) { tabs.remove(tab); onTabsDataChanged(); } addTabs(false); tabHost.setOnTabChangedListener((TabHost.OnTabChangeListener) tabHost); int newId = tab.getIndex() - 1; setCurrentTab(newId < 0 ? 0 : newId); tabHost.getTabWidget().setCurrentTab(newId < 0 ? 0 : newId); if (tab.hideFromAppsPage()) { Object mAppsCustomizePane = getObjectField(getTabHost(), Fields.acthAppsCustomizePane); ArrayList allApps = (ArrayList) getObjectField(mAppsCustomizePane, Fields.acpvAllApps); allApps.addAll(tab.getData()); callMethod(mAppsCustomizePane, Methods.acpvSetApps, allApps); } scroll(); } public void renameTab(long tabId, String tabName) { for (int i = 0; i < tabHost.getTabWidget().getTabCount(); i++) { Tab tab = (Tab) tabHost.getTabWidget().getChildTabViewAt(i).getTag(); if (tab.getId() == tabId) { tab.setTitle(tabName); ((TextView) tabHost.getTabWidget().getChildAt(i)).setText(tab.getTitle()); break; } } } public void moveTab(Tab tabToMove, int direction) { int newIdx = tabToMove.getIndex() + direction; if (newIdx == -1 || newIdx == tabHost.getTabWidget().getTabCount()) return; Iterator<Tab> it = tabs.iterator(); while(it.hasNext()) { Tab tab = it.next(); if (tab.getIndex() == newIdx) { tab.setIndex(tabToMove.getIndex()); tabToMove.setIndex(newIdx); } } onTabsDataChanged(); tabHost.setOnTabChangedListener(null); tabHost.getTabWidget().removeAllViews(); addTabs(false); setCurrentTab(newIdx); tabHost.setOnTabChangedListener((TabHost.OnTabChangeListener) tabHost); Intent intent = getBaseIntent(false, tabToMove.getId(), null); Common.LAUNCHER_CONTEXT.startActivity(intent); } public boolean setContentTypeImmediate(Object contentType) { if (contentType.toString().equals("Widgets")) { for (Tab tab : tabs) { if (tab.isWidgetsTab()) { setCurrentTab(tab.getIndex()); return true; } } hideTabBar(); tmpWidgetTab = new Tab("idx=" + tabHost.getTabWidget().getTabCount() + "|id=" + Tab.WIDGETS_ID + "|contenttype=" + ContentType.Widgets + "|title=" + "Widgets", false); addTabInternal(tmpWidgetTab, true); return true; } else { if (!PreferencesHelper.appdrawerRememberLastPosition) { setCurrentTab(getTabById(Tab.APPS_ID).getIndex()); } } if (tmpWidgetTab != null) { removeTab(tmpWidgetTab); } showTabBar(); invalidate(); return false; } @Override public boolean handleScroll(float overscroll) { if (overscroll > 100.0) { int newId = getCurrentTabData().getIndex() + 1; setCurrentTab(newId >= tabHost.getTabWidget().getChildCount() ? 0 : newId); return true; } else if (overscroll < -100.0) { int newId = getCurrentTabData().getIndex() - 1; setCurrentTab(newId < 0 ? (tabHost.getTabWidget().getChildCount() - 1) : newId); return true; } return false; } @Override public void invalidate() { setTabColor(getCurrentTabData().getPrimaryColor()); Object mAppsCustomizePane = getObjectField(tabHost, Fields.acthAppsCustomizePane); callMethod(mAppsCustomizePane, Methods.acpvInvalidatePageData, PreferencesHelper.appdrawerRememberLastPosition ? Common.APPDRAWER_LAST_PAGE_POSITION : 0, true); } @Override public void setTabColor(int color) { getCurrentTabData().setColor(color); tabHostDivider.setBackgroundColor(color); tabHost.getCurrentTabView().getBackground().setColorFilter(color, PorterDuff.Mode.MULTIPLY); addButton.setColorFilter(color, PorterDuff.Mode.MULTIPLY); } public void setCurrentTab(int idx) { setCurrentTab(idx, 0); } public void setCurrentTab(int idx, int page) { tabHost.setCurrentTab(idx); callMethod(getObjectField(tabHost, Fields.acthAppsCustomizePane), Methods.pvSetCurrentPage, page); setTabColor(tabs.get(idx).getPrimaryColor()); scroll(); } @Override public void saveTabData() { Intent intent = getBaseIntent(false, 0, null); Common.LAUNCHER_CONTEXT.startActivity(intent); } private void onTabsDataChanged() { syncIndexes(); } private void syncIndexes() { int i = 0; Collections.sort(tabs, new Comparator<Tab>() { @Override public int compare(Tab lhs, Tab rhs) { return lhs.getIndex() - rhs.getIndex(); } }); Iterator<Tab> it = tabs.iterator(); while (it.hasNext()) { it.next().setIndex(i++); } } @Override public void scroll() { new Handler().post(new Runnable() { @Override public void run() { View tab = tabHost.getTabWidget().getChildTabViewAt(tabHost.getCurrentTab()); hsv.smoothScrollTo((tab.getLeft() + tab.getWidth() / 2) - (hsv.getWidth() / 2) - (addButton.getWidth() / 2), 0); } }); } public void showProgressBar() { if (!isProgressBarVisible()) { Common.LAUNCHER_INSTANCE.runOnUiThread( new Runnable() { @Override public void run() { progressBar.setVisibility(View.VISIBLE); progressBar.bringToFront(); } }); } } public void hideProgressBar() { Common.LAUNCHER_INSTANCE.runOnUiThread( new Runnable() { @Override public void run() { progressBar.setVisibility(View.GONE); } }); } public boolean isProgressBarVisible() { return progressBar.getVisibility() == View.VISIBLE; } public Tab getTabById(long tabId) { if (tabs == null) return null; for (Tab tab : tabs) { if (tab.getId() == tabId) { return tab; } } return null; } public long getNewTabId() { int i = 0; long[] ids = new long[tabs.size()]; Iterator<Tab> it = tabs.iterator(); while (it.hasNext()) { ids[i++] = it.next().getId(); } Arrays.sort(ids); long lastId = -1; for (long id : ids) { if (id > (lastId + 1)) { return ++lastId; } lastId = id; } return ++lastId; } @Override public void onClick(View v) { if (checkPremium()) { setupTabSettings(null); } else { Utils.showPremiumOnly(); } } @Override public boolean onLongClick(View v) { if (checkPremium()) { setCurrentTab(((Tab) v.getTag()).getIndex()); setupTabSettings((Tab) v.getTag()); return true; } Utils.showPremiumOnly(); return false; } public int setNumberOfPages(Object thisObject) { Tab curTab = getCurrentTabData(); if (curTab == null) return -1; int numAppPages = getIntField(thisObject, Fields.acpvNumAppsPages); if ((curTab.isAppsTab() || curTab.isUserTab()) && FolderHelper.getInstance().hasFolder()) { int mCellCountX = getIntField(thisObject, Fields.acpvCellCountX); int mCellCountY = getIntField(thisObject, Fields.acpvCellCountY); int itemCnt = FolderHelper.getInstance().getFoldersForTab(curTab.getId()).size(); itemCnt += curTab.isAppsTab() ? FolderHelper.getInstance().getAllApps().size() : curTab.getData().size(); setIntField(thisObject, Fields.acpvNumAppsPages, (int) Math.ceil((float) itemCnt / (mCellCountX * mCellCountY))); return numAppPages; } else if (curTab.isCustomTab() && curTab.getData() != null) { int mCellCountX = getIntField(thisObject, Fields.acpvCellCountX); int mCellCountY = getIntField(thisObject, Fields.acpvCellCountY); setIntField(thisObject, Fields.acpvNumAppsPages, (int) Math.ceil((float) curTab.getData().size() / (mCellCountX * mCellCountY))); return numAppPages; } else if (curTab.isNewAppsTab() || curTab.isNewUpdatedTab()) { setIntField(thisObject, Fields.acpvNumAppsPages, 1); return 1; } return -1; } @Override public Tab getCurrentTabData() { return (Tab) tabHost.getCurrentTabView().getTag(); } public boolean loadTabPage(Object thisObject, int page) { Tab curTab = getCurrentTabData(); if (curTab == null) return false; log("Curtab " + curTab.getTitle()); if ((curTab.isAppsTab() || curTab.isUserTab()) && FolderHelper.getInstance().hasFolder()) { ArrayList items; if (curTab.isAppsTab()) { items = new ArrayList(FolderHelper.getInstance().getAllApps()); } else if (curTab.isUserTab() && curTab.getData() != null) { items = new ArrayList(curTab.getData()); } else { return false; } items.addAll(0, FolderHelper.getInstance().getFoldersForTab(curTab.getId())); syncAppsPageItems(thisObject, items, page); return true; } else if (curTab.isCustomTab() && curTab.getData() != null) { syncAppsPageItems(thisObject, curTab.getData(), page); return true; } return false; } private void syncAppsPageItems(Object thisObject, ArrayList apps, int page) { final boolean isRtl = (Boolean) callMethod(thisObject, Methods.pvIsLayoutRtl); LayoutInflater mLayoutInflater = (LayoutInflater) getObjectField(thisObject, "mLayoutInflater"); int mCellCountX = getIntField(thisObject, Fields.acpvCellCountX); int mCellCountY = getIntField(thisObject, Fields.acpvCellCountY); int apps_customize_application = Common.LAUNCHER_CONTEXT.getResources().getIdentifier("apps_customize_application", "layout", Common.HOOKED_PACKAGE); int numCells = mCellCountX * mCellCountY; int startIndex = page * numCells; int endIndex = Math.min(startIndex + numCells, apps.size()); ViewGroup appsCustomizeCellLayout = (ViewGroup) callMethod(thisObject, Methods.pvGetPageAt, page); callMethod(appsCustomizeCellLayout, Methods.acpvRemoveAllViewsOnPage); for (int i = startIndex; i < endIndex; ++i) { Object info = apps.get(i); View icon; int index = i - startIndex; int x = index % mCellCountX; int y = index / mCellCountX; if (isRtl) { x = mCellCountX - x - 1; } if (info instanceof Folder) { icon = ((Folder) info).makeFolderIcon(appsCustomizeCellLayout); if (icon == null) continue; } else { icon = mLayoutInflater.inflate(apps_customize_application, appsCustomizeCellLayout, false); if (Common.PACKAGE_OBFUSCATED) { callMethod(icon, Methods.pviApplyFromApplicationInfo, info, thisObject); } else { callMethod(icon, Methods.pviApplyFromApplicationInfo, info, true, thisObject); } icon.setOnClickListener((View.OnClickListener) thisObject); icon.setOnLongClickListener((View.OnLongClickListener) thisObject); icon.setOnTouchListener((View.OnTouchListener) thisObject); icon.setOnKeyListener((View.OnKeyListener) thisObject); } callMethod(appsCustomizeCellLayout, Methods.clAddViewToCellLayout, icon, -1, i, newInstance(Classes.CellLayoutLayoutParams, x, y, 1, 1), false); } callMethod(thisObject, Methods.acpvEnableHwLayersOnVisiblePages); } public void setContentType(Object thisObject) { Tab tab = getCurrentTabData(); setObjectField(thisObject, Fields.acpvContentType, callMethod(tabHost, Methods.acthGetContentTypeForTabTag, tab.isWidgetsTab() ? "WIDGETS" : "APPS")); setTabColor(getCurrentTabData().getPrimaryColor()); Object mAppsCustomizePane = getObjectField(tabHost, Fields.acthAppsCustomizePane); callMethod(mAppsCustomizePane, Methods.acpvInvalidatePageData, 0, true); scroll(); } @Override public ArrayList<String> getAppsToHide() { ArrayList apps = new ArrayList(); if (Common.IS_KK_TREBUCHET || !Common.IS_PRE_GNL_4) return apps; for (Tab tab : tabs) { if (tab.hideFromAppsPage()) { apps.addAll(tab.getRawData()); } } return apps; } public boolean isTabSettingsOpen() { if (tabSettingsDialog != null) { return tabSettingsDialog.isShowing(); } return false; } public void closeTabSettings() { tabSettingsDialog.cancel(); } private void setupTabSettings(final Tab tab) { final boolean newTab = tab == null; final ViewGroup tabSettingsView = (ViewGroup) LayoutInflater.from(XGELSContext).inflate(R.layout.tab_settings_view, null); if (newTab) { tabSettingsView.findViewById(R.id.tab_settings_bar).setVisibility(View.GONE); tabSettingsView.findViewById(R.id.tab_settings_additional).setVisibility(View.GONE); } final EditText editText = (EditText) tabSettingsView.findViewById(R.id.tabname); if (!newTab) editText.setText(tab.getTitle()); int padding = Math.round(XGELSContext.getResources().getDimension(R.dimen.tab_menu_padding)); tabSettingsDialog = new AlertDialog.Builder(Common.LAUNCHER_INSTANCE).create(); tabSettingsDialog.setView(tabSettingsView, padding, padding, padding, padding); if (!newTab) { ImageView save = (ImageView) tabSettingsView.findViewById(R.id.tab_save_settings); Utils.setDrawableSelector(save); save.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String newTabName = editText.getText().toString().trim(); if (newTabName.length() == 0) { tabSettingsDialog.dismiss(); return; } if (!tab.getTitle().equals(newTabName)) { renameTab(tab.getId(), newTabName); Intent intent = getBaseIntent(false, tab.getId(), tab.getTitle()); Common.LAUNCHER_CONTEXT.startActivity(intent); } tabSettingsDialog.dismiss(); } }); final ImageView addfolder = (ImageView) tabSettingsView.findViewById(R.id.addfolder); if (tab.isAppsTab() || tab.isUserTab()) { addfolder.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { tabSettingsDialog.dismiss(); FolderHelper.getInstance().setupFolderSettings(null, tab.getId()); } }); Utils.setDrawableSelector(addfolder); } else { addfolder.setVisibility(View.GONE); } final ImageView manageApps = (ImageView) tabSettingsView.findViewById(R.id.manageapps); if (!tab.isDynamicTab()) { manageApps.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { tabSettingsDialog.dismiss(); if (tab.isUserTab()) { Intent intent = getBaseIntent(true, tab.getId(), editText.getText().toString().trim()); intent.putStringArrayListExtra("items", tab.getRawData()); intent.putExtra("index", tab.getIndex()); intent.putExtra("contenttype", tab.getContentType().toString()); Common.LAUNCHER_CONTEXT.startActivity(intent); } else { if (tab.isWidgetsTab()) { tabHost.setCurrentTab(0); Intent startMain = new Intent(Intent.ACTION_MAIN); startMain.addCategory(Intent.CATEGORY_HOME); startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); callMethod(Common.LAUNCHER_INSTANCE, "startActivity", startMain); } Intent intent = new Intent(); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS); intent.putExtra("mode", AllAppsList.MODE_PICK_APPS_TO_HIDE); intent.putStringArrayListExtra("items", new ArrayList<String>(tab.isAppsTab() ? PreferencesHelper.hiddenApps : PreferencesHelper.hiddenWidgets)); intent.setComponent(new ComponentName(Common.PACKAGE_NAME, tab.isAppsTab() ? AllAppsList.class.getName() : AllWidgetsList.class.getName())); Common.LAUNCHER_CONTEXT.startActivity(intent); } } }); Utils.setDrawableSelector(manageApps); } else { manageApps.setVisibility(View.GONE); } final ImageView deleteTab = (ImageView) tabSettingsView.findViewById(R.id.deletetab); if (!tab.isAppsTab()) { deleteTab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(Common.LAUNCHER_CONTEXT, XGELSContext.getString(R.string.toast_tab_delete), Toast.LENGTH_LONG).show(); } }); deleteTab.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { tabSettingsDialog.dismiss(); long itemid = tab.getId(); removeTab(tab); ArrayList<Folder> folders = FolderHelper.getInstance().getFoldersForTab(tab.getId()); if (folders.size() != 0) { FolderHelper.getInstance().removeFolders(folders); } Intent intent = getBaseIntent(false, itemid, null); Common.LAUNCHER_CONTEXT.startActivity(intent); return true; } }); Utils.setDrawableSelector(deleteTab); } else { deleteTab.setVisibility(View.GONE); } tabSettingsView.findViewById(R.id.tab_settings_divider).setBackgroundColor(tab.getPrimaryColor()); final ImageView color = (ImageView) tabSettingsView.findViewById(R.id.tabcolor); color.setImageDrawable(setColorPreview()); color.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = getBaseIntent(false, tab.getId(), tab.getTitle()); intent.putExtra("initcolor", tab.getPrimaryColor()); Common.LAUNCHER_CONTEXT.startActivity(intent); tabSettingsDialog.cancel(); } }); final ImageView moveLeft = (ImageView) tabSettingsView.findViewById(R.id.movetableft); moveLeft.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { moveTab(tab, MOVE_LEFT); } }); Utils.setDrawableSelector(moveLeft); final ImageView moveRight = (ImageView) tabSettingsView.findViewById(R.id.movetabright); moveRight.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { moveTab(tab, MOVE_RIGHT); } }); Utils.setDrawableSelector(moveRight); final CheckBox hideApps = (CheckBox) tabSettingsView.findViewById(R.id.tab_hide_apps); hideApps.setChecked(tab.hideFromAppsPage()); if (tab.isCustomTab() && !(tab.isNewUpdatedTab() || tab.isNewAppsTab())) { hideApps.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { tab.setHideFromAppsPage(isChecked); Intent intent = getBaseIntent(false, tab.getId(), tab.getTitle()); Common.LAUNCHER_CONTEXT.startActivity(intent); Object mAppsCustomizePane = getObjectField(getTabHost(), Fields.acthAppsCustomizePane); ArrayList allApps = (ArrayList) getObjectField(mAppsCustomizePane, Fields.acpvAllApps); allApps.addAll(tab.getData()); callMethod(mAppsCustomizePane, Methods.acpvSetApps, allApps); invalidate(); } }); } else { if (tab.isWidgetsTab()) ((View) hideApps.getParent()).setVisibility(View.GONE); hideApps.setVisibility(View.GONE); } Spinner tabSort = (Spinner) tabSettingsView.findViewById(R.id.tabsort); String[] stringArray = XGELSContext.getResources().getStringArray(R.array.tabsort_values); final ArrayList<String> sortTypes = new ArrayList<String>(Arrays.asList(stringArray)); tabSort.setSelection(sortTypes.indexOf(tab.getSortType().toString())); if (!(tab.isWidgetsTab() || tab.isNewAppsTab() || tab.isNewAppsTab())) { tabSort.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { SortType sortType = SortType.valueOf(sortTypes.get(position)); if (tab.getSortType().equals(sortType)) return; tab.setSortType(sortType); Object mAppsCustomizePane = getObjectField(tabHost, Fields.acthAppsCustomizePane); if (tab.isAppsTab()) { callMethod(mAppsCustomizePane, Methods.acpvSetApps, getObjectField(mAppsCustomizePane, Fields.acpvAllApps)); } invalidate(); Intent intent = getBaseIntent(false, tab.getId(), null); Common.LAUNCHER_CONTEXT.startActivity(intent); } @Override public void onNothingSelected(AdapterView<?> parent) { } }); } else { tabSort.setVisibility(View.GONE); } } else { final Spinner spinner = (Spinner) tabSettingsView.findViewById(R.id.tabcontenttype); spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { if (position != 0) { editText.setText(XGELSContext.getResources().getStringArray(R.array.tabcontent_names)[position]); } else { editText.setText(""); } } @Override public void onNothingSelected(AdapterView<?> parent) { } }); spinner.setVisibility(View.VISIBLE); tabSettingsView.findViewById(R.id.tab_save_settings).setVisibility(View.GONE); tabSettingsView.findViewById(R.id.tab_settings_divider).setVisibility(View.GONE); tabSettingsDialog.setButton(DialogInterface.BUTTON_POSITIVE, tabHost.getContext().getString(android.R.string.ok), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String newTabName = editText.getText().toString().trim(); if (newTabName.length() == 0) { tabSettingsDialog.dismiss(); return; } long itemId = getNewTabId(); Spinner spinner = (Spinner) tabSettingsView.findViewById(R.id.tabcontenttype); ContentType contentType = ContentType.valueOf(XGELSContext.getResources().getStringArray(R.array.tabcontent_values)[spinner.getSelectedItemPosition()]); Intent intent = getBaseIntent(contentType == ContentType.User, itemId, newTabName); int tabindex = tabHost.getTabWidget().getTabCount(); if (spinner.getSelectedItemPosition() != 0) { addTab(new Tab("idx=" + tabindex + "|id=" + itemId + "|contenttype=" + contentType + "|title=" + newTabName + "|hide=" + false , true) ); } intent.putExtra("contenttype", contentType.toString()); intent.putExtra("new", true); intent.putExtra("index", tabindex); Common.LAUNCHER_CONTEXT.startActivity(intent); } }); tabSettingsDialog.setButton(DialogInterface.BUTTON_NEGATIVE, tabHost.getContext().getString(android.R.string.cancel), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { tabSettingsDialog.dismiss(); } }); } tabSettingsDialog.show(); } private Drawable setColorPreview() { Drawable canvas = XGELSContext.getResources().getDrawable(R.drawable.tabcolorpreview_canvas); canvas.setColorFilter(getCurrentTabData().getPrimaryColor(), PorterDuff.Mode.MULTIPLY); Drawable ring = XGELSContext.getResources().getDrawable(R.drawable.tabcolorpreview_ring); ring.setColorFilter(getCurrentTabData().getPrimaryColor(), PorterDuff.Mode.MULTIPLY); return new LayerDrawable(new Drawable[] {canvas, ring}); } @Override public Comparator getAppNameComparator() { return (Comparator) callStaticMethod(Classes.LauncherModel, Methods.lmGetAppNameComparator); } }