package bf.io.openshop.ux.fragments; import android.app.ProgressDialog; import android.os.Bundle; import android.os.Handler; import android.support.annotation.NonNull; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.webkit.WebView; import android.widget.TextView; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.VolleyError; import bf.io.openshop.CONST; import bf.io.openshop.MyApplication; import bf.io.openshop.R; import bf.io.openshop.SettingsMy; import bf.io.openshop.api.EndPoints; import bf.io.openshop.api.GsonRequest; import bf.io.openshop.entities.Page; import bf.io.openshop.utils.MsgUtils; import bf.io.openshop.utils.Utils; import bf.io.openshop.ux.MainActivity; import timber.log.Timber; /** * Fragment allow displaying useful information content like web page. * Requires input argument - id of selected page. Pages are created in OpenShop server administration. */ public class PageFragment extends Fragment { /** * Name for input argument. */ private static final String PAGE_ID = "page_id"; private static final long TERMS_AND_CONDITIONS = -131; private ProgressDialog progressDialog; /** * Reference of empty layout */ private View layoutEmpty; /** * Reference of content layout */ private View layoutContent; // Content view elements private TextView pageTitle; private WebView pageContent; /** * Create fragment instance which allow displaying useful information content like web page. * * @param pageId id of page for download and display. (Define in OpenShop server administration) * @return new fragment instance. */ public static PageFragment newInstance(long pageId) { Bundle args = new Bundle(); args.putLong(PageFragment.PAGE_ID, pageId); PageFragment fragment = new PageFragment(); fragment.setArguments(args); return fragment; } /** * Create fragment instance which displays Terms and Conditions defined on server. * * @return fragment instance for display. */ public static PageFragment newInstance() { Bundle args = new Bundle(); args.putLong(PageFragment.PAGE_ID, TERMS_AND_CONDITIONS); PageFragment fragment = new PageFragment(); fragment.setArguments(args); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Timber.d("%s - onCreateView", this.getClass().getSimpleName()); View view = inflater.inflate(R.layout.fragment_page, container, false); MainActivity.setActionBarTitle(getString(R.string.app_name)); progressDialog = Utils.generateProgressDialog(getActivity(), false); layoutEmpty = view.findViewById(R.id.page_empty); layoutContent = view.findViewById(R.id.page_content_layout); pageTitle = (TextView) view.findViewById(R.id.page_title); pageContent = (WebView) view.findViewById(R.id.page_content); // Check if fragment received some arguments. if (getArguments() != null && getArguments().getLong(PAGE_ID) != 0L) { getPage(getArguments().getLong(PAGE_ID)); } else { Timber.e(new RuntimeException(), "Created fragment with null arguments."); setContentVisible(false); MsgUtils.showToast(getActivity(), MsgUtils.TOAST_TYPE_INTERNAL_ERROR, "", MsgUtils.ToastLength.LONG); } return view; } /** * Load page content by pageID. * * @param pageId define page to load. */ private void getPage(long pageId) { String url; if (pageId == TERMS_AND_CONDITIONS) { url = String.format(EndPoints.PAGES_TERMS_AND_COND, SettingsMy.getActualNonNullShop(getActivity()).getId()); } else { url = String.format(EndPoints.PAGES_SINGLE, SettingsMy.getActualNonNullShop(getActivity()).getId(), pageId); } progressDialog.show(); GsonRequest<Page> getPage = new GsonRequest<>(Request.Method.GET, url, null, Page.class, new Response.Listener<Page>() { @Override public void onResponse(@NonNull Page response) { handleResponse(response); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { if (progressDialog != null) progressDialog.cancel(); setContentVisible(false); MsgUtils.logAndShowErrorMessage(getActivity(), error); } }); getPage.setRetryPolicy(MyApplication.getDefaultRetryPolice()); getPage.setShouldCache(false); MyApplication.getInstance().addToRequestQueue(getPage, CONST.PAGE_REQUESTS_TAG); } /** * Method hides progress dialog and show received content. * * @param page page data received from server. */ private void handleResponse(Page page) { if (page != null && page.getText() != null && !page.getText().isEmpty()) { setContentVisible(true); pageTitle.setText(page.getTitle()); String data = page.getText(); String header = "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">" + "<html> <head> <meta http-equiv=\"content-type\" content=\"text/html; charset=utf-8\">" + "</head> <body>"; String footer = "</body></html>"; pageContent.loadData(header + data + footer, "text/html; charset=UTF-8", null); } else { setContentVisible(false); } // Slow disappearing of progressDialog due to slow page content processing. new Handler().postDelayed(new Runnable() { @Override public void run() { if (progressDialog != null) progressDialog.cancel(); } }, 200); } /** * Display content layout or empty layout. * * @param visible true for visible content. */ private void setContentVisible(boolean visible) { if (layoutEmpty != null && layoutContent != null) { if (visible) { layoutEmpty.setVisibility(View.GONE); layoutContent.setVisibility(View.VISIBLE); } else { layoutEmpty.setVisibility(View.VISIBLE); layoutContent.setVisibility(View.GONE); } } } @Override public void onStop() { MyApplication.getInstance().cancelPendingRequests(CONST.PAGE_REQUESTS_TAG); if (progressDialog != null) progressDialog.cancel(); super.onStop(); } }