jenkins-bot has submitted this change and it was merged. ( 
https://gerrit.wikimedia.org/r/403752 )

Change subject: Lazily load the Nearby fragment.
......................................................................


Lazily load the Nearby fragment.

When the user goes to the History tab, the Nearby tab is pre-loaded
implicitly by the ViewPager, which causes much of the MapView logic to get
loaded unnecessarily. The MapView is a very heavy component, and
contributes to jitter and slowness when navigating between our bottom
tabs.

This patch encapsulates NearbyFragment inside a lazy-loadable fragment,
which is just a skeleton fragment that does not consume any resources when
loaded implicitly by the ViewPager.

Change-Id: Ic02db1b2bc5b7b27ca34b2f5034610c9a1c99476
---
M app/src/main/java/org/wikipedia/activity/FragmentUtil.java
M app/src/main/java/org/wikipedia/navtab/NavTab.java
A app/src/main/java/org/wikipedia/nearby/NearbyLazyLoadFragment.java
3 files changed, 70 insertions(+), 5 deletions(-)

Approvals:
  jenkins-bot: Verified
  Cooltey: Looks good to me, approved



diff --git a/app/src/main/java/org/wikipedia/activity/FragmentUtil.java 
b/app/src/main/java/org/wikipedia/activity/FragmentUtil.java
index 60c2672..edbd4fd 100644
--- a/app/src/main/java/org/wikipedia/activity/FragmentUtil.java
+++ b/app/src/main/java/org/wikipedia/activity/FragmentUtil.java
@@ -10,9 +10,14 @@
             //noinspection unchecked
             return (T) fragment.getTargetFragment();
         }
-        if (callback.isInstance(fragment.getParentFragment())) {
-            //noinspection unchecked
-            return (T) fragment.getParentFragment();
+        if (fragment.getParentFragment() != null) {
+            if (callback.isInstance(fragment.getParentFragment())) {
+                //noinspection unchecked
+                return (T) fragment.getParentFragment();
+            } else if 
(callback.isInstance(fragment.getParentFragment().getParentFragment())) {
+                //noinspection unchecked
+                return (T) fragment.getParentFragment().getParentFragment();
+            }
         }
         if (callback.isInstance(fragment.getActivity())) {
             //noinspection unchecked
diff --git a/app/src/main/java/org/wikipedia/navtab/NavTab.java 
b/app/src/main/java/org/wikipedia/navtab/NavTab.java
index 0728d31..0ff9779 100644
--- a/app/src/main/java/org/wikipedia/navtab/NavTab.java
+++ b/app/src/main/java/org/wikipedia/navtab/NavTab.java
@@ -10,7 +10,7 @@
 import org.wikipedia.history.HistoryFragment;
 import org.wikipedia.model.EnumCode;
 import org.wikipedia.model.EnumCodeMap;
-import org.wikipedia.nearby.NearbyFragment;
+import org.wikipedia.nearby.NearbyLazyLoadFragment;
 import org.wikipedia.readinglist.ReadingListsFragment;
 
 public enum NavTab implements EnumCode {
@@ -31,7 +31,7 @@
     },
     NEARBY(R.string.nav_item_nearby, R.drawable.ic_explore_black_24dp) {
         @NonNull @Override public Fragment newInstance() {
-            return NearbyFragment.newInstance();
+            return NearbyLazyLoadFragment.newInstance();
         }
     };
 
diff --git a/app/src/main/java/org/wikipedia/nearby/NearbyLazyLoadFragment.java 
b/app/src/main/java/org/wikipedia/nearby/NearbyLazyLoadFragment.java
new file mode 100644
index 0000000..621c510
--- /dev/null
+++ b/app/src/main/java/org/wikipedia/nearby/NearbyLazyLoadFragment.java
@@ -0,0 +1,60 @@
+package org.wikipedia.nearby;
+
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.support.v4.app.Fragment;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.FrameLayout;
+
+import org.wikipedia.WikipediaApp;
+
+public class NearbyLazyLoadFragment extends Fragment {
+    private static final int CONTAINER_VIEW_ID = 0x8675309;
+    private static final String CHILD_FRAGMENT_TAG = "lazyChildFragment";
+    @Nullable private Fragment childFragment;
+
+    @NonNull public static NearbyLazyLoadFragment newInstance() {
+        return new NearbyLazyLoadFragment();
+    }
+
+    @Override
+    public void onCreate(Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        setRetainInstance(true);
+    }
+
+    public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup 
container, Bundle savedInstanceState) {
+        View view = new FrameLayout(getContext());
+        FrameLayout.LayoutParams params = new 
FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 
ViewGroup.LayoutParams.MATCH_PARENT);
+        view.setLayoutParams(params);
+        view.setId(CONTAINER_VIEW_ID);
+        return view;
+    }
+
+    @Override
+    public void onResume() {
+        super.onResume();
+        maybeLoadChildFragment();
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        WikipediaApp.getInstance().getRefWatcher().watch(this);
+    }
+
+    @Override public void setUserVisibleHint(boolean isVisibleToUser) {
+        super.setUserVisibleHint(isVisibleToUser);
+        maybeLoadChildFragment();
+    }
+
+    private void maybeLoadChildFragment() {
+        if (isAdded() && getUserVisibleHint() && childFragment == null) {
+            childFragment = NearbyFragment.newInstance();
+            
getChildFragmentManager().beginTransaction().add(CONTAINER_VIEW_ID, 
childFragment, CHILD_FRAGMENT_TAG).commit();
+        }
+    }
+}

-- 
To view, visit https://gerrit.wikimedia.org/r/403752
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Ic02db1b2bc5b7b27ca34b2f5034610c9a1c99476
Gerrit-PatchSet: 1
Gerrit-Project: apps/android/wikipedia
Gerrit-Branch: master
Gerrit-Owner: Dbrant <[email protected]>
Gerrit-Reviewer: Brion VIBBER <[email protected]>
Gerrit-Reviewer: Cooltey <[email protected]>
Gerrit-Reviewer: Sharvaniharan <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to