org.openmrs.mobile.activities.dialog.CustomFragmentDialog.java Source code

Java tutorial

Introduction

Here is the source code for org.openmrs.mobile.activities.dialog.CustomFragmentDialog.java

Source

/*
 * The contents of this file are subject to the OpenMRS Public License
 * Version 1.0 (the "License"); you may not use this file except in
 * compliance with the License. You may obtain a copy of the License at
 * http://license.openmrs.org
 *
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
 * License for the specific language governing rights and limitations
 * under the License.
 *
 * Copyright (C) OpenMRS, LLC.  All Rights Reserved.
 */

package org.openmrs.mobile.activities.dialog;

import android.app.Activity;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.provider.Settings;
import android.support.annotation.Nullable;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;

import org.openmrs.mobile.R;
import org.openmrs.mobile.activities.ACBaseActivity;
import org.openmrs.mobile.activities.login.LoginActivity;
import org.openmrs.mobile.activities.login.LoginFragment;
import org.openmrs.mobile.activities.patientdashboard.PatientDashboardActivity;
import org.openmrs.mobile.activities.patientdashboard.visits.PatientVisitsFragment;
import org.openmrs.mobile.activities.addeditpatient.AddEditPatientActivity;
import org.openmrs.mobile.activities.addeditpatient.SimilarPatientsRecyclerViewAdapter;
import org.openmrs.mobile.activities.visitdashboard.VisitDashboardActivity;
import org.openmrs.mobile.application.OpenMRS;
import org.openmrs.mobile.bundle.CustomDialogBundle;
import org.openmrs.mobile.models.Patient;
import org.openmrs.mobile.utilities.ApplicationConstants;
import org.openmrs.mobile.utilities.FontsUtil;

import java.util.List;

/**
 * General class for creating dialog fragment instances
 */
public class CustomFragmentDialog extends DialogFragment {
    private static final int TYPED_DIMENSION_VALUE = 10;

    public enum OnClickAction {
        SET_URL, SHOW_URL_DIALOG, DISMISS_URL_DIALOG, DISMISS, LOGOUT, FINISH, INTERNET, UNAUTHORIZED, END_VISIT, START_VISIT, LOGIN, REGISTER_PATIENT, CANCEL_REGISTERING, DELETE_PATIENT
    }

    protected LayoutInflater mInflater;
    protected LinearLayout mFieldsLayout;
    protected RecyclerView mRecyclerView;

    protected TextView mTextView;
    protected TextView mTitleTextView;

    private Button mLeftButton;
    private Button mRightButton;

    protected EditText mEditText;

    private CustomDialogBundle mCustomDialogBundle;

    public static CustomFragmentDialog newInstance(CustomDialogBundle customDialogBundle) {
        CustomFragmentDialog dialog = new CustomFragmentDialog();
        dialog.setRetainInstance(true);
        Bundle bundle = new Bundle();
        bundle.putSerializable(ApplicationConstants.BundleKeys.CUSTOM_DIALOG_BUNDLE, customDialogBundle);
        dialog.setArguments(bundle);
        return dialog;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mCustomDialogBundle = (CustomDialogBundle) getArguments()
                .getSerializable(ApplicationConstants.BundleKeys.CUSTOM_DIALOG_BUNDLE);
        if (mCustomDialogBundle.hasLoadingBar()) {
            this.setStyle(DialogFragment.STYLE_NO_TITLE, R.style.LoadingDialogTheme_DialogTheme);
        } else if (mCustomDialogBundle.hasPatientList()) {
            this.setStyle(DialogFragment.STYLE_NO_TITLE, R.style.SimilarPatients_DialogTheme);
        } else {
            this.setStyle(DialogFragment.STYLE_NO_TITLE, R.style.DialogTheme);
        }
        this.setRetainInstance(true);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,
            @Nullable Bundle savedInstanceState) {
        this.mInflater = inflater;
        View dialogLayout = mInflater.inflate(R.layout.fragment_dialog_layout, null, false);
        this.mFieldsLayout = (LinearLayout) dialogLayout.findViewById(R.id.dialogForm);
        this.setRightButton(dialogLayout);
        this.setLeftButton(dialogLayout);
        getDialog().setCanceledOnTouchOutside(false);
        buildDialog();
        FontsUtil.setFont((ViewGroup) dialogLayout);
        return dialogLayout;
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        if (isDialogAvailable()) {
            this.setBorderless();
            this.setOnBackListener();
        }
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if (isDialogAvailable()) {
            this.setBorderless();
            this.setOnBackListener();
        }
    }

    @Override
    public void show(FragmentManager manager, String tag) {
        if (null == manager.findFragmentByTag(tag)) {
            manager.beginTransaction().add(this, tag).commitAllowingStateLoss();
        }
    }

    @Override
    public void onDestroyView() {
        if (getDialog() != null && getRetainInstance()) {
            getDialog().setDismissMessage(null);
        }
        if (getActivity().getClass().equals(DialogActivity.class)) {
            getActivity().finish();
        }
        super.onDestroyView();

    }

    public final void setOnBackListener() {
        getDialog().setOnKeyListener(new DialogInterface.OnKeyListener() {
            @Override
            public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
                if (keyCode == KeyEvent.KEYCODE_BACK && getActivity().getClass().equals(LoginActivity.class)) {
                    if (OpenMRS.getInstance().getServerUrl().equals(ApplicationConstants.EMPTY_STRING)) {
                        OpenMRS.getInstance().getOpenMRSLogger().d("Exit application");
                        getActivity().onBackPressed();
                        dismiss();
                    } else {
                        ((LoginFragment) getActivity().getSupportFragmentManager()
                                .findFragmentById(R.id.loginContentFrame)).hideURLDialog();
                        dismiss();
                    }
                }
                return false;
            }
        });
    }

    public final void setBorderless() {
        getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));

        int marginWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, TYPED_DIMENSION_VALUE,
                OpenMRS.getInstance().getResources().getDisplayMetrics());

        DisplayMetrics display = this.getResources().getDisplayMetrics();
        int width = display.widthPixels;

        WindowManager.LayoutParams params = getDialog().getWindow().getAttributes();
        params.width = width - 2 * marginWidth;

        getDialog().getWindow().setAttributes(params);
    }

    private void buildDialog() {
        if (null != mCustomDialogBundle.getTitleViewMessage()) {
            mTitleTextView = addTitleBar(mCustomDialogBundle.getTitleViewMessage());
        }
        if (null != mCustomDialogBundle.getEditTextViewMessage()) {
            mEditText = addEditTextField(mCustomDialogBundle.getEditTextViewMessage());
        }
        if (null != mCustomDialogBundle.getTextViewMessage()) {
            mTextView = addTextField(mCustomDialogBundle.getTextViewMessage());
        }
        if (null != mCustomDialogBundle.getLeftButtonAction()) {
            setLeftButton(mCustomDialogBundle.getLeftButtonText());
            mLeftButton.setOnClickListener(onClickActionSolver(mCustomDialogBundle.getLeftButtonAction()));
        }
        if (null != mCustomDialogBundle.getRightButtonAction()) {
            setRightButton(mCustomDialogBundle.getRightButtonText());
            mRightButton.setOnClickListener(onClickActionSolver(mCustomDialogBundle.getRightButtonAction()));
        }
        if (mCustomDialogBundle.hasLoadingBar()) {
            addProgressBar(mCustomDialogBundle.getTitleViewMessage());
            this.setCancelable(false);
        }
        if (mCustomDialogBundle.hasProgressDialog()) {
            addProgressBar(mCustomDialogBundle.getProgressViewMessage());
            this.setCancelable(false);
        }
        if (null != mCustomDialogBundle.getPatientsList()) {
            mRecyclerView = addRecycleView(mCustomDialogBundle.getPatientsList(),
                    mCustomDialogBundle.getNewPatient());
        }
    }

    private RecyclerView addRecycleView(List<Patient> patientsList, Patient newPatient) {
        LinearLayout field = (LinearLayout) mInflater.inflate(R.layout.openmrs_recycle_view, null);
        RecyclerView recyclerView = (RecyclerView) field.findViewById(R.id.recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        recyclerView.setAdapter(new SimilarPatientsRecyclerViewAdapter((getActivity()), patientsList, newPatient));
        mFieldsLayout.addView(field);
        recyclerView.setHasFixedSize(true);
        return recyclerView;
    }

    public EditText addEditTextField(String defaultMessage) {
        LinearLayout field = (LinearLayout) mInflater.inflate(R.layout.openmrs_edit_text_field, null);
        EditText editText = (EditText) field.findViewById(R.id.openmrsEditText);
        if (null != defaultMessage) {
            editText.setText(defaultMessage);
        }
        mFieldsLayout.addView(field);
        return editText;
    }

    public TextView addTextField(String message) {
        LinearLayout field = (LinearLayout) mInflater.inflate(R.layout.openmrs_text_view_field, null);
        TextView textView = (TextView) field.findViewById(R.id.openmrsTextView);
        textView.setText(message);
        textView.setSingleLine(false);
        FontsUtil.setFont(textView, FontsUtil.OpenFonts.OPEN_SANS_ITALIC);
        mFieldsLayout.addView(field, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.WRAP_CONTENT));
        return textView;
    }

    public TextView addTitleBar(String title) {
        LinearLayout field = (LinearLayout) mInflater.inflate(R.layout.openmrs_title_view_field, null);
        TextView textView = (TextView) field.findViewById(R.id.openmrsTitleView);
        textView.setText(title);
        textView.setSingleLine(true);
        mFieldsLayout.addView(field, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT));
        return textView;
    }

    public void setLeftButton(String text) {
        mLeftButton.setText(text);
        setViewVisible(mLeftButton, true);
    }

    public void setRightButton(String text) {
        mRightButton.setText(text);
        setViewVisible(mRightButton, true);
    }

    private void setViewVisible(View view, boolean visible) {
        if (visible) {
            view.setVisibility(View.VISIBLE);
        } else {
            view.setVisibility(View.GONE);
        }
    }

    public void setRightButton(View dialogLayout) {
        this.mRightButton = (Button) dialogLayout.findViewById(R.id.dialogFormButtonsSubmitButton);
    }

    public void setLeftButton(View dialogLayout) {
        this.mLeftButton = (Button) dialogLayout.findViewById(R.id.dialogFormButtonsCancelButton);
    }

    public void addProgressBar(String message) {
        FrameLayout progressBarLayout = (FrameLayout) mInflater.inflate(R.layout.dialog_progress, null);
        TextView textView = (TextView) progressBarLayout.findViewById(R.id.progressTextView);
        textView.setText(message);
        mFieldsLayout.addView(progressBarLayout, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                ViewGroup.LayoutParams.MATCH_PARENT));
    }

    public String getEditTextValue() {
        String value = "";
        if (mEditText != null) {
            value = mEditText.getText().toString();
        }
        return value;
    }

    private boolean isDialogAvailable() {
        return null != this && null != this.getDialog();
    }

    private View.OnClickListener onClickActionSolver(final OnClickAction action) {
        return new View.OnClickListener() {
            //CHECKSTYLE:OFF
            @Override
            public void onClick(View v) {
                switch (action) {
                case DISMISS_URL_DIALOG:
                    ((LoginFragment) getActivity().getSupportFragmentManager()
                            .findFragmentById(R.id.loginContentFrame)).hideURLDialog();
                    dismiss();
                    break;
                case LOGIN:
                    ((LoginFragment) getActivity().getSupportFragmentManager()
                            .findFragmentById(R.id.loginContentFrame)).login(true);
                    dismiss();
                    break;
                case DISMISS:
                    dismiss();
                    break;
                case LOGOUT:
                    ((ACBaseActivity) getActivity()).logout();
                    dismiss();
                    break;
                case FINISH:
                    getActivity().moveTaskToBack(true);
                    android.os.Process.killProcess(android.os.Process.myPid());
                    System.exit(1);
                    break;
                case INTERNET:
                    getActivity().startActivity(new Intent(Settings.ACTION_SETTINGS));
                    dismiss();
                    break;
                case UNAUTHORIZED:
                    ((ACBaseActivity) getActivity()).moveUnauthorizedUserToLoginScreen();
                    dismiss();
                    break;
                case END_VISIT:
                    ((VisitDashboardActivity) getActivity()).mPresenter.endVisit();
                    dismiss();
                    break;
                case START_VISIT:
                    doStartVisitAction();
                    dismiss();
                    break;
                case REGISTER_PATIENT:
                    ((AddEditPatientActivity) getActivity()).mPresenter.registerPatient();
                    dismiss();
                    break;
                case CANCEL_REGISTERING:
                    ((AddEditPatientActivity) getActivity()).mPresenter.finishPatientInfoActivity();
                    dismiss();
                    break;
                case DELETE_PATIENT:
                    PatientDashboardActivity activity = (PatientDashboardActivity) getActivity();
                    activity.mPresenter.deletePatient();
                    dismiss();
                    activity.finish();
                    break;
                default:
                    break;
                }
            }
            //CHECKSTYLE:ON
        };
    }

    private void doStartVisitAction() {
        Activity activity = getActivity();
        if (activity instanceof PatientDashboardActivity) {
            PatientDashboardActivity pda = ((PatientDashboardActivity) activity);
            List<Fragment> fragments = pda.getSupportFragmentManager().getFragments();
            PatientVisitsFragment fragment = null;
            for (Fragment frag : fragments) {
                if (frag instanceof PatientVisitsFragment) {
                    fragment = (PatientVisitsFragment) frag;
                    break;
                }
            }
            if (fragment != null) {
                fragment.startVisit();
            }
        }
    }
}