package no.finn.android.ui.objectpage; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import android.content.Context; import android.content.Intent; import android.support.v7.internal.widget.ActivityChooserModel; import android.widget.ShareActionProvider; public class SharedActionProviderMemoryLeakHack { private static Class activityChooserModel = null; private static Method activityChooserGetMethod = null; public static void fix(Context context, ShareActionProvider actionProvider) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { actionProvider.setOnShareTargetSelectedListener(new ShareActionProvider.OnShareTargetSelectedListener() { @Override public boolean onShareTargetSelected(ShareActionProvider source, Intent intent) { return false; } }); ActivityChooserModel dataModel = ActivityChooserModel.get(context, ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME); dataModel.setOnChooseActivityListener(new ActivityChooserModel.OnChooseActivityListener() { @Override public boolean onChooseActivity(ActivityChooserModel host, Intent intent) { return false; } }); fixInternalClass(context); } private static void fixInternalClass(Context context) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException { /* Android 5.x seems to use the internal activityChooserModel */ if (activityChooserGetMethod == null) { activityChooserModel = Class.forName("android.widget.ActivityChooserModel"); activityChooserGetMethod = activityChooserModel.getMethod("get", new Class[]{Context.class, String.class}); } Object activityChooserObject = activityChooserGetMethod.invoke(null, new Object[]{context, ShareActionProvider.DEFAULT_SHARE_HISTORY_FILE_NAME}); for (Method method : activityChooserModel.getMethods()) { if (method.getName().equals("setOnChooseActivityListener")) { method.invoke(activityChooserObject, new Object[]{null}); break; } } } }