Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d0a266c3 authored by Joshua Trask's avatar Joshua Trask
Browse files

Strip resources held by ResolverRankerService CB

ayepin@ already fixed this in IntentResolver as part of ag/26445398;
this CL just ports the relevant parts of that fix back to framework
Resolver. aosp/3737309 indicates that the unnecessarily-retained
resources were responsible for application footprints growing to
as much as 500MB.

Bug: 328084479
Test: ResolverActivityTest
Flag: EXEMPT bug fix
Change-Id: I21654b4989992659f26ab93a2ba54691f03aa857
parent 8c87b0f9
Loading
Loading
Loading
Loading
+29 −14
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.ResolveInfo;
import android.metrics.LogMaker;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.RemoteException;
@@ -46,6 +47,7 @@ import com.android.internal.logging.nano.MetricsProto.MetricsEvent;

import com.google.android.collect.Lists;

import java.lang.ref.WeakReference;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Comparator;
@@ -372,20 +374,7 @@ class ResolverRankerServiceResolverComparator extends AbstractResolverComparator
        }

        public final IResolverRankerResult resolverRankerResult =
                new IResolverRankerResult.Stub() {
            @Override
            public void sendResult(List<ResolverTarget> targets) throws RemoteException {
                if (DEBUG) {
                    Log.d(TAG, "Sending Result back to Resolver: " + targets);
                }
                synchronized (mLock) {
                    final Message msg = Message.obtain();
                    msg.what = RANKER_SERVICE_RESULT;
                    msg.obj = targets;
                    mHandler.sendMessage(msg);
                }
            }
        };
                new ResolverRankerResultCallback(mLock, mHandler);

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
@@ -417,6 +406,32 @@ class ResolverRankerServiceResolverComparator extends AbstractResolverComparator
        }
    }

    private static class ResolverRankerResultCallback extends IResolverRankerResult.Stub {
        private final Object mLock;
        private final WeakReference<Handler> mHandlerRef;

        private ResolverRankerResultCallback(Object lock, Handler handler) {
            mLock = lock;
            mHandlerRef = new WeakReference<>(handler);
        }

        @Override
        public void sendResult(List<ResolverTarget> targets) throws RemoteException {
            if (DEBUG) {
                Log.d(TAG, "Sending Result back to Resolver: " + targets);
            }
            synchronized (mLock) {
                final Message msg = Message.obtain();
                msg.what = RANKER_SERVICE_RESULT;
                msg.obj = targets;
                Handler handler = mHandlerRef.get();
                if (handler != null) {
                    handler.sendMessage(msg);
                }
            }
        }
    }

    @Override
    void beforeCompute() {
        super.beforeCompute();