From 58595fccfeba4d7f4f2280a3eddf74b0db7b9501 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Fri, 3 Mar 2017 12:26:33 +0100 Subject: [PATCH] show icons in pop menu with reflection. imagespan was not centred vertically --- .../ui/ConversationActivity.java | 27 +++---------------- .../siacs/conversations/utils/UIHelper.java | 18 +++++++++++++ 2 files changed, 22 insertions(+), 23 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java index 0795c13f7..04af80c95 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java @@ -7,13 +7,11 @@ import android.app.FragmentTransaction; import android.app.PendingIntent; import android.content.ActivityNotFoundException; import android.content.ClipData; -import android.content.Context; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.IntentSender.SendIntentException; import android.content.pm.PackageManager; -import android.graphics.drawable.Drawable; import android.net.Uri; import android.os.Build; import android.os.Bundle; @@ -22,8 +20,6 @@ import android.provider.MediaStore; import android.provider.Settings; import android.support.v4.widget.SlidingPaneLayout; import android.support.v4.widget.SlidingPaneLayout.PanelSlideListener; -import android.text.SpannableStringBuilder; -import android.text.style.ImageSpan; import android.util.Log; import android.util.Pair; import android.view.Gravity; @@ -44,6 +40,8 @@ import net.java.otr4j.session.SessionStatus; import org.openintents.openpgp.util.OpenPgpApi; +import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Iterator; import java.util.List; @@ -68,6 +66,7 @@ import eu.siacs.conversations.services.XmppConnectionService.OnConversationUpdat import eu.siacs.conversations.services.XmppConnectionService.OnRosterUpdate; import eu.siacs.conversations.ui.adapter.ConversationAdapter; import eu.siacs.conversations.utils.ExceptionHelper; +import eu.siacs.conversations.utils.UIHelper; import eu.siacs.conversations.xmpp.OnUpdateBlocklist; import eu.siacs.conversations.xmpp.XmppConnection; import eu.siacs.conversations.xmpp.jid.InvalidJidException; @@ -779,24 +778,6 @@ public class ConversationActivity extends XmppActivity builder.create().show(); } - /** - * Moves icons from the PopupMenu's MenuItems' icon fields into the menu title as a Spannable with the icon and title text. - */ - public static void insertMenuItemIcons(Context context, PopupMenu popupMenu) { - Menu menu = popupMenu.getMenu(); - for (int i = 0; i < menu.size(); i++) { - MenuItem menuItem = menu.getItem(i); - Drawable icon = menuItem.getIcon(); - int iconSize = context.getResources().getDimensionPixelSize(R.dimen.menu_item_icon_size); - icon.setBounds(0, 0, iconSize, iconSize); - ImageSpan imageSpan = new ImageSpan(icon); - SpannableStringBuilder ssb = new SpannableStringBuilder(" " + menuItem.getTitle()); - ssb.setSpan(imageSpan, 0, 1, 0); - menuItem.setTitle(ssb); - menuItem.setIcon(null); - } - } - protected void attachFileDialog() { View menuAttachFile = findViewById(R.id.action_attach_file); if (menuAttachFile == null) { @@ -834,7 +815,7 @@ public class ConversationActivity extends XmppActivity return false; } }); - insertMenuItemIcons(getApplicationContext(), attachFilePopup); + UIHelper.showIconsInPopup(attachFilePopup); attachFilePopup.show(); } diff --git a/src/main/java/eu/siacs/conversations/utils/UIHelper.java b/src/main/java/eu/siacs/conversations/utils/UIHelper.java index c9f50bed7..773fd11d8 100644 --- a/src/main/java/eu/siacs/conversations/utils/UIHelper.java +++ b/src/main/java/eu/siacs/conversations/utils/UIHelper.java @@ -4,7 +4,10 @@ import android.content.Context; import android.text.format.DateFormat; import android.text.format.DateUtils; import android.util.Pair; +import android.widget.PopupMenu; +import java.lang.reflect.Field; +import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; @@ -364,4 +367,19 @@ public class UIHelper { return type; } } + + public static boolean showIconsInPopup(PopupMenu attachFilePopup) { + try { + Field field = attachFilePopup.getClass().getDeclaredField("mPopup"); + field.setAccessible(true); + Object menuPopupHelper = field.get(attachFilePopup); + Class cls = Class.forName("com.android.internal.view.menu.MenuPopupHelper"); + Method method = cls.getDeclaredMethod("setForceShowIcon", new Class[]{boolean.class}); + method.setAccessible(true); + method.invoke(menuPopupHelper, new Object[]{true}); + return true; + } catch (Exception e) { + return false; + } + } }