Source:
<code>private void setupSpecificMessageHandlers() { bridge.addListener("onBeginNewPage", new SynchronousBridgeListener() { @Override public void onMessage(JSONObject payload) { try { stagedScrollY = payload.getInt("stagedScrollY"); loadPageOnWebViewReady(Cache.valueOf(payload.getString("cachePreference"))); } catch (JSONException e) { L.logRemoteErrorIfProd(e); } } }); bridge.addListener("requestSection", new SynchronousBridgeListener() { @Override public void onMessage(JSONObject payload) { try { displayNonLeadSection(payload.getInt("index"), payload.optBoolean(BRIDGE_PAYLOAD_SAVED_PAGE, false)); } catch (JSONException e) { L.logRemoteErrorIfProd(e); } } }); bridge.addListener("pageLoadComplete", new SynchronousBridgeListener() { @Override public void onMessage(JSONObject payload) { activity.updateProgressBar(false, true, 0); bottomContentHandler.setTitle(model.getTitle()); bottomContentHandler.beginLayout(); if (model.getPage() != null) { <START> leadImagesHandler.updateNavigate(model.getPage().getPageProperties().getGeo()); <END> } } }); bridge.addListener("pageInfo", new CommunicationBridge.JSEventListener() { @Override public void onMessage(String message, JSONObject payload) { if (fragment.isAdded()) { PageInfo pageInfo = PageInfoUnmarshaller.unmarshal(model.getTitle(), model.getTitle().getSite(), payload); fragment.updatePageInfo(pageInfo); } } }); bottomContentHandler = new BottomContentHandler(fragment, bridge, webView, fragment.getLinkHandler(), (ViewGroup) fragment.getView().findViewById(R.id.bottom_content_container)); }</code><technical_language>reason this done in "onBeginNewPage" handler, instead of "pageLoadComplete"? way, button visible soon page starts loading, instead of end of loading process</technical_language>

Target:
private void setupSpecificMessageHandlers() { bridge.addListener("onBeginNewPage", new SynchronousBridgeListener() { @Override public void onMessage(JSONObject payload) { try { stagedScrollY = payload.getInt("stagedScrollY"); loadPageOnWebViewReady(Cache.valueOf(payload.getString("cachePreference"))); } catch (JSONException e) { L.logRemoteErrorIfProd(e); } } }); bridge.addListener("requestSection", new SynchronousBridgeListener() { @Override public void onMessage(JSONObject payload) { try { displayNonLeadSection(payload.getInt("index"), payload.optBoolean(BRIDGE_PAYLOAD_SAVED_PAGE, false)); } catch (JSONException e) { L.logRemoteErrorIfProd(e); } } }); bridge.addListener("pageLoadComplete", new SynchronousBridgeListener() { @Override public void onMessage(JSONObject payload) { activity.updateProgressBar(false, true, 0); bottomContentHandler.setTitle(model.getTitle()); bottomContentHandler.beginLayout(); } }); bridge.addListener("pageInfo", new CommunicationBridge.JSEventListener() { @Override public void onMessage(String message, JSONObject payload) { if (fragment.isAdded()) { PageInfo pageInfo = PageInfoUnmarshaller.unmarshal(model.getTitle(), model.getTitle().getSite(), payload); fragment.updatePageInfo(pageInfo); } } }); bottomContentHandler = new BottomContentHandler(fragment, bridge, webView, fragment.getLinkHandler(), (ViewGroup) fragment.getView().findViewById(R.id.bottom_content_container)); }