Swati4star/Images-to-PDF

View on GitHub
app/src/main/java/swati4star/createpdf/util/PageSizeUtils.java

Summary

Maintainability
A
35 mins
Test Coverage
package swati4star.createpdf.util;

import android.app.Activity;
import android.content.Context;
import android.view.View;
import android.widget.CheckBox;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Spinner;

import com.afollestad.materialdialogs.MaterialDialog;
import com.itextpdf.text.Rectangle;

import java.util.HashMap;
import java.util.List;

import swati4star.createpdf.R;
import swati4star.createpdf.preferences.TextToPdfPreferences;

public class PageSizeUtils {

    public static final String PAGE_SIZE_FIT_SIZE = "FIT_SIZE";

    public static String mPageSize;
    private final Context mActivity;
    private final String mDefaultPageSize;
    private final HashMap<Integer, Integer> mPageSizeToString;
    private final TextToPdfPreferences mPreferences;

    /**
     * Utils object to modify the page size
     *
     * @param mActivity - current context
     */
    public PageSizeUtils(Context mActivity) {
        this.mActivity = mActivity;
        mPreferences = new TextToPdfPreferences(mActivity);
        mDefaultPageSize = mPreferences.getPageSize();
        mPageSize = mPreferences.getPageSize();
        mPageSizeToString = new HashMap<>();
        mPageSizeToString.put(R.id.page_size_default, R.string.a4);
        mPageSizeToString.put(R.id.page_size_fit_size, R.string.fit_size);
        mPageSizeToString.put(R.id.page_size_legal, R.string.legal);
        mPageSizeToString.put(R.id.page_size_executive, R.string.executive);
        mPageSizeToString.put(R.id.page_size_ledger, R.string.ledger);
        mPageSizeToString.put(R.id.page_size_tabloid, R.string.tabloid);
        mPageSizeToString.put(R.id.page_size_letter, R.string.letter);
    }

    /**
     * @param selectionId   - id of selected radio button
     * @param spinnerAValue - Value of A0 to A10 spinner
     * @param spinnerBValue - Value of B0 to B10 spinner
     * @return - Rectangle page size
     */
    private String getPageSize(int selectionId, String spinnerAValue, String spinnerBValue) {
        String stringPageSize;
        switch (selectionId) {
            case R.id.page_size_a0_a10:
                stringPageSize = spinnerAValue;
                mPageSize = stringPageSize.substring(0, stringPageSize.indexOf(" "));
                break;
            case R.id.page_size_b0_b10:
                stringPageSize = spinnerBValue;
                mPageSize = stringPageSize.substring(0, stringPageSize.indexOf(" "));
                break;
            case R.id.page_size_fit_size:
                mPageSize = PAGE_SIZE_FIT_SIZE;
                break;
            default:
                mPageSize = mActivity.getString(mPageSizeToString.get(selectionId));

        }
        return mPageSize;
    }

    /**
     * Show a dialog to modify the page size
     *
     * @param saveValue - save the value in shared preferences
     * @return - dialog object
     */
    public MaterialDialog showPageSizeDialog(boolean saveValue) {
        MaterialDialog materialDialog = getPageSizeDialog(saveValue);

        View view = materialDialog.getCustomView();
        RadioGroup radioGroup = view.findViewById(R.id.radio_group_page_size);
        Spinner spinnerA = view.findViewById(R.id.spinner_page_size_a0_a10);
        Spinner spinnerB = view.findViewById(R.id.spinner_page_size_b0_b10);
        RadioButton radioButtonDefault = view.findViewById(R.id.page_size_default);
        radioButtonDefault.setText(String.format(mActivity.getString(R.string.default_page_size), mDefaultPageSize));

        if (saveValue)
            view.findViewById(R.id.set_as_default).setVisibility(View.GONE);

        if (mPageSize.equals(mDefaultPageSize)) {
            radioGroup.check(R.id.page_size_default);
        } else if (mPageSize.startsWith("A")) {
            radioGroup.check(R.id.page_size_a0_a10);
            spinnerA.setSelection(java.lang.Integer.parseInt(mPageSize.substring(1)));
        } else if (mPageSize.startsWith("B")) {
            radioGroup.check(R.id.page_size_b0_b10);
            spinnerB.setSelection(java.lang.Integer.parseInt(mPageSize.substring(1)));
        } else {
            Integer key = getKey(mPageSizeToString, mPageSize);
            if (key != null)
                radioGroup.check(key);
        }
        materialDialog.show();
        return materialDialog;
    }

    /**
     * Calculates common page size for given images to fit all of them.
     * - If images have different sizes than max width, max height is used to fit all of them.
     * - If images have same size, than output returns exact size of image.
     *
     * @param imagesUri - input images URIs as Strings.
     * @return common size of input images as Rectangle.
     * @see com.itextpdf.text.Rectangle
     */
    public static Rectangle calculateCommonPageSize(List<String> imagesUri) {
        float maxWidth = 0; float maxHeight = 0;
        for (String imageUri : imagesUri) {
            Rectangle imageSize = ImageUtils.getImageSize(imageUri);
            float imageWidth = imageSize.getWidth(); float imageHeight = imageSize.getHeight();
            if (imageWidth > maxWidth) maxWidth = imageWidth;
            if (imageHeight > maxHeight) maxHeight = imageHeight;
        }
        return new Rectangle(maxWidth, maxHeight);
    }

    /**
     * Private show page size utils dialog
     *
     * @param saveValue - save the value in shared prefs
     * @return - dialog object
     */
    private MaterialDialog getPageSizeDialog(boolean saveValue) {
        MaterialDialog.Builder builder = DialogUtils.getInstance()
                .createCustomDialogWithoutContent((Activity) mActivity, R.string.set_page_size_text);
        return builder.customView(R.layout.set_page_size_dialog, true)
                .onPositive((dialog1, which) -> {
                    View view = dialog1.getCustomView();
                    RadioGroup radioGroup = view.findViewById(R.id.radio_group_page_size);
                    int selectedId = radioGroup.getCheckedRadioButtonId();
                    Spinner spinnerA = view.findViewById(R.id.spinner_page_size_a0_a10);
                    Spinner spinnerB = view.findViewById(R.id.spinner_page_size_b0_b10);
                    mPageSize = getPageSize(selectedId, spinnerA.getSelectedItem().toString(),
                            spinnerB.getSelectedItem().toString());
                    CheckBox mSetAsDefault = view.findViewById(R.id.set_as_default);
                    if (saveValue || mSetAsDefault.isChecked()) {
                        mPreferences.setPageSize(mPageSize);
                    }
                }).build();
    }

    /**
     * Get key from the value
     *
     * @param map   - hash map
     * @param value - the value for which we want the key
     * @return - key value
     */
    private Integer getKey(HashMap<Integer, Integer> map, String value) {
        for (HashMap.Entry<Integer, Integer> entry : map.entrySet()) {
            if (value.equals(mActivity.getString(entry.getValue()))) {
                return entry.getKey();
            }
        }
        return null;
    }
}