Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 23 additions & 2 deletions app/build.gradle
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
apply plugin: 'com.android.application'

android {
compileSdkVersion 29
compileSdkVersion 28
buildToolsVersion "29.0.3"

defaultConfig {
applicationId "com.ichangemycity.ichangemycommunity"
minSdkVersion 19
minSdkVersion 21
targetSdkVersion 29
versionCode 1
versionName "1.0"
Expand All @@ -28,6 +28,9 @@ android {
}

dependencies {

def camerax_version = "1.0.0-rc01"

implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.0.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
Expand Down Expand Up @@ -64,4 +67,22 @@ dependencies {

// Cluster Markers
implementation 'com.google.maps.android:android-maps-utils:2.1.0'

// CameraX core library using camera2 implementation
implementation "androidx.camera:camera-camera2:$camerax_version"

// CameraX Lifecycle Library
implementation "androidx.camera:camera-lifecycle:$camerax_version"

// CameraX View class
implementation "androidx.camera:camera-view:1.0.0-alpha20"
implementation "androidx.camera:camera-core:${camerax_version}"

implementation "com.android.support:support-v4:28.0.0"
implementation "com.android.support:support-v13:28.0.0"
implementation "com.android.support:cardview-v7:28.0.0"
implementation "com.android.support:appcompat-v7:28.0.0"


implementation 'com.android.support:recyclerview-v7:28.0.0'
}
5 changes: 4 additions & 1 deletion app/src/main/AndroidManifest.xml
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-feature android:name="android.hardware.camera.any" />
<uses-permission android:name="android.permission.CAMERA" />

<application
android:name=".utils.map.UserClient"
Expand All @@ -50,6 +52,7 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ui.activities.CameraActivity"/>

<!--
The API key for Google Maps-based APIs is defined as a string resource.
Expand All @@ -72,4 +75,4 @@

</application>

</manifest>
</manifest>
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.ichangemycity.ichangemycommunity.model;

import android.graphics.Bitmap;

public class LuminosityRowItem {

private Bitmap image;
private float lumens;

public LuminosityRowItem(Bitmap image, float lumens) {
this.image = image;
this.lumens = lumens;
}

public Bitmap getImage() {
return image;
}

public float getLumens() {
return lumens;
}

public void setImage(Bitmap image) {
this.image = image;
}

public void setLumens(float lumens) {
this.lumens = lumens;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.ichangemycity.ichangemycommunity.model;

import java.util.ArrayList;

//TODO: Modify accordingly. Survey questions model coming from backend
public class SurveyQuestions {

private String question;
private ArrayList<String> options;

public SurveyQuestions(String question, ArrayList<String> options) {
this.question = question;
this.options = options;
}

public String getQuestion() {
return question;
}

public void setQuestion(String question) {
this.question = question;
}

public ArrayList<String> getOptions() {
return options;
}

public void setOptions(ArrayList<String> options) {
this.options = options;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
package com.ichangemycity.ichangemycommunity.ui.activities;

import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;
import androidx.camera.core.CameraSelector;
import androidx.camera.core.ImageCapture;
import androidx.camera.core.ImageCaptureException;
import androidx.camera.core.Preview;
import androidx.camera.lifecycle.ProcessCameraProvider;
import androidx.camera.view.PreviewView;
import androidx.core.content.ContextCompat;
import androidx.lifecycle.LifecycleOwner;

import com.google.common.util.concurrent.ListenableFuture;
import com.ichangemycity.ichangemycommunity.R;
import com.ichangemycity.ichangemycommunity.utils.camera.CameraUtils;

import java.io.File;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executors;

public class CameraActivity extends AppCompatActivity {

private CameraUtils cameraUtils;
private Button mCaptureBtn;
private static final String FILENAME = "yyyy-MM-dd-HH-mm-ss-SSS";
private static final String PHOTO_EXTENSION = ".jpg";
Preview preview;
ImageCapture imageCapture;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.camera_activity);

cameraUtils = new CameraUtils();
cameraUtils.verifyStoragePermissions(this);
mCaptureBtn = findViewById(R.id.camera_capture_button);

PreviewView previewView = findViewById(R.id.viewFinder);
startCamera(previewView);

mCaptureBtn.setOnClickListener(new View.OnClickListener() {
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onClick(View v) {
captureImage();
}
});
}

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
private void captureImage() {

File photoFile = cameraUtils.createFile(cameraUtils.getOutputDirectory(this), FILENAME, PHOTO_EXTENSION);

ImageCapture.OutputFileOptions outputFileOptions = new ImageCapture.OutputFileOptions.Builder(photoFile).build();

imageCapture.takePicture(outputFileOptions, Executors.newSingleThreadExecutor(),
new ImageCapture.OnImageSavedCallback() {
@Override
public void onImageSaved(ImageCapture.OutputFileResults outputFileResults) {
Uri savedUri = Uri.fromFile(photoFile);
}

@Override
public void onError(ImageCaptureException error) {
Log.d("TAG", error.toString());

}
});
}

private void startCamera(PreviewView previewView) {
ListenableFuture<ProcessCameraProvider> cameraProviderFuture = ProcessCameraProvider.getInstance(this);
cameraProviderFuture.addListener(() -> {
try {
ProcessCameraProvider cameraProvider = cameraProviderFuture.get();
bindPreviewAndImageCapture(cameraProvider, previewView);
} catch (ExecutionException | InterruptedException e) {
// No errors need to be handled for this Future.
// This should never be reached.
}
}, ContextCompat.getMainExecutor(this));
}

public void bindPreviewAndImageCapture(@NonNull ProcessCameraProvider cameraProvider, PreviewView previewView) {

preview = new Preview.Builder().build();
imageCapture = new ImageCapture.Builder().setTargetRotation(previewView.getDisplay().getRotation()).build();


CameraSelector cameraSelector = new CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build();

preview.setSurfaceProvider(previewView.getSurfaceProvider());

cameraProvider.unbindAll();
cameraProvider.bindToLifecycle((LifecycleOwner) this, cameraSelector, preview, imageCapture);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.ichangemycity.ichangemycommunity.ui.adapters;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.ichangemycity.ichangemycommunity.R;
import com.ichangemycity.ichangemycommunity.model.LuminosityRowItem;

public class LuminosityAdapter extends RecyclerView.Adapter<LuminosityAdapter.ViewHolder> {

private LuminosityRowItem luminosityData[];

public static class ViewHolder extends RecyclerView.ViewHolder {
private final TextView thumbnailText;
private final ImageView thumbnail;

public ViewHolder(View view) {
super(view);
thumbnail = view.findViewById(R.id.thumbnail);
thumbnailText = view.findViewById(R.id.thumbnail_text);
}

public TextView getThumbnailText() {
return thumbnailText;
}

public ImageView getThumbnail() {
return thumbnail;
}
}

public LuminosityAdapter(LuminosityRowItem luminosityData[]) {
this.luminosityData = luminosityData;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.recycler_view_item, parent, false);

return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.thumbnail.setImageBitmap(luminosityData[position].getImage());
holder.thumbnailText.setText(luminosityData[position].getLumens() + " Lumens");
}

@Override
public int getItemCount() {
return luminosityData.length;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package com.ichangemycity.ichangemycommunity.ui.adapters;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RadioGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.ichangemycity.ichangemycommunity.R;
import com.ichangemycity.ichangemycommunity.model.LuminosityRowItem;
import com.ichangemycity.ichangemycommunity.model.SurveyQuestions;

public class SurveyQuestionsAdapter extends RecyclerView.Adapter<SurveyQuestionsAdapter.ViewHolder> {

private SurveyQuestions surveyQuestions[];

public static class ViewHolder extends RecyclerView.ViewHolder {
private final TextView question;
private final RadioGroup options;

public ViewHolder(View view) {
super(view);
options = view.findViewById(R.id.thumbnail);
question = view.findViewById(R.id.thumbnail_text);
}

public TextView getQuestion() {
return question;
}

public RadioGroup getOptions() {
return options;
}
}

public SurveyQuestionsAdapter(SurveyQuestions surveyQuestions[]) {
this.surveyQuestions = surveyQuestions;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.recycler_view_item, parent, false);

return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

/*holder.options.setImageBitmap(surveyQuestions[position].getImage());
holder.question.setText(surveyQuestions[position].getLumens() + " Lumens");*/
}

@Override
public int getItemCount() {
return surveyQuestions.length;
}
}
Loading