From 1ca035b0e93284a4d8e810593bbba87cb1aedf38 Mon Sep 17 00:00:00 2001 From: "saad.siddiq" Date: Mon, 14 Apr 2025 18:02:11 +0500 Subject: [PATCH] Observation Module Screens design --- .idea/.gitignore | 3 + .idea/compiler.xml | 6 + .idea/deploymentTargetSelector.xml | 10 + .idea/gradle.xml | 19 + .idea/migrations.xml | 10 + .idea/misc.xml | 10 + .idea/vcs.xml | 6 + app/src/main/AndroidManifest.xml | 36 +- .../ObservationOneActivity.java | 106 ++++ .../ObservationThreeActivity.java | 63 +++ .../ObservationTwoActivity.java | 469 ++++++++++++++++++ .../PermitToWorkForms/PermitOneActivity.java | 60 +++ .../PermitToWorkForms/PermitTwoActivity.java | 26 + .../adapters/DepartmentAdapter.java | 40 ++ .../adapters/FormTypeAdapter.java | 41 ++ .../adapters/ObservationClassAdapter.java | 40 ++ .../adapters/ObservationSubClassAdapter.java | 40 ++ .../adapters/RiskLevelAdapter.java | 40 ++ .../adapters/ShiftAdapter.java | 41 ++ .../fragments/DraftFragment.java | 13 +- .../fragments/HomeFragment.java | 129 ++++- .../hseobservationsapp/models/FormType.java | 41 ++ .../hseobservationsapp/models/Shift.java | 41 ++ .../main/res/drawable/circle_background.xml | 5 + app/src/main/res/drawable/ic_close.xml | 5 + app/src/main/res/drawable/ic_upload.xml | 5 + app/src/main/res/drawable/icon_calendar.xml | 5 + app/src/main/res/drawable/icon_image.xml | 5 + .../main/res/layout/activity_dashboard.xml | 14 +- .../res/layout/activity_observation_one.xml | 136 +++++ .../res/layout/activity_observation_three.xml | 164 ++++++ .../res/layout/activity_observation_two.xml | 216 ++++++++ .../main/res/layout/activity_permit_one.xml | 227 +++++++++ .../main/res/layout/activity_permit_two.xml | 78 +++ .../res/layout/custom_layout_for_image.xml | 87 ++++ app/src/main/res/layout/fragment_home.xml | 138 +++++- app/src/main/res/layout/list_items.xml | 11 + app/src/main/res/values/strings.xml | 18 + 38 files changed, 2377 insertions(+), 27 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/deploymentTargetSelector.xml create mode 100644 .idea/gradle.xml create mode 100644 .idea/migrations.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/ObservationForms/ObservationOneActivity.java create mode 100644 app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/ObservationForms/ObservationThreeActivity.java create mode 100644 app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/ObservationForms/ObservationTwoActivity.java create mode 100644 app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/PermitToWorkForms/PermitOneActivity.java create mode 100644 app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/PermitToWorkForms/PermitTwoActivity.java create mode 100644 app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/DepartmentAdapter.java create mode 100644 app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/FormTypeAdapter.java create mode 100644 app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/ObservationClassAdapter.java create mode 100644 app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/ObservationSubClassAdapter.java create mode 100644 app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/RiskLevelAdapter.java create mode 100644 app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/ShiftAdapter.java create mode 100644 app/src/main/java/com/utopiaindustries/hseobservationsapp/models/FormType.java create mode 100644 app/src/main/java/com/utopiaindustries/hseobservationsapp/models/Shift.java create mode 100644 app/src/main/res/drawable/circle_background.xml create mode 100644 app/src/main/res/drawable/ic_close.xml create mode 100644 app/src/main/res/drawable/ic_upload.xml create mode 100644 app/src/main/res/drawable/icon_calendar.xml create mode 100644 app/src/main/res/drawable/icon_image.xml create mode 100644 app/src/main/res/layout/activity_observation_one.xml create mode 100644 app/src/main/res/layout/activity_observation_three.xml create mode 100644 app/src/main/res/layout/activity_observation_two.xml create mode 100644 app/src/main/res/layout/activity_permit_one.xml create mode 100644 app/src/main/res/layout/activity_permit_two.xml create mode 100644 app/src/main/res/layout/custom_layout_for_image.xml create mode 100644 app/src/main/res/layout/list_items.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..b589d56 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml new file mode 100644 index 0000000..b268ef3 --- /dev/null +++ b/.idea/deploymentTargetSelector.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml new file mode 100644 index 0000000..0897082 --- /dev/null +++ b/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/migrations.xml b/.idea/migrations.xml new file mode 100644 index 0000000..f8051a6 --- /dev/null +++ b/.idea/migrations.xml @@ -0,0 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..0ad17cb --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,10 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 87704c6..6021179 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,6 +1,7 @@ + xmlns:tools="http://schemas.android.com/tools" + tools:ignore="DiscouragedApi"> + + + + + + android:exported="true" + android:screenOrientation="portrait"> @@ -41,10 +57,18 @@ + android:exported="true" + android:screenOrientation="portrait" /> - + + + \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/ObservationForms/ObservationOneActivity.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/ObservationForms/ObservationOneActivity.java new file mode 100644 index 0000000..cc5d7e7 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/ObservationForms/ObservationOneActivity.java @@ -0,0 +1,106 @@ +package com.utopiaindustries.hseobservationsapp.activities.ObservationForms; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.AdapterView; +import android.widget.AutoCompleteTextView; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.Toast; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.utopiaindustries.hseobservationsapp.R; +import com.utopiaindustries.hseobservationsapp.adapters.ObservationClassAdapter; +import com.utopiaindustries.hseobservationsapp.adapters.ObservationSubClassAdapter; +import com.utopiaindustries.hseobservationsapp.adapters.ShiftAdapter; +import com.utopiaindustries.hseobservationsapp.models.Shift; + +import java.util.ArrayList; + +public class ObservationOneActivity extends AppCompatActivity { + + private AutoCompleteTextView observationTextview, observationSubTextview; + + private ObservationClassAdapter observationClassAdapter; + private ObservationSubClassAdapter observationSubClassAdapter; + private ArrayList obClassArrayList = new ArrayList<>(); + + private ArrayList obSubClassArrayList = new ArrayList<>(); + + private Button btnNext; + ImageView imgBack; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_observation_one); + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); + return insets; + }); + + initializeLayout(); + + imgBack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + + btnNext.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(ObservationOneActivity.this, ObservationTwoActivity.class); + startActivity(intent); + } + }); + + observationTextview.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + // Perform action when shiftTextview item is clicked + Toast.makeText(ObservationOneActivity.this, "Item clicked: " + obClassArrayList.get(position).getTitle(), Toast.LENGTH_SHORT).show(); + + } + }); + + observationSubTextview.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + // Perform action when shiftTextview item is clicked + Toast.makeText(ObservationOneActivity.this, "Item clicked: " + obSubClassArrayList.get(position).getTitle(), Toast.LENGTH_SHORT).show(); + + } + }); + } + + public void initializeLayout() { + observationTextview = findViewById(R.id.observation_textview); + observationSubTextview = findViewById(R.id.observation_sub_textview); + btnNext = findViewById(R.id.btn_next); + imgBack = findViewById(R.id.img_back); + + obClassArrayList.add(new Shift(1, "Unsafe Act")); + obClassArrayList.add(new Shift(2, "Unsafe Condition")); + obClassArrayList.add(new Shift(3, "Near Miss")); + + observationClassAdapter = new ObservationClassAdapter(this, obClassArrayList); + observationTextview.setAdapter(observationClassAdapter); + + //observation sub class items + //for Unsafe + //for condition + //never miss + observationSubClassAdapter = new ObservationSubClassAdapter(this, obSubClassArrayList); + observationSubTextview.setAdapter(observationSubClassAdapter); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/ObservationForms/ObservationThreeActivity.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/ObservationForms/ObservationThreeActivity.java new file mode 100644 index 0000000..5200d77 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/ObservationForms/ObservationThreeActivity.java @@ -0,0 +1,63 @@ +package com.utopiaindustries.hseobservationsapp.activities.ObservationForms; + +import android.os.Bundle; +import android.view.View; +import android.widget.ImageView; +import android.widget.RadioGroup; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.utopiaindustries.hseobservationsapp.R; + + +public class ObservationThreeActivity extends AppCompatActivity { + + RadioGroup rg1; + ImageView imgBack; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_observation_three); + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); + return insets; + }); + + initializeLayouts(); + + imgBack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + + rg1.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() + { + public void onCheckedChanged(RadioGroup group, int checkedId) { + if (checkedId == R.id.rb_open) { + // do operations specific to this selection + // Toast.makeText(GeneralDetailActivity.this,"GPS Yes",Toast.LENGTH_SHORT).show(); + //bool_gps = true; + } else if (checkedId == R.id.rb_closed) { + // do operations specific to this selection + // Toast.makeText(GeneralDetailActivity.this,"GPS No",Toast.LENGTH_SHORT).show(); + //bool_gps = false; + } + } + }); + } + + private void initializeLayouts() { + + rg1 = findViewById(R.id.rg1); + imgBack = findViewById(R.id.img_back); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/ObservationForms/ObservationTwoActivity.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/ObservationForms/ObservationTwoActivity.java new file mode 100644 index 0000000..65787ba --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/ObservationForms/ObservationTwoActivity.java @@ -0,0 +1,469 @@ +package com.utopiaindustries.hseobservationsapp.activities.ObservationForms; + +import android.Manifest; +import android.content.ActivityNotFoundException; +import android.content.Context; +import android.content.Intent; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Color; +import android.graphics.drawable.ColorDrawable; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.os.Environment; +import android.provider.MediaStore; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.AutoCompleteTextView; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; + +import androidx.activity.EdgeToEdge; +import androidx.activity.result.ActivityResultLauncher; +import androidx.activity.result.contract.ActivityResultContracts; +import androidx.annotation.NonNull; +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.content.FileProvider; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.request.RequestOptions; +import com.utopiaindustries.hseobservationsapp.R; +import com.utopiaindustries.hseobservationsapp.activities.DashboardActivity; +import com.utopiaindustries.hseobservationsapp.activities.LoginActivity; +import com.utopiaindustries.hseobservationsapp.adapters.DepartmentAdapter; +import com.utopiaindustries.hseobservationsapp.adapters.ObservationClassAdapter; +import com.utopiaindustries.hseobservationsapp.adapters.ObservationSubClassAdapter; +import com.utopiaindustries.hseobservationsapp.adapters.RiskLevelAdapter; +import com.utopiaindustries.hseobservationsapp.models.Department; +import com.utopiaindustries.hseobservationsapp.models.Shift; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.function.Consumer; + +import pub.devrel.easypermissions.AfterPermissionGranted; +import pub.devrel.easypermissions.AppSettingsDialog; +import pub.devrel.easypermissions.EasyPermissions; + +public class ObservationTwoActivity extends AppCompatActivity implements EasyPermissions.PermissionCallbacks{ + + private Button btnNext; + ImageView imgBack; + ImageView imgBefore, beforeCrossButton, imgAfter, afterCrossButton; + private AutoCompleteTextView departmentTextview, riskLevelTextview; + + private DepartmentAdapter departmentAdapter; + private RiskLevelAdapter riskLevelAdapter; + + private ArrayList departmentArrayList = new ArrayList<>(); + private ArrayList riskLevelArrayList = new ArrayList<>(); + + private static final int CAMERA_REQUEST = 100; + private static final int GALLERY_REQUEST = 200; + + String filePathBefore = "no_pic"; + String filePathAfter = "no_pic"; + + // Activity Result Launcher for Gallery + private final ActivityResultLauncher imagePickerLauncher = + registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == RESULT_OK && result.getData() != null) { + Uri selectedImage = result.getData().getData(); + + Glide.with(this) + .load(selectedImage) // Glide will handle the decoding and placeholder + .placeholder(R.drawable.img_load) + .apply(new RequestOptions().centerCrop()) + .into(imgBefore); + + uriToByteArrayAsync( + this, + selectedImage, + 200, // Target size in KB + compressedImage -> { + // Handle the compressed image here, e.g., display it + /*runOnUiThread(() -> { + itemModelList.get(selectedPosition).setImageUri(compressedImage); + List tempList = new ArrayList<>(); + tempList.add(compressedImage); + itemModelList.get(selectedPosition).setImageArrayList(tempList); + adapter.notifyItemChanged(selectedPosition); + });*/ + }, + error -> { + // Handle any errors + runOnUiThread(() -> { + Toast.makeText(this, "Error compressing image: " + error.getMessage(), Toast.LENGTH_SHORT).show(); + }); + } + ); + } + else if (result.getResultCode() == RESULT_CANCELED) { + Toast.makeText(this, "Gallery Selection Cancelled!", Toast.LENGTH_SHORT).show(); + } + else { + Toast.makeText(this, "Gallery Selection Cancelled!", Toast.LENGTH_SHORT).show(); + } + }); + + // Activity Result Launcher for Camera + private final ActivityResultLauncher cameraLauncher = + registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + + if (result.getResultCode() == RESULT_OK) { + Uri contentUri = Uri.fromFile(new File((filePathBefore))); + + Glide.with(this) + .load(contentUri) // Glide will handle the decoding and placeholder + .placeholder(R.drawable.img_load) + .apply(new RequestOptions().centerCrop()) + .into(imgAfter); + + uriToByteArrayAsync( + this, + contentUri, + 200, // Target size in KB + compressedImage -> { + // Handle the compressed image here, e.g., display it + /*runOnUiThread(() -> { + itemModelList.get(selectedPosition).setImageUri(compressedImage); + List tempList = new ArrayList<>(); + tempList.add(compressedImage); + itemModelList.get(selectedPosition).setImageArrayList(tempList); + adapter.notifyItemChanged(selectedPosition); + });*/ + }, + error -> { + // Handle any errors + runOnUiThread(() -> { + Toast.makeText(this, "Error compressing image: " + error.getMessage(), Toast.LENGTH_SHORT).show(); + }); + } + ); + } + else if (result.getResultCode() == RESULT_CANCELED) { + Toast.makeText(this, "Camera capture failed!", Toast.LENGTH_SHORT).show(); + } + else { + Toast.makeText(this, "Camera capture failed!", Toast.LENGTH_SHORT).show(); + } + }); + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_observation_two); + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); + return insets; + }); + + initializeLayout(); + + imgBack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + + btnNext.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(ObservationTwoActivity.this, ObservationThreeActivity.class); + startActivity(intent); + } + }); + + imgBefore.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + alertForPictures(ObservationTwoActivity.this, "before"); + } + }); + + imgAfter.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + alertForPictures(ObservationTwoActivity.this, "after"); + } + }); + + beforeCrossButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + } + }); + + afterCrossButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + + } + }); + + departmentTextview.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + + } + }); + + riskLevelTextview.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + + } + }); + } + + private void initializeLayout() { + + btnNext = findViewById(R.id.btn_next); + imgBack = findViewById(R.id.img_back); + + imgBefore = findViewById(R.id.img_before); + imgAfter = findViewById(R.id.img_after); + + beforeCrossButton = findViewById(R.id.before_cross_button); + afterCrossButton = findViewById(R.id.after_cross_button); + + departmentTextview = findViewById(R.id.department_textview); + riskLevelTextview = findViewById(R.id.risk_textview); + + departmentAdapter = new DepartmentAdapter(this, departmentArrayList); + departmentTextview.setAdapter(departmentAdapter); + + riskLevelAdapter = new RiskLevelAdapter(this, riskLevelArrayList); + riskLevelTextview.setAdapter(riskLevelAdapter); + } + + public void alertForPictures(Context con, String imageType) { + ViewGroup viewGroup = findViewById(android.R.id.content); + + TextView dialogCameraBtn, dialogGalleryBtn; + + AlertDialog.Builder builder = new AlertDialog.Builder(con); + View view1 = LayoutInflater.from(con).inflate(R.layout.custom_layout_for_image, viewGroup, false); + builder.setCancelable(false); + builder.setView(view1); + + dialogCameraBtn = view1.findViewById(R.id.dialog_camera_btn); + dialogGalleryBtn = view1.findViewById(R.id.dialog_gallery_btn); + + AlertDialog alertDialog = builder.create(); + alertDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); + + dialogCameraBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + alertDialog.dismiss(); + openCamera(imageType); + + } + }); + + dialogGalleryBtn.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View view) { + + alertDialog.dismiss(); + openGallery(imageType); + + } + }); + + alertDialog.show(); + } + + @AfterPermissionGranted(CAMERA_REQUEST) + public void openCamera(String imgType) { + if (hasCameraPermission()) { + try { + Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); + File photoFile = null; + try { + photoFile = createImageFile(imgType); + } catch (IOException ex) { + // Error occurred while creating the File + } + + if (photoFile != null) { + Uri photoURI = FileProvider.getUriForFile(this, + "com.utopiaindustries.hseobservationsapp", + photoFile); + takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); + //startActivityForResult(takePictureIntent, CAMERA_REQUEST); + cameraLauncher.launch(takePictureIntent); + } + } catch (ActivityNotFoundException e) { + Toast.makeText(this, "Camera app not found", Toast.LENGTH_SHORT).show(); + } + } else { + // Ask for one permission + String[] perms = {}; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.CAMERA}; + } else { + perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}; + } + + EasyPermissions.requestPermissions(this, getString(R.string.rationale_camera), CAMERA_REQUEST, perms); + } + } + + @AfterPermissionGranted(GALLERY_REQUEST) + public void openGallery(String imgType) { + if (hasGalleryPermission()) { + // Have permission, do the thing! + Intent galleryIntent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); + // Start the Intent + //startActivityForResult(galleryIntent, GALLERY_REQUEST); + imagePickerLauncher.launch(galleryIntent); + } else { + // Ask for one permission + String[] perms = {}; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES}; + } else { + perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + + } + EasyPermissions.requestPermissions(this, getString(R.string.rationale_gallery), GALLERY_REQUEST, perms); + } + } + + private boolean hasGalleryPermission() { + String[] perms = {}; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES}; + } else { + perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE}; + } + + return EasyPermissions.hasPermissions(this, perms); + } + + private boolean hasCameraPermission() { + String[] perms = {}; + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + //Log.e("TIRAMISU: ","***"); + perms = new String[]{Manifest.permission.READ_MEDIA_IMAGES, Manifest.permission.CAMERA}; + } else { + //Log.e("Not-TIRAMISU: ","***"); + perms = new String[]{Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.CAMERA}; + + } + + //Log.e("perms: ",""+perms); + return EasyPermissions.hasPermissions(this, perms); + } + + private File createImageFile(String imgType) throws IOException { + // Create an image file name + String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date()); + String imageFileName = "JPEG_" + timeStamp + "_"; + File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES); + File image = File.createTempFile( + imageFileName, /* prefix */ + ".jpg", /* suffix */ + storageDir /* directory */ + ); + + if (imgType.equals("before")) { + filePathBefore = image.getAbsolutePath(); + } + else { + filePathAfter = image.getAbsolutePath(); + } + + return image; + } + + public void uriToByteArrayAsync( + Context context, + Uri uri, + int targetSizeInKB, + Consumer onSuccess, + Consumer onError + ) { + new Thread(() -> { + try { + int targetSizeInBytes = targetSizeInKB * 1024; + + // Load the image as a Bitmap without scaling + Bitmap bitmap; + try (InputStream inputStream = context.getContentResolver().openInputStream(uri)) { + bitmap = BitmapFactory.decodeStream(inputStream); + } + + if (bitmap == null) { + throw new IOException("Failed to decode image from URI."); + } + + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + int minQuality = 10; + int maxQuality = 100; + int quality = maxQuality; + + // Binary search for the best quality that meets the target size + while (minQuality <= maxQuality) { + byteArrayOutputStream.reset(); + bitmap.compress(Bitmap.CompressFormat.JPEG, quality, byteArrayOutputStream); + + int byteSize = byteArrayOutputStream.size(); + if (byteSize > targetSizeInBytes) { + maxQuality = quality - 1; + } else { + minQuality = quality + 1; + } + quality = (minQuality + maxQuality) / 2; + } + + onSuccess.accept(byteArrayOutputStream.toByteArray()); + } catch (IOException e) { + onError.accept(e); + } + }).start(); + } + + @Override + public void onPermissionsGranted(int requestCode, @NonNull List perms) { + + } + + @Override + public void onPermissionsDenied(int requestCode, @NonNull List perms) { + if (EasyPermissions.somePermissionPermanentlyDenied(this, perms)) { + new AppSettingsDialog.Builder(this).build().show(); + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + // EasyPermissions handles the request result. + EasyPermissions.onRequestPermissionsResult(requestCode, permissions, grantResults, this); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/PermitToWorkForms/PermitOneActivity.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/PermitToWorkForms/PermitOneActivity.java new file mode 100644 index 0000000..4de81b2 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/PermitToWorkForms/PermitOneActivity.java @@ -0,0 +1,60 @@ +package com.utopiaindustries.hseobservationsapp.activities.PermitToWorkForms; + +import android.content.Intent; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.utopiaindustries.hseobservationsapp.R; +import com.utopiaindustries.hseobservationsapp.activities.ObservationForms.ObservationThreeActivity; +import com.utopiaindustries.hseobservationsapp.activities.ObservationForms.ObservationTwoActivity; + +public class PermitOneActivity extends AppCompatActivity { + + private Button btnNext; + ImageView imgBack; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_permit_one); + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); + return insets; + }); + + initializeLayout(); + + imgBack.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + finish(); + } + }); + + btnNext.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + /*Intent intent = new Intent(PermitOneActivity.this, ObservationThreeActivity.class); + startActivity(intent);*/ + } + }); + + } + + private void initializeLayout() { + + btnNext = findViewById(R.id.btn_next); + imgBack = findViewById(R.id.img_back); + + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/PermitToWorkForms/PermitTwoActivity.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/PermitToWorkForms/PermitTwoActivity.java new file mode 100644 index 0000000..5deabf7 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/activities/PermitToWorkForms/PermitTwoActivity.java @@ -0,0 +1,26 @@ +package com.utopiaindustries.hseobservationsapp.activities.PermitToWorkForms; + +import android.os.Bundle; + +import androidx.activity.EdgeToEdge; +import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowInsetsCompat; + +import com.utopiaindustries.hseobservationsapp.R; + +public class PermitTwoActivity extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + EdgeToEdge.enable(this); + setContentView(R.layout.activity_permit_two); + ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> { + Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars()); + v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom); + return insets; + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/DepartmentAdapter.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/DepartmentAdapter.java new file mode 100644 index 0000000..e2043aa --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/DepartmentAdapter.java @@ -0,0 +1,40 @@ +package com.utopiaindustries.hseobservationsapp.adapters; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.TextView; + +import com.utopiaindustries.hseobservationsapp.R; +import com.utopiaindustries.hseobservationsapp.models.Shift; + +import java.util.List; + +public class DepartmentAdapter extends ArrayAdapter { + + private final Context context; + private final List items; + + public DepartmentAdapter(Context context, List items) { + super(context, 0, items); + this.context = context; + this.items = items; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = LayoutInflater.from(context).inflate(R.layout.list_items, parent, false); + } + + Shift item = items.get(position); + + TextView titleTextView = convertView.findViewById(R.id.item_text); + + titleTextView.setText(item.getTitle()); + + return convertView; + } +} diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/FormTypeAdapter.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/FormTypeAdapter.java new file mode 100644 index 0000000..f060771 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/FormTypeAdapter.java @@ -0,0 +1,41 @@ +package com.utopiaindustries.hseobservationsapp.adapters; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.TextView; + +import com.utopiaindustries.hseobservationsapp.R; +import com.utopiaindustries.hseobservationsapp.models.FormType; +import com.utopiaindustries.hseobservationsapp.models.LocationSite; + +import java.util.List; + +public class FormTypeAdapter extends ArrayAdapter { + + private final Context context; + private final List items; + + public FormTypeAdapter(Context context, List items) { + super(context, 0, items); + this.context = context; + this.items = items; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = LayoutInflater.from(context).inflate(R.layout.list_items, parent, false); + } + + FormType item = items.get(position); + + TextView titleTextView = convertView.findViewById(R.id.item_text); + + titleTextView.setText(item.getTitle()); + + return convertView; + } +} diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/ObservationClassAdapter.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/ObservationClassAdapter.java new file mode 100644 index 0000000..9209b03 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/ObservationClassAdapter.java @@ -0,0 +1,40 @@ +package com.utopiaindustries.hseobservationsapp.adapters; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.TextView; + +import com.utopiaindustries.hseobservationsapp.R; +import com.utopiaindustries.hseobservationsapp.models.Shift; + +import java.util.List; + +public class ObservationClassAdapter extends ArrayAdapter { + + private final Context context; + private final List items; + + public ObservationClassAdapter(Context context, List items) { + super(context, 0, items); + this.context = context; + this.items = items; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = LayoutInflater.from(context).inflate(R.layout.list_items, parent, false); + } + + Shift item = items.get(position); + + TextView titleTextView = convertView.findViewById(R.id.item_text); + + titleTextView.setText(item.getTitle()); + + return convertView; + } +} diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/ObservationSubClassAdapter.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/ObservationSubClassAdapter.java new file mode 100644 index 0000000..284b923 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/ObservationSubClassAdapter.java @@ -0,0 +1,40 @@ +package com.utopiaindustries.hseobservationsapp.adapters; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.TextView; + +import com.utopiaindustries.hseobservationsapp.R; +import com.utopiaindustries.hseobservationsapp.models.Shift; + +import java.util.List; + +public class ObservationSubClassAdapter extends ArrayAdapter { + + private final Context context; + private final List items; + + public ObservationSubClassAdapter(Context context, List items) { + super(context, 0, items); + this.context = context; + this.items = items; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = LayoutInflater.from(context).inflate(R.layout.list_items, parent, false); + } + + Shift item = items.get(position); + + TextView titleTextView = convertView.findViewById(R.id.item_text); + + titleTextView.setText(item.getTitle()); + + return convertView; + } +} diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/RiskLevelAdapter.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/RiskLevelAdapter.java new file mode 100644 index 0000000..233f76b --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/RiskLevelAdapter.java @@ -0,0 +1,40 @@ +package com.utopiaindustries.hseobservationsapp.adapters; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.TextView; + +import com.utopiaindustries.hseobservationsapp.R; +import com.utopiaindustries.hseobservationsapp.models.Shift; + +import java.util.List; + +public class RiskLevelAdapter extends ArrayAdapter { + + private final Context context; + private final List items; + + public RiskLevelAdapter(Context context, List items) { + super(context, 0, items); + this.context = context; + this.items = items; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = LayoutInflater.from(context).inflate(R.layout.list_items, parent, false); + } + + Shift item = items.get(position); + + TextView titleTextView = convertView.findViewById(R.id.item_text); + + titleTextView.setText(item.getTitle()); + + return convertView; + } +} diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/ShiftAdapter.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/ShiftAdapter.java new file mode 100644 index 0000000..5c8444d --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/adapters/ShiftAdapter.java @@ -0,0 +1,41 @@ +package com.utopiaindustries.hseobservationsapp.adapters; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ArrayAdapter; +import android.widget.TextView; + +import com.utopiaindustries.hseobservationsapp.R; +import com.utopiaindustries.hseobservationsapp.models.LocationSite; +import com.utopiaindustries.hseobservationsapp.models.Shift; + +import java.util.List; + +public class ShiftAdapter extends ArrayAdapter { + + private final Context context; + private final List items; + + public ShiftAdapter(Context context, List items) { + super(context, 0, items); + this.context = context; + this.items = items; + } + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + if (convertView == null) { + convertView = LayoutInflater.from(context).inflate(R.layout.list_items, parent, false); + } + + Shift item = items.get(position); + + TextView titleTextView = convertView.findViewById(R.id.item_text); + + titleTextView.setText(item.getTitle()); + + return convertView; + } +} diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/fragments/DraftFragment.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/fragments/DraftFragment.java index f886a5d..1b166b5 100644 --- a/app/src/main/java/com/utopiaindustries/hseobservationsapp/fragments/DraftFragment.java +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/fragments/DraftFragment.java @@ -19,9 +19,16 @@ public class DraftFragment extends Fragment { } @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_draft, container, false); + + View view = inflater.inflate(R.layout.fragment_draft , container, false ); + + initializeLayout(view); + return view; + } + + public void initializeLayout(View view) { + } } \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/fragments/HomeFragment.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/fragments/HomeFragment.java index 84dc442..7285539 100644 --- a/app/src/main/java/com/utopiaindustries/hseobservationsapp/fragments/HomeFragment.java +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/fragments/HomeFragment.java @@ -1,5 +1,8 @@ package com.utopiaindustries.hseobservationsapp.fragments; +import android.app.DatePickerDialog; +import android.content.Context; +import android.content.Intent; import android.os.Bundle; import androidx.annotation.Nullable; @@ -8,20 +11,140 @@ import androidx.fragment.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.AdapterView; +import android.widget.AutoCompleteTextView; +import android.widget.Button; +import android.widget.DatePicker; +import android.widget.ImageView; +import android.widget.TextView; +import android.widget.Toast; import com.utopiaindustries.hseobservationsapp.R; +import com.utopiaindustries.hseobservationsapp.activities.ObservationForms.ObservationOneActivity; +import com.utopiaindustries.hseobservationsapp.adapters.FormTypeAdapter; +import com.utopiaindustries.hseobservationsapp.adapters.ShiftAdapter; +import com.utopiaindustries.hseobservationsapp.models.FormType; +import com.utopiaindustries.hseobservationsapp.models.Shift; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Locale; public class HomeFragment extends Fragment { + private int year, month, day; + private Calendar calendar; + private TextView txtUserName, txtDate; + private ImageView imgCalendar; + private Button btnNext; + private AutoCompleteTextView shiftTextview, formTextview; + + private ShiftAdapter shiftAdapter; + private ArrayList shiftArrayList = new ArrayList<>(); + + private FormTypeAdapter formTypeAdapter; + private ArrayList formArrayList = new ArrayList<>(); + @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_home, container, false); + View view = inflater.inflate(R.layout.fragment_home , container, false ); + + initializeLayout(view); + + txtUserName.setText("Supervisor Name"); + + imgCalendar.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showDatePickerDialog(getActivity()); + } + }); + + shiftTextview.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + // Perform action when shiftTextview item is clicked + Toast.makeText(getActivity(), "Item clicked: " + shiftArrayList.get(position).getTitle(), Toast.LENGTH_SHORT).show(); + + } + }); + + formTextview.setOnItemClickListener(new AdapterView.OnItemClickListener() { + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + // Perform action when formTextview item is clicked + Toast.makeText(getActivity(), "Item clicked: " + formArrayList.get(position).getTitle(), Toast.LENGTH_SHORT).show(); + + } + }); + + btnNext.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + Intent intent = new Intent(getActivity(), ObservationOneActivity.class); + startActivity(intent); + } + }); + + + return view; + } + + public void initializeLayout(View view) { + calendar = Calendar.getInstance(); + year = calendar.get(Calendar.YEAR); + month = calendar.get(Calendar.MONTH); + day = calendar.get(Calendar.DAY_OF_MONTH); + txtUserName = view.findViewById(R.id.txt_user_name); + txtDate = view.findViewById(R.id.txt_date); + imgCalendar = view.findViewById(R.id.img_calendar); + btnNext = view.findViewById(R.id.btn_next); + + shiftTextview = view.findViewById(R.id.shift_textview); + formTextview = view.findViewById(R.id.form_textview); + + shiftArrayList.add(new Shift(1, "General Shift(08:00AM - 05:00PM)")); + shiftArrayList.add(new Shift(2, "Evening Shift(12:00PM - 09:00PM)")); + shiftArrayList.add(new Shift(3, "Night Shift(09:00PM - 06:00AM)")); + + shiftAdapter = new ShiftAdapter(getActivity(), shiftArrayList); + shiftTextview.setAdapter(shiftAdapter); + + formArrayList.add(new FormType(1, "Observation Form")); + formArrayList.add(new FormType(2, "Permit To Work Form")); + formArrayList.add(new FormType(3, "HSE Training Form")); + formArrayList.add(new FormType(4, "Injury Record Form")); + formArrayList.add(new FormType(5, "Weekly Activities Form")); + formArrayList.add(new FormType(6, "Progressive Activities Form")); + formArrayList.add(new FormType(7, "Other HSE Form")); + + formTypeAdapter = new FormTypeAdapter(getActivity(), formArrayList); + formTextview.setAdapter(formTypeAdapter); + } + + private void showDatePickerDialog(Context context) { + DatePickerDialog datePickerDialog = new DatePickerDialog( + context, + new DatePickerDialog.OnDateSetListener() { + @Override + public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { + // Month is 0-indexed, so we add 1 + Calendar selectedCalendar = Calendar.getInstance(); + selectedCalendar.set(year, monthOfYear, dayOfMonth); + SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy", Locale.getDefault()); + String selectedDate = dateFormat.format(selectedCalendar.getTime()); + txtDate.setText(selectedDate); + } + }, + year, month, day + ); + datePickerDialog.show(); } } \ No newline at end of file diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/models/FormType.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/models/FormType.java new file mode 100644 index 0000000..57717d9 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/models/FormType.java @@ -0,0 +1,41 @@ + +package com.utopiaindustries.hseobservationsapp.models; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +public class FormType { + + @SerializedName("id") + @Expose + private Integer id; + @SerializedName("title") + @Expose + private String title; + + public FormType(Integer id, String title) { + this.id = id; + this.title = title; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + @Override + public String toString() { + return title; + } +} diff --git a/app/src/main/java/com/utopiaindustries/hseobservationsapp/models/Shift.java b/app/src/main/java/com/utopiaindustries/hseobservationsapp/models/Shift.java new file mode 100644 index 0000000..df3d5d7 --- /dev/null +++ b/app/src/main/java/com/utopiaindustries/hseobservationsapp/models/Shift.java @@ -0,0 +1,41 @@ + +package com.utopiaindustries.hseobservationsapp.models; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +public class Shift { + + @SerializedName("id") + @Expose + private Integer id; + @SerializedName("title") + @Expose + private String title; + + public Shift(Integer id, String title) { + this.id = id; + this.title = title; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + @Override + public String toString() { + return title; + } +} diff --git a/app/src/main/res/drawable/circle_background.xml b/app/src/main/res/drawable/circle_background.xml new file mode 100644 index 0000000..274e668 --- /dev/null +++ b/app/src/main/res/drawable/circle_background.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_close.xml b/app/src/main/res/drawable/ic_close.xml new file mode 100644 index 0000000..bcc56a1 --- /dev/null +++ b/app/src/main/res/drawable/ic_close.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_upload.xml b/app/src/main/res/drawable/ic_upload.xml new file mode 100644 index 0000000..7f56d73 --- /dev/null +++ b/app/src/main/res/drawable/ic_upload.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/icon_calendar.xml b/app/src/main/res/drawable/icon_calendar.xml new file mode 100644 index 0000000..0f090ec --- /dev/null +++ b/app/src/main/res/drawable/icon_calendar.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/drawable/icon_image.xml b/app/src/main/res/drawable/icon_image.xml new file mode 100644 index 0000000..0d99105 --- /dev/null +++ b/app/src/main/res/drawable/icon_image.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/layout/activity_dashboard.xml b/app/src/main/res/layout/activity_dashboard.xml index d1ec7fd..832e86d 100644 --- a/app/src/main/res/layout/activity_dashboard.xml +++ b/app/src/main/res/layout/activity_dashboard.xml @@ -52,12 +52,8 @@ app:srcCompat="@drawable/ic_logout" /> + app:tabMaxWidth="0dp" + app:tabMode="fixed" /> + + + + + + + + + + + + + + + + + + + + + + + + + + +