package com.quaap.launchtime.ui; /* * Copyright (C) 2017 Tom Kliethermes * * This file is part of LaunchTime and is is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as published by the * Free Software Foundation; either version 3 of the License, or (at your option) any * later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. */ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.LauncherApps; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.content.pm.ShortcutInfo; import android.graphics.Color; import android.graphics.Point; import android.graphics.drawable.Drawable; import android.os.Build; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.content.ContextCompat; import android.util.DisplayMetrics; import android.util.Log; import android.util.TypedValue; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.PopupWindow; import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; import com.quaap.launchtime.GlobState; import com.quaap.launchtime.MainActivity; import com.quaap.launchtime.R; import com.quaap.launchtime.apps.AppLauncher; import com.quaap.launchtime.components.Categories; import com.quaap.launchtime.widgets.Widget; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; public class ActionMenu { private static final String TAG = "ActionMenu"; private final MainActivity mMain; private boolean mUseActionMenus = false; private boolean mDevModeActivities = true; private boolean mUseDropZones = true; private boolean mUseExtraActions = false; private PopupWindow mAppinfoWindow; private final ScrollView mShortcutActionsPopup; private final LinearLayout mShortcutActionsList; private final Style mStyle; private int mAnimationDuration = 100; private int mOldNum = 0; private ViewGroup mIconBar = null; private final boolean mUseIcons = true; private Point mScreenDim; private final int mIconW; public ActionMenu(MainActivity main) { mMain = main; mShortcutActionsPopup = mMain.findViewById(R.id.action_menu); mShortcutActionsList = mMain.findViewById(R.id.action_menu_items); mStyle = GlobState.getStyle(mMain); mScreenDim = mMain.getScreenDimensions(); readActionMenuConfig(); mIconW = mMain.getResources().getDimensionPixelSize(R.dimen.action_icon_width); } public void readActionMenuConfig() { mUseDropZones = true; mUseExtraActions = false; mDevModeActivities = false; mUseActionMenus = mMain.mAppPreferences.getBoolean(mMain.getString(R.string.pref_key_show_action_menus), Build.VERSION.SDK_INT >= 25); if (mUseActionMenus) { mUseExtraActions = mMain.mAppPreferences.getBoolean(mMain.getString(R.string.pref_key_show_action_extra), Build.VERSION.SDK_INT >= 25); mDevModeActivities = mMain.mAppPreferences.getBoolean(mMain.getString(R.string.pref_key_show_action_activities), false); if (mUseExtraActions) { mUseDropZones = mMain.mAppPreferences.getBoolean(mMain.getString(R.string.pref_key_show_dropzones), false); } } } public void setAnimationDuration(int animationDuration) { mAnimationDuration = animationDuration; } public boolean useActionMenus() { return mUseActionMenus; } public boolean useDropZones() { return mUseDropZones; } public boolean useExtraActions() { return mUseExtraActions; } public boolean displayActionShortcuts(final View view, final AppLauncher appitem) { //Log.d(TAG, appitem.getPackageName() + " " + appitem.getBaseComponentName()); List<ShortcutInfo> shortcutInfos = getOreoShortcutInfos(appitem); try { initializeActionMenu(); if (appitem.isWidget()) { addWidgetActionsToMenu(appitem); } if (!appitem.isWidget()) { addActionMenuItem(appitem.getLabel(), appitem.getIconDrawable(), new Runnable() { @Override public void run() { mMain.launchApp(appitem); mMain.showButtonBar(false, true); } }); } addOreoShortcutsToMenu(shortcutInfos); addDevModeActivitiesToMenu(appitem); // addWidgetsToMenu(view, appitem); addExtraActionsToMenu(view, appitem); addCancelToMenu(); showBuiltActionMenu(view); return true; } catch (Exception e) { Log.e(TAG, "Couldn't create menu", e); } return false; } private void addWidgetActionsToMenu(final AppLauncher appitem) { addActionMenuItem(mMain.getString(R.string.resize), android.R.drawable.arrow_up_float, new Runnable() { @Override public void run() { mMain.showWidgetResize(appitem); mMain.showButtonBar(false, true); } }); final Widget wh = GlobState.getWidgetHelper(mMain); if (wh.getConfigure(appitem.getComponentName())!=null) { addActionMenuItem(mMain.getString(R.string.configure_widget), android.R.drawable.ic_menu_preferences, new Runnable() { @Override public void run() { try { wh.configureWidget(mMain, appitem.getComponentName()); mMain.showButtonBar(false, true); } catch (Throwable t) { Log.e(TAG, "Couldn't add configure", t); } } }); } } private void addCancelToMenu() { addActionMenuItem(mMain.getString(android.R.string.cancel), android.R.drawable.ic_menu_close_clear_cancel, mUseIcons && mIconBar!=null, new Runnable() { @Override public void run() { dismissActionPopup(); } }); } public void showCatagoryActionMenu(TextView categoryTab) { initializeActionMenu(); addExtraActionsToMenu(categoryTab); addCancelToMenu(); showBuiltActionMenu(categoryTab); } private int mItemBGColor; private void initializeActionMenu() { mScreenDim = mMain.getScreenDimensions(); mShortcutActionsList.removeAllViews(); mItemBGColor = mStyle.getCattabBackground(); int textcolor = mStyle.getCattabTextColor(); int bgcolor = mStyle.getCalculatedWallpaperColor(); if (Color.alpha(bgcolor) > 90) { int red = Color.red(bgcolor); int green = Color.green(bgcolor); int blue = Color.blue(bgcolor); int alpha = 200; if (Color.alpha(mItemBGColor)<120) alpha = 235; bgcolor = Color.argb(alpha, red, green, blue); } else { bgcolor = Color.argb(235, 128, 128, 128); mItemBGColor = Color.argb(240, 255-Color.red(textcolor), 255-Color.green(textcolor), 255-Color.blue(textcolor)); } int red = Color.red(bgcolor); int green = Color.green(bgcolor); int blue = Color.blue(bgcolor); bgcolor = Color.argb(220, red<200?red+10:red, green<200?green+10:green, blue<200?blue+20:blue); mShortcutActionsPopup.setBackgroundColor(bgcolor); if (mStyle.isRoundedTabs()) { mShortcutActionsPopup.setBackground(mStyle.getBgDrawableFor(mShortcutActionsPopup, bgcolor)); } mIconBar = null; } private void showBuiltActionMenu(View view) { //mShortcutActionsPopup.setVisibility(View.VISIBLE); //FrameLayout.LayoutParams lp = (FrameLayout.LayoutParams)mShortcutActionsPopup.getLayoutParams(); int width = (int)(mMain.getResources().getDimension(R.dimen.action_menu_width) * 1.1); int height = (int)(mShortcutActionsList.getChildCount() * (mMain.getResources().getDimension(R.dimen.action_icon_width)*1.4 + 28)) + 28; int [] viewpos = new int[2]; view.getLocationOnScreen(viewpos); boolean islefthand = mStyle.isLeftHandCategories(); //try to put it above and centered-ish. int top = viewpos[1] - height - 20; int left = viewpos[0] + view.getWidth()/2 - width/2; //if too high, push to side if (top <= 0) { top = viewpos[1] + view.getHeight()/2 - height/2; if (top<=0) { top = 10; } if (islefthand) { if (mScreenDim.x - (viewpos[0] + view.getWidth()) > width || viewpos[0] - width < 0 || view.getWidth()>mScreenDim.x/2) { left = viewpos[0] + view.getWidth(); } else { left = viewpos[0] - width; } } else { if (viewpos[0]+view.getWidth()/3 > width || viewpos[0] + view.getWidth()+width>mScreenDim.x || view.getWidth()>mScreenDim.x/2) { left = viewpos[0] - width; } else { left = viewpos[0] + view.getWidth(); } } } // // if (top+height>=mScreenDim.y) { // top = mScreenDim.y - height - 10; // if (left>mScreenDim.x/2) { // left = viewpos[0] - width; // } else if (left<mScreenDim.x/2) { // left = viewpos[0] + view.getWidth(); // } // } // FrameLayout.LayoutParams flp = (FrameLayout.LayoutParams)mShortcutActionsPopup.getLayoutParams(); if (height>=mScreenDim.y-top) { flp.height = mScreenDim.y-100; } else { flp.height = ViewGroup.LayoutParams.WRAP_CONTENT; } mShortcutActionsPopup.setLayoutParams(flp); if (left <= 0) { left = 10; } else if (left + width >= mScreenDim.x) { left = mScreenDim.x - (int)(width*1.1); } if (mShortcutActionsPopup.getVisibility()!=View.VISIBLE) { mShortcutActionsPopup.setX(left); mShortcutActionsPopup.setY(viewpos[1]); mShortcutActionsPopup.setScaleY(0f); mShortcutActionsPopup.setAlpha(0f); } //mShortcutActionsPopup.setTop(0); //mShortcutActionsPopup.setLeft(0); mShortcutActionsPopup.setVisibility(View.VISIBLE); if (mAnimationDuration>0) { mShortcutActionsPopup.animate() .x(left) .y(top) .alpha(1) .scaleY(1) .setDuration(mAnimationDuration) .setListener(null) .start(); } else { mShortcutActionsPopup.setX(left); mShortcutActionsPopup.setY(top); mShortcutActionsPopup.setAlpha(1f); mShortcutActionsPopup.setScaleY(1f); } mOldNum = mShortcutActionsList.getChildCount(); // if (mIconBar != null) { // int count = mIconBar.getChildCount(); // if (count>3) { // LinearLayout.LayoutParams ilp = (LinearLayout.LayoutParams)mIconBar.getChildAt(0).getLayoutParams(); // ilp.weight=.1f; // mIconBar.getChildAt(0).setLayoutParams(ilp); // // LinearLayout.LayoutParams ilp2 = (LinearLayout.LayoutParams)mIconBar.getChildAt(count-1).getLayoutParams(); // ilp2.weight=.1f; // mIconBar.getChildAt(count-1).setLayoutParams(ilp2); // // // } // } } public void dismissActionPopup() { if (mAnimationDuration>0) { mShortcutActionsPopup.animate() //.yBy(-mShortcutActionsPopup.getHeight()) .scaleY(0) .alpha(0) .setDuration(mAnimationDuration) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationCancel(Animator animation) { mShortcutActionsPopup.setVisibility(View.GONE); } @Override public void onAnimationEnd(Animator animation) { mShortcutActionsPopup.setVisibility(View.GONE); } }); } else { mShortcutActionsPopup.setVisibility(View.GONE); } // if (mShortcutActionsPopup!=null) { // //mShortcutActionsPopup.setVisibility(View.GONE); // mShortcutActionsPopup = null; // // } } private void addExtraActionsToMenu(final TextView categoryTab) { final String category = (String)categoryTab.getTag(); if (!mMain.getCurrentCategory().equals(category)) { addActionMenuItem(categoryTab.getText().toString(), android.R.drawable.ic_menu_compass, new Runnable() { @Override public void run() { mMain.switchCategory(category); } }); } if (mUseExtraActions) { addActionMenuItem(mMain.getString(R.string.add_category), android.R.drawable.ic_menu_add, new Runnable() { @Override public void run() { mMain.promptAddCategory(); } }); if (!Categories.isNoDropCategory((String) categoryTab.getTag())) { addActionMenuItem(mMain.getString(R.string.add_widgets), android.R.drawable.ic_input_add, new Runnable() { @Override public void run() { mMain.setupWidget(); } }); addActionMenuItem(mMain.getString(R.string.sort_category), android.R.drawable.ic_menu_sort_alphabetically, new Runnable() { @Override public void run() { mMain.promptSortCategory(category); } }); addActionMenuItem(mMain.getString(R.string.cat_recategorize), android.R.drawable.ic_menu_agenda, new Runnable() { @Override public void run() { mMain.promptRecategorize(category); } }); } if (!Categories.isHiddenCategory((String) categoryTab.getTag())) { int action = R.string.hide; if (mMain.db().isHiddenCategory(category)) action = R.string.show; addActionMenuItem(mMain.getString(action), android.R.drawable.ic_menu_view, new Runnable() { @Override public void run() { mMain.hideCategory(category); } }); } addActionMenuItem(mMain.getString(R.string.rename_category), android.R.drawable.ic_menu_edit, mUseIcons, new Runnable() { @Override public void run() { mMain.promptRenameCategory(category); } }); if (!Categories.isSpeacialCategory((String) categoryTab.getTag())) { addActionMenuItem(mMain.getString(R.string.remove), R.drawable.trash, mUseIcons, new Runnable() { @Override public void run() { mMain.promptDeleteCategory(category); } }); } } } // private void addWidgetsToMenu(final View view, final AppLauncher appitem) { // final Widget wh = GlobState.getWidgetHelper(mMain); // for (AppWidgetProviderInfo prov: wh.getWidgetsForPackage(appitem.getPackageName())) { // String label; // Drawable icon; // if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { // label = prov.loadLabel(mMain.getPackageManager()); // icon = prov.loadIcon(mMain, 0); // } else { // label = prov.label; // try { // icon = mMain.getPackageManager().getActivityIcon(appitem.getBaseComponentName()); // } catch (PackageManager.NameNotFoundException e) { // icon=null; // e.printStackTrace(); // } // } // // // // addActionMenuItem("W-" + label, icon, false, new Runnable() { // @Override // public void run() { // mMain.setupWidget(); // } // }); // } // } private void addExtraActionsToMenu(final View view, final AppLauncher appitem) { if (mUseExtraActions) { if (mMain.isOnQuickRow(view)) { addActionMenuItem(mMain.getString(R.string.remove), R.drawable.recycle, mUseIcons, new Runnable() { @Override public void run() { mMain.removeViewFromQuickBar(view); } }); } else if (mMain.getCurrentCategory().equals(Categories.CAT_SEARCH) && !mMain.isOnSearchView(view)) { addActionMenuItem(mMain.getString(R.string.remove), R.drawable.recycle, mUseIcons, new Runnable() { @Override public void run() { mMain.db().deleteAppLaunchedRecord(appitem.getComponentName()); mMain.populateRecentApps(); } }); } else if (appitem.isNormalApp()) { addActionMenuItem(mMain.getString(R.string.uninstall_app), R.drawable.trash, new Runnable() { @Override public void run() { mMain.launchUninstallIntent(appitem, view); } }); if (!Categories.isNoDropCategory(mMain.getCurrentCategory())) { addActionMenuItem(mMain.getString(R.string.link), R.drawable.link, mUseIcons, new Runnable() { @Override public void run() { mMain.makeAppLink(appitem); } }); } } else { addActionMenuItem(mMain.getString(R.string.remove), R.drawable.recycle, mUseIcons, new Runnable() { @Override public void run() { mMain.removeAppFromIconSheet(appitem); } }); } } addActionMenuItem(mMain.getString(R.string.appinfo_label), android.R.drawable.ic_menu_info_details, mUseIcons, new Runnable() { @Override public void run() { mAppinfoWindow = AppInfo.showAppinfo(mMain, view, appitem); mAppinfoWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { @Override public void onDismiss() { dismissAppinfo(); } }); } }); } private void addDevModeActivitiesToMenu(AppLauncher appitem) { if (mDevModeActivities) { class Record implements Comparable<Record>{ private String label; private ComponentName component; private Drawable icon; @Override public int compareTo(@NonNull Record other) { return this.label.compareTo(other.label); } } List<Record> activityItems = new ArrayList<>(); try { Intent intent = new Intent(Intent.ACTION_MAIN, null); intent.setPackage(appitem.getPackageName()); //intent.addCategory(Intent.CATEGORY_DEFAULT); final List<ResolveInfo> activities = mMain.getPackageManager().queryIntentActivities(intent, PackageManager.GET_META_DATA | PackageManager.GET_RESOLVED_FILTER); //ActivityInfo[] list = getPackageManager().getPackageInfo(appitem.getPackageName(), PackageManager.GET_ACTIVITIES).activities; List<String> names = new ArrayList<>(); names.add(appitem.getLabel()); List<String> bannedActivities = Arrays.asList( "com.android.settings.BandMode", "com.android.settings.sim.SimDialogActivity", "com.android.settings.FallbackHome" ); for (ResolveInfo ri : activities) { try { if (ri == null || ri.activityInfo == null || !ri.activityInfo.enabled || !ri.activityInfo.exported) { continue; } if (ri.activityInfo.name.equals(appitem.getActivityName())) continue; if (ri.activityInfo.permission != null && ContextCompat.checkSelfPermission(mMain.getApplicationContext(), ri.activityInfo.permission) == PackageManager.PERMISSION_DENIED) { continue; } if (bannedActivities.contains(ri.activityInfo.name)) continue; CharSequence label = ri.activityInfo.loadLabel(mMain.getPackageManager()); ComponentName cn = new ComponentName(ri.activityInfo.packageName, ri.activityInfo.name); //Log.d(TAG, label + " " + ri.activityInfo.packageName + " " + ri.activityInfo.name + " " + ri.activityInfo.permission); if (label.toString().trim().equals("") || names.contains(label.toString().trim())) { label = ri.activityInfo.name .replaceAll("^.*[.$]|Activity", "") .replaceAll("(\\P{Lu})(\\p{Lu})", "$1 $2"); } names.add(label.toString().trim()); label = "{" + label + "}"; // IntentFilter fi = ri.filter; // if (fi != null) { // for (Iterator<String> it = fi.actionsIterator(); it != null && it.hasNext(); ) { // Log.d(TAG, " action: " + it.next()); // } // for (Iterator<String> it = fi.categoriesIterator(); it != null && it.hasNext(); ) { // Log.d(TAG, " cat: " + it.next()); // } // for (Iterator<String> it = fi.schemesIterator(); it != null && it.hasNext(); ) { // Log.d(TAG, " scheme: " + it.next()); // } // // } Record item = new Record(); item.label = label.toString(); item.component = cn; item.icon = ri.activityInfo.loadIcon(mMain.getPackageManager()); activityItems.add(item); } catch (Exception e) { Log.e(TAG, e.getMessage(), e); Toast.makeText(mMain, "Error: " + e.getLocalizedMessage(), Toast.LENGTH_LONG).show(); } } Collections.sort(activityItems); for (Record item: activityItems) { final Intent launchIntent = new Intent(Intent.ACTION_MAIN); launchIntent.setComponent(item.component); addActionMenuItem(item.label, item.icon, new Runnable() { @Override public void run() { try { mMain.startActivity(launchIntent); } catch (Exception e) { Log.e(TAG, e.getMessage(), e); Toast.makeText(mMain, "Error: " + e.getLocalizedMessage(), Toast.LENGTH_LONG).show(); } } }); } } catch (Exception e) { Log.e(TAG, "Couldn't query activities", e); } } } private void addOreoShortcutsToMenu(List<ShortcutInfo> shortcutInfos) { if (Build.VERSION.SDK_INT >= 25) { if (shortcutInfos != null && shortcutInfos.size()>0) { final LauncherApps launcherApps = mMain.getSystemService(LauncherApps.class); if (launcherApps == null) return; sortShorcutsByRank(shortcutInfos); for (final ShortcutInfo shortcutInfo : shortcutInfos) { if (shortcutInfo.isDynamic()) { addShortcutToActionPopup(launcherApps, shortcutInfo); } } for (final ShortcutInfo shortcutInfo : shortcutInfos) { if (shortcutInfo.isDeclaredInManifest()) { addShortcutToActionPopup(launcherApps, shortcutInfo); } } } } } private void sortShorcutsByRank(List<ShortcutInfo> shortcutInfos) { Collections.sort(shortcutInfos, new Comparator<ShortcutInfo>() { @Override public int compare(ShortcutInfo a, ShortcutInfo b) { if (Build.VERSION.SDK_INT >= 25) { return Integer.compare(a.getRank(), b.getRank()); } return 0; } }); } @Nullable private List<ShortcutInfo> getOreoShortcutInfos(AppLauncher appitem) { List<ShortcutInfo> shortcutInfos = null; if (Build.VERSION.SDK_INT>=25) { final LauncherApps launcherApps = (LauncherApps) mMain.getSystemService(Context.LAUNCHER_APPS_SERVICE); if (launcherApps!=null && launcherApps.hasShortcutHostPermission()) { try { LauncherApps.ShortcutQuery q = new LauncherApps.ShortcutQuery(); q.setQueryFlags(LauncherApps.ShortcutQuery.FLAG_MATCH_DYNAMIC | LauncherApps.ShortcutQuery.FLAG_MATCH_MANIFEST); if (appitem.isShortcut()) { Intent launchIntent = Intent.parseUri(appitem.getLinkUri(), 0); q.setPackage(launchIntent.getPackage()); q.setActivity(launchIntent.getComponent()); } else if (appitem.isOreoShortcut()) { LauncherApps.ShortcutQuery query = new LauncherApps.ShortcutQuery(); query.setPackage(appitem.getPackageName()); query.setShortcutIds(Collections.singletonList(appitem.getLinkUri())); query.setQueryFlags(LauncherApps.ShortcutQuery.FLAG_MATCH_PINNED); List<ShortcutInfo> shortcuts = launcherApps.getShortcuts(query,android.os.Process.myUserHandle()); q.setPackage(appitem.getPackageName()); if (shortcuts!=null && shortcuts.size()>0) { q.setActivity(shortcuts.get(0).getActivity()); } } else { q.setPackage(appitem.getPackageName()); q.setActivity(appitem.getBaseComponentName()); } shortcutInfos = launcherApps.getShortcuts(q, android.os.Process.myUserHandle()); //Log.d(TAG, "Queried shortcuts"); } catch (Exception e) { Log.e(TAG, "Couldn't query shortcuts", e); } } } return shortcutInfos; } private void addActionMenuItem(String label, int iconResource, final Runnable action) { addActionMenuItem(label, mMain.getResources().getDrawable(iconResource), false, action); } private void addActionMenuItem(String label, int iconResource, boolean onIconBar, final Runnable action) { addActionMenuItem(label, mMain.getResources().getDrawable(iconResource), onIconBar, action); } private void addActionMenuItem(String label, Drawable icon, final Runnable action) { addActionMenuItem(label, icon, false, action); } private void addActionMenuItem(String label, Drawable icon, boolean onIconBar, final Runnable action) { final ViewGroup item; ImageView itemIcon; View.OnClickListener clickAction = new View.OnClickListener() { @Override public void onClick(View item) { action.run(); dismissActionPopup(); mMain.clearDragPotential(true); } }; if (onIconBar && mShortcutActionsList.getChildCount()>=2) { if (mIconBar == null) { mIconBar = new LinearLayout(mMain); initializeMenuline(mIconBar); } itemIcon = new ImageView(mMain); LinearLayout.LayoutParams iilp = new LinearLayout.LayoutParams(mIconW, mIconW, 1); // iilp.leftMargin = mIconW; // iilp.rightMargin = mIconW; itemIcon.setLayoutParams(iilp); itemIcon.setOnClickListener(clickAction); itemIcon.setImageDrawable(icon); mIconBar.addView(itemIcon); } else { if (label == null) return; label = label.replaceAll("\\s+|\\r|\\n", " "); item = (ViewGroup) LayoutInflater.from(mMain).inflate(R.layout.action_menu_entry, null); TextView itemText = item.findViewById(R.id.action_menu_text); // int oldbgc = mStyle.getCattabBackground(); // int shadowc = Color.BLACK; // if ((Color.red(oldbgc) + Color.green(oldbgc) + Color.blue(oldbgc)/3)<128) shadowc = Color.WHITE; // // itemText.setShadowLayer(4,1,1, shadowc); // // int alpha = Color.alpha(oldbgc); // if (alpha<128) alpha=128; // int newbgc = Color.argb(alpha, Color.red(oldbgc), Color.green(oldbgc), Color.blue(oldbgc)); //itemText.setTypeface(null, Typeface.BOLD); itemText.setTextColor(mStyle.getCattabTextColor()); itemText.setTextSize(TypedValue.COMPLEX_UNIT_SP, mStyle.getCategoryTabFontSize()-1); if (label.length()>30) label = label.substring(0,28) + "..."; itemText.setText(label); itemIcon = item.findViewById(R.id.action_menu_icon); itemIcon.setImageDrawable(icon); initializeMenuline(item); item.setOnClickListener(clickAction); } } private void initializeMenuline(final ViewGroup item) { item.setBackgroundColor(mItemBGColor); if (mStyle.isRoundedTabs()) { item.setBackground(mStyle.getBgDrawableFor(item, mItemBGColor)); } LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams((int)mMain.getResources().getDimension(R.dimen.action_menu_width), ViewGroup.LayoutParams.WRAP_CONTENT); lp.setMargins(12,13,12,13); item.setLayoutParams(lp); mShortcutActionsList.addView(item); if (mAnimationDuration>0) { if (mShortcutActionsList.getChildCount() > mOldNum) { item.setVisibility(View.GONE); } item.setScaleY(.1f); item.animate() .scaleY(1f) .setDuration(mAnimationDuration) .setStartDelay(mShortcutActionsList.getChildCount() * 10 + 10) .withStartAction(new Runnable() { @Override public void run() { item.setVisibility(View.VISIBLE); } }); } } private void addShortcutToActionPopup(final LauncherApps launcherApps, final ShortcutInfo shortcutInfo) { if (Build.VERSION.SDK_INT>=25) { if (shortcutInfo != null && shortcutInfo.getActivity() != null) { //Log.d(TAG, shortcutInfo.getShortLabel() + " " + shortcutInfo.getActivity().getClassName()); if (shortcutInfo.isEnabled()) { String label = ""; if (shortcutInfo.getShortLabel() != null) label += shortcutInfo.getShortLabel(); if (shortcutInfo.getLongLabel() != null && !label.contentEquals(shortcutInfo.getLongLabel())) label = shortcutInfo.getLongLabel() + ""; Drawable icon = launcherApps.getShortcutIconDrawable(shortcutInfo, DisplayMetrics.DENSITY_DEFAULT); addActionMenuItem(label.trim(), icon, new Runnable() { @Override public void run() { if (Build.VERSION.SDK_INT >= 25) { try { launcherApps.startShortcut(shortcutInfo, null, null); } catch (Exception e) { Log.e(TAG, "Couldn't Launch shortcut", e); } } dismissActionPopup(); } }); } } } } public void dismissAppinfo() { if (mAppinfoWindow!=null) { if (mAppinfoWindow.isShowing()) mAppinfoWindow.dismiss(); mAppinfoWindow = null; } } }