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

Commit e6f7daeb authored by George Mount's avatar George Mount
Browse files

Fix Loader bugs

Bug 32758881
Bug 34264461

When destroying the LoaderManager, the host was not being cleared.
The host was being leaked and this leaked the Activity.

When a LoaderManager is reused, for example with an orientation
change, the host was updated, but it wasn't started. This
adds a test for that case to ensure that when a reused
LoaderManager is loaded that it is properly started.

Test: Ib90f14e16083916a21a25ce87a4dd29ab9a33878
Change-Id: Id4c8afab5db0a78bbff376d597be294a6e3dbcba
parent 43d059bf
Loading
Loading
Loading
Loading
+5 −7
Original line number Original line Diff line number Diff line
@@ -308,13 +308,11 @@ public abstract class FragmentHostCallback<E> extends FragmentContainer {
            mAllLoaderManagers = new ArrayMap<String, LoaderManager>();
            mAllLoaderManagers = new ArrayMap<String, LoaderManager>();
        }
        }
        LoaderManagerImpl lm = (LoaderManagerImpl) mAllLoaderManagers.get(who);
        LoaderManagerImpl lm = (LoaderManagerImpl) mAllLoaderManagers.get(who);
        if (lm == null) {
        if (lm == null && create) {
            if (create) {
            lm = new LoaderManagerImpl(who, this, started);
            lm = new LoaderManagerImpl(who, this, started);
            mAllLoaderManagers.put(who, lm);
            mAllLoaderManagers.put(who, lm);
            }
        } else if (started && lm != null && !lm.mStarted){
        } else {
            lm.doStart();
            lm.updateHostController(this);
        }
        }
        return lm;
        return lm;
    }
    }
+8 −6
Original line number Original line Diff line number Diff line
@@ -1536,6 +1536,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate
            boolean loadersRunning = false;
            boolean loadersRunning = false;


            // Must add them in the proper order. mActive fragments may be out of order
            // Must add them in the proper order. mActive fragments may be out of order
            if (mAdded != null) {
                final int numAdded = mAdded.size();
                final int numAdded = mAdded.size();
                for (int i = 0; i < numAdded; i++) {
                for (int i = 0; i < numAdded; i++) {
                    Fragment f = mAdded.get(i);
                    Fragment f = mAdded.get(i);
@@ -1544,6 +1545,7 @@ final class FragmentManagerImpl extends FragmentManager implements LayoutInflate
                        loadersRunning |= f.mLoaderManager.hasRunningLoaders();
                        loadersRunning |= f.mLoaderManager.hasRunningLoaders();
                    }
                    }
                }
                }
            }


            // Now iterate through all active fragments. These will include those that are removed
            // Now iterate through all active fragments. These will include those that are removed
            // and detached.
            // and detached.
+1 −0
Original line number Original line Diff line number Diff line
@@ -852,6 +852,7 @@ class LoaderManagerImpl extends LoaderManager {
            mInactiveLoaders.valueAt(i).destroy();
            mInactiveLoaders.valueAt(i).destroy();
        }
        }
        mInactiveLoaders.clear();
        mInactiveLoaders.clear();
        mHost = null;
    }
    }


    @Override
    @Override