From 5d0ca3b247b7f03277572ba039fff44e68efff80 Mon Sep 17 00:00:00 2001 From: dosiecki Date: Wed, 1 Jul 2015 12:15:43 -0700 Subject: [PATCH] Add on-post-load hook to webview. --- .../fragment/ReadingItemFragment.java | 54 +++++++++++++++++-- .../fragment/SetupCommentSectionTask.java | 10 ++-- .../com/newsblur/view/NewsblurWebview.java | 12 +++-- 3 files changed, 63 insertions(+), 13 deletions(-) diff --git a/clients/android/NewsBlur/src/com/newsblur/fragment/ReadingItemFragment.java b/clients/android/NewsBlur/src/com/newsblur/fragment/ReadingItemFragment.java index 94c63ef74..4ad58c5d7 100644 --- a/clients/android/NewsBlur/src/com/newsblur/fragment/ReadingItemFragment.java +++ b/clients/android/NewsBlur/src/com/newsblur/fragment/ReadingItemFragment.java @@ -96,6 +96,13 @@ public class ReadingItemFragment extends NbFragment implements ClassifierDialogF private String sourceUserId; private int contentHash; + // these three flags are progressively set by async callbacks and unioned + // to set isLoadFinished, when we trigger any final UI tricks. + private boolean isContentLoadFinished; + private boolean isWebLoadFinished; + private boolean isSocialLoadFinished; + private Boolean isLoadFinished = false; + private final Object WEBVIEW_CONTENT_MUTEX = new Object(); public static ReadingItemFragment newInstance(Story story, String feedTitle, String feedFaviconColor, String feedFaviconFade, String feedFaviconBorder, String faviconText, String faviconUrl, Classifier classifier, boolean displayFeedDetails, DefaultFeedView defaultFeedView, String sourceUserId) { @@ -191,12 +198,12 @@ public class ReadingItemFragment extends NbFragment implements ClassifierDialogF registerForContextMenu(web); web.setCustomViewLayout(webviewCustomViewLayout); web.setWebviewWrapperLayout(fragmentScrollview); - web.setActivity(activity); + web.fragment = this; + web.activity = activity; setupItemMetadata(); updateShareButton(); updateSaveButton(); - setupItemCommentsAndShares(); NonfocusScrollview scrollView = (NonfocusScrollview) view.findViewById(R.id.reading_scrollview); @@ -292,9 +299,9 @@ public class ReadingItemFragment extends NbFragment implements ClassifierDialogF shareButton.setText(R.string.share_this); } - private void setupItemCommentsAndShares() { - new SetupCommentSectionTask(getActivity(), view, getFragmentManager(), inflater, story, imageLoader).execute(); - } + private void setupItemCommentsAndShares() { + new SetupCommentSectionTask(this, view, inflater, story, imageLoader).execute(); + } private void setupItemMetadata() { View feedHeader = view.findViewById(R.id.row_item_feed_header); @@ -415,6 +422,7 @@ public class ReadingItemFragment extends NbFragment implements ClassifierDialogF loadStoryContent(); } else { setupWebview(storyContent); + onContentLoadFinished(); } } else { if (originalText == null) { @@ -422,6 +430,7 @@ public class ReadingItemFragment extends NbFragment implements ClassifierDialogF loadOriginalText(); } else { setupWebview(originalText); + onContentLoadFinished(); enableProgress(false); } } @@ -565,6 +574,41 @@ public class ReadingItemFragment extends NbFragment implements ClassifierDialogF return html; } + /** We have pushed our desired content into the WebView. */ + private void onContentLoadFinished() { + isContentLoadFinished = true; + checkLoadStatus(); + } + + /** The webview has finished loading our desired content. */ + public void onWebLoadFinished() { + isWebLoadFinished = true; + checkLoadStatus(); + } + + /** The social UI has finished loading from the DB. */ + public void onSocialLoadFinished() { + isSocialLoadFinished = true; + checkLoadStatus(); + } + + private void checkLoadStatus() { + synchronized (isLoadFinished) { + if (isContentLoadFinished && isWebLoadFinished && isSocialLoadFinished) { + // iff this is the first time all content has finished loading, trigger any UI + // behaviour that is position-dependent + if (!isLoadFinished) { + onLoadFinished(); + } + isLoadFinished = true; + } + } + } + + private void onLoadFinished() { + // TODO: perform any position-dependent UI behaviours here (@manderson23) + } + private class TextSizeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { diff --git a/clients/android/NewsBlur/src/com/newsblur/fragment/SetupCommentSectionTask.java b/clients/android/NewsBlur/src/com/newsblur/fragment/SetupCommentSectionTask.java index abf81acf1..f9081e588 100644 --- a/clients/android/NewsBlur/src/com/newsblur/fragment/SetupCommentSectionTask.java +++ b/clients/android/NewsBlur/src/com/newsblur/fragment/SetupCommentSectionTask.java @@ -42,6 +42,7 @@ public class SetupCommentSectionTask extends AsyncTask { private ArrayList friendCommentViews; private ArrayList friendShareViews; + private final ReadingItemFragment fragment; private final Story story; private final LayoutInflater inflater; private final ImageLoader imageLoader; @@ -51,9 +52,10 @@ public class SetupCommentSectionTask extends AsyncTask { private final FragmentManager manager; private List comments; - public SetupCommentSectionTask(Context context, View view, FragmentManager manager, LayoutInflater inflater, Story story, ImageLoader imageLoader) { - this.context = context; - this.manager = manager; + public SetupCommentSectionTask(ReadingItemFragment fragment, View view, LayoutInflater inflater, Story story, ImageLoader imageLoader) { + this.fragment = fragment; + this.context = fragment.getActivity(); + this.manager = fragment.getFragmentManager(); this.inflater = inflater; this.story = story; this.imageLoader = imageLoader; @@ -337,6 +339,8 @@ public class SetupCommentSectionTask extends AsyncTask { } friendShareListContainer.addView(friendShareViews.get(i)); } + + fragment.onSocialLoadFinished(); } } diff --git a/clients/android/NewsBlur/src/com/newsblur/view/NewsblurWebview.java b/clients/android/NewsBlur/src/com/newsblur/view/NewsblurWebview.java index 7aa252c14..1d2b13f6c 100644 --- a/clients/android/NewsBlur/src/com/newsblur/view/NewsblurWebview.java +++ b/clients/android/NewsBlur/src/com/newsblur/view/NewsblurWebview.java @@ -18,6 +18,7 @@ import android.webkit.WebViewClient; import android.widget.FrameLayout; import com.newsblur.activity.Reading; +import com.newsblur.fragment.ReadingItemFragment; import com.newsblur.util.AppConstants; public class NewsblurWebview extends WebView { @@ -25,8 +26,9 @@ public class NewsblurWebview extends WebView { private NewsblurWebChromeClient webChromeClient; private boolean isCustomViewShowing; + public ReadingItemFragment fragment; // we need the less-abstract activity class in order to manipulate the overlay widgets - private Reading activity; + public Reading activity; public NewsblurWebview(final Context context, AttributeSet attrs) { super(context, attrs); @@ -99,10 +101,6 @@ public class NewsblurWebview extends WebView { this.webChromeClient.webviewWrapperLayout = webviewWrapperLayout; } - public void setActivity(Reading activity) { - this.activity = activity; - } - // this WCC implements the bare minimum callbacks to get HTML5 fullscreen video working class NewsblurWebChromeClient extends WebChromeClient { public View customView; @@ -158,6 +156,10 @@ public class NewsblurWebview extends WebView { customView = null; isCustomViewShowing = false; } + @Override + public void onProgressChanged(WebView view, int newProgress) { + if (newProgress == 100) fragment.onWebLoadFinished(); + } } @Override