diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 5ab29eb77c06d72ba595ade50586e2ac01386fe2..caf2d72682ce009abd1b8a06794fd9de9ce4e9e3 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -53,6 +53,10 @@ dependencies { implementation("androidx.constraintlayout:constraintlayout:2.1.4") implementation("com.google.android.gms:play-services-maps:18.2.0") implementation("com.google.android.gms:play-services-location:21.2.0") + implementation("androidx.camera:camera-core:1.3.2") + implementation("androidx.camera:camera-camera2:1.3.2") + implementation("androidx.camera:camera-lifecycle:1.3.2") + implementation("androidx.camera:camera-view:1.3.2") testImplementation("junit:junit:4.13.2") androidTestImplementation("androidx.test.ext:junit:1.1.5") androidTestImplementation("androidx.test.espresso:espresso-core:3.5.1") diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index be7d3d82f7d11567fd5de6b97e21e8e5d6f85500..b178ced007c8bd0cb61ff60377acf662ad7a7f03 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -5,6 +5,10 @@ <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> + <uses-permission android:name="android.permission.CAMERA" /> + <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> + <uses-feature android:name="android.hardware.camera.any" /> + <application android:allowBackup="true" android:icon="@mipmap/ic_primary_logo" diff --git a/app/src/main/java/com/example/nerbos/fragments/scan/ScanFragment.kt b/app/src/main/java/com/example/nerbos/fragments/scan/ScanFragment.kt index 7161de166dfce509711fa63ec72839a9684b2105..4183f233a2501dff427b704d1b569f63f7f3b4a5 100644 --- a/app/src/main/java/com/example/nerbos/fragments/scan/ScanFragment.kt +++ b/app/src/main/java/com/example/nerbos/fragments/scan/ScanFragment.kt @@ -5,56 +5,64 @@ import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.camera.core.CameraSelector +import androidx.camera.core.Preview +import androidx.camera.lifecycle.ProcessCameraProvider +import androidx.camera.view.PreviewView +import androidx.core.content.ContextCompat import com.example.nerbos.R +import java.util.concurrent.ExecutorService +import java.util.concurrent.Executors -// TODO: Rename parameter arguments, choose names that match -// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER -private const val ARG_PARAM1 = "param1" -private const val ARG_PARAM2 = "param2" - -/** - * A simple [Fragment] subclass. - * Use the [ScanFragment.newInstance] factory method to - * create an instance of this fragment. - */ class ScanFragment : Fragment() { - // TODO: Rename and change types of parameters - private var param1: String? = null - private var param2: String? = null - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - arguments?.let { - param1 = it.getString(ARG_PARAM1) - param2 = it.getString(ARG_PARAM2) - } - } + + private lateinit var previewView: PreviewView + private lateinit var cameraExecutor: ExecutorService override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { // Inflate the layout for this fragment - return inflater.inflate(R.layout.fragment_scan, container, false) + val view = inflater.inflate(R.layout.fragment_scan, container, false) + previewView = view.findViewById(R.id.previewView) + return view + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + cameraExecutor = Executors.newSingleThreadExecutor() + + startCamera() } - companion object { - /** - * Use this factory method to create a new instance of - * this fragment using the provided parameters. - * - * @param param1 Parameter 1. - * @param param2 Parameter 2. - * @return A new instance of fragment Scan. - */ - // TODO: Rename and change types and number of parameters - @JvmStatic - fun newInstance(param1: String, param2: String) = - ScanFragment().apply { - arguments = Bundle().apply { - putString(ARG_PARAM1, param1) - putString(ARG_PARAM2, param2) + private fun startCamera() { + val cameraProviderFuture = ProcessCameraProvider.getInstance(requireContext()) + + cameraProviderFuture.addListener({ + val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get() + + val preview = Preview.Builder() + .build() + .also { + it.setSurfaceProvider(previewView.surfaceProvider) } + + val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA + + try { + cameraProvider.unbindAll() + cameraProvider.bindToLifecycle(this, cameraSelector, preview) + } catch (e: Exception) { + e.printStackTrace() } + + }, ContextCompat.getMainExecutor(requireContext())) + } + + override fun onDestroy() { + super.onDestroy() + cameraExecutor.shutdown() } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_scan.xml b/app/src/main/res/layout/fragment_scan.xml index 193a7384f6056c7253520fb441d76721006f1626..d49b6bd4570ec92fe5e464fa1d98088fbdef3039 100644 --- a/app/src/main/res/layout/fragment_scan.xml +++ b/app/src/main/res/layout/fragment_scan.xml @@ -3,14 +3,59 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" + android:background="@color/primary_bg" tools:context=".fragments.scan.ScanFragment"> - <!-- TODO: Update blank fragment layout --> - <TextView - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="Scan Fragment" - android:textSize="26dp" - android:layout_gravity="center" /> + <LinearLayout + android:id="@+id/scanVerticalLayout" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical"> + + <Space + android:layout_width="match_parent" + android:layout_height="75dp" /> + + <androidx.camera.view.PreviewView + android:id="@+id/previewView" + android:layout_width="300dp" + android:layout_height="400dp" + android:layout_gravity="center" /> + + <LinearLayout + android:id="@+id/scanHorizontalLayout" + android:layout_width="300dp" + android:layout_height="180dp" + android:layout_gravity="center" + android:orientation="horizontal"> + + <ImageButton + android:id="@+id/captureButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:contentDescription="@string/capture_button" + android:src="@android:drawable/ic_menu_camera" /> + + <Space + android:layout_width="0dp" + android:layout_height="wrap_content" + android:layout_weight="1" /> + + <ImageButton + android:id="@+id/galleryButton" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="center" + android:contentDescription="@string/gallery_button" + android:src="@android:drawable/ic_menu_gallery" /> + + </LinearLayout> + + <Space + android:layout_width="match_parent" + android:layout_height="75dp" /> + + </LinearLayout> </FrameLayout> \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index b51f00d92c3c5c419c3fcef21dbcad43b7184dca..f22dee3922939bc83d4f1650e68e0bc2233df33f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -51,5 +51,7 @@ <string name="network_sensing_string">No Internet Connection Please check your connection and try again.</string> <string name="close_button">Close Button</string> <string name="pie_chart">Pie Chart</string> + <string name="capture_button">Capture Button</string> + <string name="gallery_button">Gallery Button</string> </resources> \ No newline at end of file