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.Color; import android.graphics.PorterDuff; import android.graphics.drawable.Drawable; import android.graphics.drawable.InsetDrawable; import android.graphics.drawable.LayerDrawable; import android.os.Handler; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.animation.AccelerateInterpolator; import android.widget.AdapterView; import android.widget.CheckBox; import android.widget.CompoundButton; import android.widget.EditText; import android.widget.FrameLayout; import android.widget.HorizontalScrollView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.Spinner; 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.HashMap; import java.util.Iterator; import de.theknut.xposedgelsettings.R; import de.theknut.xposedgelsettings.hooks.Common; import de.theknut.xposedgelsettings.hooks.ObfuscationHelper; import de.theknut.xposedgelsettings.hooks.ObfuscationHelper.Classes; import de.theknut.xposedgelsettings.hooks.ObfuscationHelper.Methods; import de.theknut.xposedgelsettings.hooks.PreferencesHelper; import de.theknut.xposedgelsettings.hooks.Utils; 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.getObjectField; import static de.robv.android.xposed.XposedHelpers.newInstance; /** * Created by Alexander Schulz on 06.10.2015. */ public final class TabHelperM extends TabHelper implements View.OnClickListener, View.OnLongClickListener { private static final TabHelperM INSTANCE = new TabHelperM(); private static Context XGELSContext; public static final int MOVE_LEFT = -1; public static final int MOVE_RIGHT = 1; private LinearLayout allAppsCountainerView; private RelativeLayout tabsContainer; private HorizontalScrollView hsv; private AlertDialog tabSettingsDialog; private ImageView addButton; private LayoutInflater inflater; int currentTabId; float inactiveTabTranslationX, tabTranslationY; private Object appNameComparator; private RelativeLayout XGELSTabHost; public static TabHelperM getInstance() { return INSTANCE; } public LinearLayout getAllAppsCountainerView() { return allAppsCountainerView; } public void init(LinearLayout tabhost) { XGELSContext = Common.XGELS_CONTEXT; inflater = LayoutInflater.from(XGELSContext); inactiveTabTranslationX = XGELSContext.getResources().getDimension(R.dimen.tabhost_overlap); tabTranslationY = XGELSContext.getResources().getDimension(R.dimen.tabhost_translationY); this.allAppsCountainerView = tabhost; if (this.tabs == null) { initTabs(); } if (PreferencesHelper.enableAppDrawerTabs) { addTabBar(PreferencesHelper.moveTabHostBottom); addTabs(false); showTabBar(); } } public void showTabBar() { if (PreferencesHelper.enableAppDrawerTabs) { hsv.setVisibility(View.VISIBLE); int startDelay = 1; Tab currTab = getCurrentTabData(); animateShowTab(tabsContainer.findViewById(currTab.getLayoutId()), 0); for (int i = currTab.getIndex() - 1, j = currTab.getIndex(); i >= 0 || j < tabs.size(); i--, j++, startDelay++) { if (i >= 0) animateShowTab(tabsContainer.findViewById(tabs.get(i).getLayoutId()), startDelay); if (j < tabs.size()) animateShowTab(tabsContainer.findViewById(tabs.get(j).getLayoutId()), startDelay); else if (j == tabs.size()) animateShowTab(addButton, startDelay); } } else { hsv.setVisibility(View.GONE); } } private boolean animateShowTab(View view, int startDelayFactor) { view.setVisibility(View.VISIBLE); view.setTranslationY(view.getHeight() * 1.5f); view.animate() .translationY(0f) .setInterpolator(new AccelerateInterpolator()) .setDuration(300) .setStartDelay(150 * startDelayFactor); return true; } public void hideTabBar() { hsv.setVisibility(PreferencesHelper.enableAppDrawerTabs ? View.INVISIBLE : View.GONE); } private void addTabBar(boolean alignBottom) { FrameLayout contents = (FrameLayout) getObjectField(allAppsCountainerView, "mRevealView"); XGELSTabHost = (RelativeLayout) inflater.inflate(R.layout.tab_host, allAppsCountainerView, false); tabsContainer = (RelativeLayout) XGELSTabHost.findViewById(R.id.tabscontainer); hsv = (HorizontalScrollView) XGELSTabHost.findViewById(R.id.horizontalScrollView); XGELSTabHost.setTranslationY(tabTranslationY); ViewGroup parent = (ViewGroup) contents.getParent(); parent.removeView(contents); ((ViewGroup) XGELSTabHost.findViewById(R.id.appdrawer_contents)).addView(contents); hsv.bringToFront(); contents.setLayoutDirection(XGELSContext.getResources().getConfiguration().getLayoutDirection()); tabsContainer.setLayoutDirection(XGELSContext.getResources().getConfiguration().getLayoutDirection()); addButton = (ImageView) XGELSTabHost.findViewById(R.id.addbutton); addButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (checkPremium()) { setupTabSettings(null); } else { Utils.showPremiumOnly(); } } }); addButton.setTranslationY(hsv.getHeight() * 1.5f); allAppsCountainerView.addView(XGELSTabHost, 1); } public void initTabs() { this.tabs = new ArrayList<>(); if (PreferencesHelper.enableAppDrawerTabs) { for (String item : PreferencesHelper.appdrawerTabData) { tabs.add(new Tab(item, false)); } } if (getTabById(Tab.APPS_ID) == null) { String appsTabName; int id = Common.LAUNCHER_CONTEXT.getResources().getIdentifier("all_apps_button_label", "string", Common.HOOKED_PACKAGE); if (id != 0) { appsTabName = Common.LAUNCHER_CONTEXT.getResources().getString(id); } else { appsTabName = "Apps"; } Tab apps = new Tab("idx=" + 0 + "|id=" + Tab.APPS_ID + "|contenttype=" + ContentType.Applications + "|title=" + appsTabName + "|hide=" + false, false); if (!PreferencesHelper.enableAppDrawerTabs) { apps.setColor(PreferencesHelper.appdrawerFolderStyleBackgroundColor); } tabs.add(0, apps); } syncIndexes(); } 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); } currentTabId = tabs.get(0).getLayoutId(); organizeTabs(); } public void addTab(Tab tab, boolean focusTab, boolean showToast) { tabs.add(tab); addTabInternal(tab, focusTab); if (showToast) { Toast.makeText(allAppsCountainerView.getContext(), XGELSContext.getString(R.string.toast_appdrawer_tabadded_title), Toast.LENGTH_LONG).show(); Toast.makeText(allAppsCountainerView.getContext(), XGELSContext.getString(R.string.toast_appdrawer_tabadded_title), Toast.LENGTH_LONG).show(); } } public void addTab(Tab tab) { addTab(tab, true, true); } private void addTabInternal(final Tab tab, boolean focus) { if (DEBUG) log("Add tab " + tab.toString()); TextView tabView = (TextView) inflater.inflate(R.layout.tab_layout, null, false); tabView.setId(tab.getLayoutId()); tabView.setText(tab.getTitle()); tabView.setTag(tab); tabView.setContentDescription(tab.getTitle()); tabView.setOnLongClickListener(this); tabView.setOnClickListener(this); if (false) {// && PreferencesHelper.moveTabHostBottom) { tabView.setBackground(tabView.getContext().getResources().getDrawable(R.drawable.tab_indicator_background_bottom)); } if (Common.PACKAGE_OBFUSCATED && Common.GNL_VERSION >= ObfuscationHelper.GNL_4_0_26 && Color.alpha(tab.getPrimaryColor()) == 0) { tabView.setBackground(tabView.getContext().getResources().getDrawable(R.drawable.tab_indicator)); } tabView.getBackground().setColorFilter(tab.getPrimaryColor(), PorterDuff.Mode.MULTIPLY); tabView.setTextColor(tab.getContrastColor()); tabView.setTranslationY(hsv.getHeight() * 1.5f); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.MATCH_PARENT); if (tab.getIndex() != 0) { params.addRule(RelativeLayout.RIGHT_OF, tabs.get(tab.getIndex() - 1).getLayoutId()); params.setMargins(-Utils.dpToPx(25), 0, 0, 0); tabView.setLayoutParams(params); hsv.requestLayout(); } tabsContainer.addView(tabView); if (focus) { setCurrentTab(tab); scroll(); animateShowTab(tabView, 0); } } @Override public void removeTab(Tab tab) { tabsContainer.removeAllViews(); if (tabs.contains(tab)) { tabs.remove(tab); onTabsDataChanged(); } addTabs(false); int newId = tab.getIndex() - 1; setCurrentTab(newId < 0 ? tabs.get(0) : tabs.get(newId)); if (tab.hideFromAppsPage()) { ArrayList allApps = FolderHelper.getInstance().getAllApps(); allApps.addAll(tab.getData()); callMethod(Common.APP_DRAWER_INSTANCE, Methods.acpvSetApps, allApps); } scroll(); } public void renameTab(long tabId, String tabName) { TextView tabView = (TextView) tabsContainer.findViewById((int) tabId); if (tabView == null) return; ((Tab) tabView.getTag()).setTitle(tabName); tabView.setText(((Tab) tabView.getTag()).getTitle()); } public void moveTab(Tab tabToMove, int direction) { int newIdx = tabToMove.getIndex() + direction; if (newIdx == -1 || newIdx == tabsContainer.getChildCount()) 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(); tabsContainer.removeAllViews(); addTabs(false); setCurrentTab(tabToMove.getLayoutId()); Intent intent = getBaseIntent(false, tabToMove.getId(), null); Common.LAUNCHER_CONTEXT.startActivity(intent); } @Override public boolean handleScroll(float overscroll) { Tab tab = getCurrentTabData(); if (overscroll > 100.0) { int newIdx = tab.getIndex() + 1; setCurrentTab(newIdx >= tabs.size() ? tabs.get(0) : tabs.get(newIdx)); return true; } else if (overscroll < -100.0) { int newIdx = tab.getIndex() - 1; setCurrentTab(newIdx < 0 ? tabs.get(tabs.size() - 1) : tabs.get(newIdx)); return true; } return false; } @Override public void invalidate() { setCurrentTab(getCurrentTabData()); } @Override public void setTabColor(int color) { Tab tab = getCurrentTabData(); tab.setColor(color); tabsContainer.findViewById(currentTabId).getBackground().setColorFilter(color, PorterDuff.Mode.MULTIPLY); ((TextView) tabsContainer.findViewById(currentTabId)).setTextColor(Utils.getContrastColor(color)); addButton.setColorFilter(color, PorterDuff.Mode.MULTIPLY); setBackgroundColor(tab); } public void setBackgroundColor(Tab tab) { if (tab == null) return; Common.APP_DRAWER_INSTANCE.setBackgroundColor(PreferencesHelper.appdrawerBackgroundColor); int color = PreferencesHelper.enableAppDrawerTabs ? tab.getPrimaryColor() : PreferencesHelper.appdrawerFolderStyleBackgroundColor; String[] fields = {"mContainerView", "mRevealView"}; for (String field : fields) { InsetDrawable background = (InsetDrawable) ((View) getObjectField(Common.APP_DRAWER_INSTANCE, field)).getBackground(); background.setColorFilter(color, PorterDuff.Mode.MULTIPLY); } } public void setNextTab() { int tabIdx = getCurrentTabData().getIndex() + 1; setCurrentTab(tabs.get(tabIdx >= tabs.size() ? 0 : tabIdx)); } public void setPreviousTab() { int tabIdx = getCurrentTabData().getIndex() - 1; setCurrentTab(tabs.get(tabIdx < 0 ? 0 : tabIdx)); } public void setCurrentTab(Tab tab) { setCurrentTab(tab.getLayoutId()); } public void setCurrentTab(int layoutId) { setCurrentTab(layoutId, false); } public void setCurrentTab(int layoutId, boolean onlySetInternal) { currentTabId = layoutId; if (!PreferencesHelper.enableAppDrawerTabs) { loadTabApps(getTabById(Tab.APPS_ID)); return; } View tabView = tabsContainer.findViewById(layoutId); if (tabView == null) return; Tab tab = (Tab) tabView.getTag(); if (tab.isWidgetsTab()) { callMethod(Common.LAUNCHER_INSTANCE, "showWorkspace", -1, true, new Runnable() { @Override public void run() { new Handler().postDelayed(new Runnable() { @Override public void run() { callMethod(Common.LAUNCHER_INSTANCE, "showWidgetsView", true, !PreferencesHelper.appdrawerRememberLastPosition); } }, 500); } }); return; } tabView.bringToFront(); setTabColor(tabs.get(tab.getIndex()).getPrimaryColor()); if (onlySetInternal) { organizeTabs(); scroll(); return; } hsv.bringToFront(); organizeTabs(); scroll(); hsv.setTranslationX(0); loadTabApps(tab); TabHelperM.getInstance().setBackgroundColor(tab); } private void loadTabApps(Tab tab) { Object mApps = getObjectField(getAllAppsCountainerView(), "mApps"); HashMap mComponentToAppMap = (HashMap) getObjectField(mApps, "mComponentToAppMap"); mComponentToAppMap.clear(); tab.sort(); Iterator localIterator = tab.getData().iterator(); while (localIterator.hasNext()) { Object localAppInfo = localIterator.next(); mComponentToAppMap.put(callMethod(localAppInfo, "toComponentKey"), localAppInfo); } callMethod(mApps, "onAppsUpdated"); } @Override public void saveTabData() { Intent intent = getBaseIntent(false, 0, null); Common.LAUNCHER_CONTEXT.startActivity(intent); } private void onTabsDataChanged() { organizeTabs(); syncIndexes(); } private void organizeTabs() { Tab currTab = null; for (Tab tab : tabs) { if (tab.getLayoutId() == currentTabId) { currTab = tab; break; } } if (currTab != null) { for (int i = 0; i < currTab.getIndex(); i++) { Tab tab = tabs.get(i); View tabView = tabsContainer.findViewById(tab.getLayoutId()); tabView.setTranslationY(-inactiveTabTranslationX); tabView.setScaleX(0.95f); tabView.setScaleY(0.95f); tabView.getBackground().setColorFilter(tab.getSecondaryColor(), PorterDuff.Mode.MULTIPLY); tabView.bringToFront(); } for (int i = tabs.size() - 1; i > currTab.getIndex(); i--) { Tab tab = tabs.get(i); View tabView = tabsContainer.findViewById(tab.getLayoutId()); tabView.setTranslationY(-inactiveTabTranslationX); tabView.setScaleX(0.95f); tabView.setScaleY(0.95f); tabView.getBackground().setColorFilter(tab.getSecondaryColor(), PorterDuff.Mode.MULTIPLY); tabView.bringToFront(); } View tabView = tabsContainer.findViewById(currTab.getLayoutId()); tabView.setTranslationY(0f); tabView.setScaleX(1f); tabView.setScaleY(1f); tabView.getBackground().setColorFilter(currTab.getPrimaryColor(), PorterDuff.Mode.MULTIPLY); tabView.bringToFront(); } } 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++); } } public void scroll() { if (tabsContainer == null) return; new Handler().post(new Runnable() { @Override public void run() { View tab = tabsContainer.findViewById(currentTabId); if (tab != null) { hsv.smoothScrollTo((tab.getLeft() + tab.getWidth() / 2) - (hsv.getWidth() / 2), 0); } } }); } @Override 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) { Tab tab = (Tab) v.getTag(); setCurrentTab(tab); } @Override public boolean onLongClick(View v) { if (checkPremium()) { Tab tab = (Tab) v.getTag(); setCurrentTab(tab); setupTabSettings(tab); return true; } Utils.showPremiumOnly(); return false; } @Override public Tab getCurrentTabData() { if (!PreferencesHelper.enableAppDrawerTabs) return getTabById(Tab.APPS_ID); View curTab = tabsContainer.findViewById(currentTabId); return curTab == null ? getTabById(Tab.APPS_ID) : (Tab) curTab.getTag(); } @Override public ArrayList<String> getAppsToHide() { ArrayList apps = new ArrayList(); for (Tab tab : tabs) { if (tab.hideFromAppsPage()) { apps.addAll(tab.getRawData()); } } return apps; } 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, AlertDialog.THEME_DEVICE_DEFAULT_DARK).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.getLayoutId(), 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()) { 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); Utils.saveToSettings(Common.LAUNCHER_CONTEXT, "hideiconpacks", isChecked); TabHelper.getInstance().getTabById(Tab.APPS_ID).update(); } }); } 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) { AppDrawerItem.SortType sortType = AppDrawerItem.SortType.valueOf(sortTypes.get(position)); if (tab.getSortType().equals(sortType)) return; tab.setSortType(sortType); 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, allAppsCountainerView.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()]); int tabindex = tabsContainer.getChildCount(); if (spinner.getSelectedItemPosition() != 0) { final Tab tab = new Tab( "idx=" + tabindex + "|id=" + itemId + "|contenttype=" + contentType + "|title=" + newTabName + "|hide=" + false + "|color=" + Utils.getRandomColor() , false); if (spinner.getSelectedItemPosition() == 1) { tab.setColor(Color.parseColor("#263238")); // Blue Grey 900 callMethod(Common.LAUNCHER_INSTANCE, "showWorkspace", -1, true, new Runnable() { @Override public void run() { TabHelperM.getInstance().addTab(tab, false, false); Intent saveIntent = getBaseIntent(tab.isUserTab(), tab.getId(), tab.getTitle()); saveIntent.putExtra("contenttype", tab.getContentType().toString()); saveIntent.putExtra("new", true); saveIntent.putExtra("index", tab.getIndex()); Common.LAUNCHER_CONTEXT.startActivity(saveIntent); new Handler().postDelayed(new Runnable() { @Override public void run() { callMethod(Common.LAUNCHER_INSTANCE, "showWidgetsView", true, !PreferencesHelper.appdrawerRememberLastPosition); } }, 500); } }); } else { tab.initData(true); } } else { Intent intent = getBaseIntent(contentType == ContentType.User, itemId, newTabName); intent.putExtra("contenttype", contentType.toString()); intent.putExtra("new", true); intent.putExtra("index", tabindex); Common.LAUNCHER_CONTEXT.startActivity(intent); } } }); tabSettingsDialog.setButton(DialogInterface.BUTTON_NEGATIVE, allAppsCountainerView.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() { if (appNameComparator == null) { appNameComparator = newInstance(Classes.AppNameComparator, Common.LAUNCHER_CONTEXT); } return (Comparator) getObjectField(appNameComparator, "mAppInfoComparator"); } public HorizontalScrollView getTabHost() { return hsv; } }