steroid-team/app

View on GitHub
app/src/main/java/com/github/steroidteam/todolist/view/DrawingFragment.java

Summary

Maintainability
A
3 hrs
Test Coverage
B
88%
package com.github.steroidteam.todolist.view;

import android.Manifest;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.media.MediaScannerConnection;
import android.os.Bundle;
import android.os.Environment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.Toast;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.lifecycle.ViewModelProvider;
import com.github.steroidteam.todolist.R;
import com.github.steroidteam.todolist.viewmodel.NoteViewModel;
import com.github.steroidteam.todolist.viewmodel.NoteViewModelFactory;
import com.github.steroidteam.todolist.viewmodel.ViewModelFactoryInjection;
import com.larswerkman.holocolorpicker.ColorPicker;
import com.larswerkman.holocolorpicker.SaturationBar;
import com.larswerkman.holocolorpicker.ValueBar;
import java.io.File;
import java.io.FileOutputStream;
import java.util.UUID;

public class DrawingFragment extends Fragment {

    public DrawingView drawingCanvas;
    private ColorPicker colorPicker;
    private LinearLayout colorPickerWindow;
    private FrameLayout canvasLayout;
    private SaturationBar saturationBar;
    private ValueBar valueBar;

    private int firstButtonColor;
    private int secondButtonColor;
    private int thirdButtonColor;
    private int fourthButtonColor;

    private Button firstButton;
    private Button secondButton;
    private Button thirdButton;
    private Button fourthButton;
    private Button colorChooseButton;

    private final char FIRST_BUTTON = 1;
    private final char SECOND_BUTTON = 2;
    private final char THIRD_BUTTON = 3;
    private final char FOURTH_BUTTON = 4;
    private final char COLOR_CHOOSE_BUTTON = 0;

    private ActivityResultLauncher<String[]> requestPermissionLauncher;

    public View onCreateView(
            @NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        View root = inflater.inflate(R.layout.fragment_drawing, container, false);

        canvasLayout = root.findViewById(R.id.drawing_space);
        colorPicker = root.findViewById(R.id.drawing_color_picker);
        colorPickerWindow = root.findViewById(R.id.drawing_color_picker_layout);
        saturationBar = root.findViewById(R.id.drawing_saturation_bar);
        valueBar = root.findViewById(R.id.drawing_value_bar);

        setButtonListener(root);

        drawingCanvas = new DrawingView(getContext());
        canvasLayout.addView(drawingCanvas);
        colorPicker.addSaturationBar(saturationBar);
        colorPicker.addValueBar(valueBar);

        setUpButtonAndColor(root);
        setRequestPermissionLauncher();
        return root;
    }

    private void setButtonListener(View root) {
        root.findViewById(R.id.drawing_first_btn).setOnClickListener(this::firstButton);
        root.findViewById(R.id.drawing_second_btn).setOnClickListener(this::secondButton);
        root.findViewById(R.id.drawing_third_btn).setOnClickListener(this::thirdButton);
        root.findViewById(R.id.drawing_fourth_btn).setOnClickListener(this::fourthButton);
        root.findViewById(R.id.drawing_erase_btn).setOnClickListener(this::eraseButton);
        root.findViewById(R.id.drawing_fifth_btn).setOnClickListener(this::ColorPickerButton);
        root.findViewById(R.id.drawing_cancel_color_btn)
                .setOnClickListener(this::cancelColorButton);
        root.findViewById(R.id.drawing_apply_color_btn).setOnClickListener(this::applyColorButton);
        root.findViewById(R.id.drawing_back_btn)
                .setOnClickListener((view) -> getParentFragmentManager().popBackStack());
        root.findViewById(R.id.drawing_save_btn).setOnClickListener(this::saveButton);
    }

    private void setUpButtonAndColor(View root) {
        // SET BUTTON
        firstButton = root.findViewById(R.id.drawing_first_btn);
        secondButton = root.findViewById(R.id.drawing_second_btn);
        thirdButton = root.findViewById(R.id.drawing_third_btn);
        fourthButton = root.findViewById(R.id.drawing_fourth_btn);
        colorChooseButton = root.findViewById(R.id.drawing_fifth_btn);

        // SET COLOR OF BUTTONS:
        firstButtonColor = getActivity().getColor(R.color.first_drawing_button);
        secondButtonColor = getActivity().getColor(R.color.second_drawing_button);
        thirdButtonColor = getActivity().getColor(R.color.third_drawing_button);
        fourthButtonColor = getActivity().getColor(R.color.fourth_drawing_button);
        setButtonBackground();
    }

    private void setRequestPermissionLauncher() {
        this.requestPermissionLauncher =
                registerForActivityResult(
                        new ActivityResultContracts.RequestMultiplePermissions(),
                        result -> {
                            Boolean externalWritePermission =
                                    result.get(Manifest.permission.WRITE_EXTERNAL_STORAGE);
                            Boolean externalReadPermission =
                                    result.get(Manifest.permission.READ_EXTERNAL_STORAGE);

                            if (externalReadPermission != null && externalWritePermission != null) {
                                if (externalReadPermission && externalWritePermission) {
                                    storeDrawing();
                                } else {
                                    Toast.makeText(
                                                    getContext(),
                                                    "Error: without permissions, the app can't save your drawing!",
                                                    Toast.LENGTH_LONG)
                                            .show();
                                }
                            } else {
                                Toast.makeText(
                                                getContext(),
                                                "Error: without permissions, the app can't save your drawing!",
                                                Toast.LENGTH_LONG)
                                        .show();
                            }
                        });
    }

    private void setPaintColor(int color) {
        drawingCanvas.setPaintColor(color);
    }

    public void fourthButton(View view) {
        setPaintColor(fourthButtonColor);
        setButtonFocus(FOURTH_BUTTON);
    }

    public void thirdButton(View view) {
        setPaintColor(thirdButtonColor);
        setButtonFocus(THIRD_BUTTON);
    }

    public void secondButton(View view) {
        setPaintColor(secondButtonColor);
        setButtonFocus(SECOND_BUTTON);
    }

    public void firstButton(View view) {
        setPaintColor(firstButtonColor);
        setButtonFocus(FIRST_BUTTON);
    }

    public void ColorPickerButton(View view) {
        setButtonFocus(COLOR_CHOOSE_BUTTON);
        drawingCanvas.setVisibility(View.GONE);
        colorPickerWindow.setVisibility(View.VISIBLE);
        colorPicker.setOldCenterColor(drawingCanvas.getPaint().getColor());
    }

    public void cancelColorButton(View view) {
        colorPickerWindow.setVisibility(View.GONE);
        drawingCanvas.setVisibility(View.VISIBLE);
    }

    public void applyColorButton(View view) {
        setPaintColor(colorPicker.getColor());
        colorPickerWindow.setVisibility(View.GONE);
        drawingCanvas.setVisibility(View.VISIBLE);
    }

    public void saveButton(View view) {
        if (ContextCompat.checkSelfPermission(
                                this.getContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE)
                        == PackageManager.PERMISSION_GRANTED
                && ContextCompat.checkSelfPermission(
                                this.getContext(), Manifest.permission.READ_EXTERNAL_STORAGE)
                        == PackageManager.PERMISSION_GRANTED) {

            // Permission already granted.
            storeDrawing();
        } else {
            // You can directly ask for the permission.
            // The registered ActivityResultCallback gets the result of this request.
            requestPermissionLauncher.launch(
                    new String[] {
                        Manifest.permission.WRITE_EXTERNAL_STORAGE,
                        Manifest.permission.READ_EXTERNAL_STORAGE
                    });
        }
    }

    private void storeDrawing() {
        String tmpFileName = "bitmap_tmp_" + UUID.randomUUID().toString() + ".png";
        File tmpFile =
                new File(
                        Environment.getExternalStoragePublicDirectory(
                                Environment.DIRECTORY_PICTURES),
                        tmpFileName);

        try (FileOutputStream output = new FileOutputStream(tmpFile)) {
            drawingCanvas.getBitmap().compress(Bitmap.CompressFormat.PNG, 50, output);
            output.close();

            MediaScannerConnection.scanFile(
                    this.getContext(),
                    new String[] {tmpFile.toString()},
                    null,
                    (path, uri) -> {
                        NoteViewModelFactory noteViewModelFactory =
                                ViewModelFactoryInjection.getNoteViewModelFactory(getContext());
                        NoteViewModel noteViewModel =
                                new ViewModelProvider(requireActivity(), noteViewModelFactory)
                                        .get(NoteViewModel.class);

                        noteViewModel.setTmpDrawingPath(uri);
                        getParentFragmentManager().popBackStack();
                    });
        } catch (Exception e) {
            Toast.makeText(getContext(), "Error: could not saved the image", Toast.LENGTH_LONG)
                    .show();
        }
    }

    public void eraseButton(View view) {
        drawingCanvas.erase();
    }

    private void setButtonFocus(int indexButtonFocus) {

        setButtonBackground();

        switch (indexButtonFocus) {
            case FIRST_BUTTON:
                firstButton.setBackground(
                        ContextCompat.getDrawable(
                                getActivity(), R.drawable.first_button_drawing_onfocus));
                break;
            case SECOND_BUTTON:
                secondButton.setBackground(
                        ContextCompat.getDrawable(
                                getActivity(), R.drawable.second_button_drawing_onfocus));
                break;
            case THIRD_BUTTON:
                thirdButton.setBackground(
                        ContextCompat.getDrawable(
                                getActivity(), R.drawable.third_button_drawing_onfocus));
                break;
            case FOURTH_BUTTON:
                fourthButton.setBackground(
                        ContextCompat.getDrawable(
                                getActivity(), R.drawable.fourth_button_drawing_onfocus));
                break;
            case COLOR_CHOOSE_BUTTON:
                colorChooseButton.setBackground(
                        ContextCompat.getDrawable(
                                getActivity(), R.drawable.colorpicker_button_onfocus));
                break;
            default:
        }
    }

    private void setButtonBackground() {
        firstButton.setBackground(
                ContextCompat.getDrawable(getActivity(), R.drawable.first_button_drawing));
        secondButton.setBackground(
                ContextCompat.getDrawable(getActivity(), R.drawable.second_button_drawing));
        thirdButton.setBackground(
                ContextCompat.getDrawable(getActivity(), R.drawable.third_button_drawing));
        fourthButton.setBackground(
                ContextCompat.getDrawable(getActivity(), R.drawable.fourth_button_drawing));
        colorChooseButton.setBackground(
                ContextCompat.getDrawable(getActivity(), R.drawable.colorpicker_button));
    }
}