Merge branch 'feature/nutritionix-api-integration' of s407312/photoeat into master

This commit is contained in:
Michał Szczepanowski 2018-12-19 12:46:07 +00:00 committed by Gogs
commit 49db39ff8b
10 changed files with 345 additions and 4 deletions

View File

@ -20,6 +20,16 @@ android {
sourceCompatibility = '1.8' sourceCompatibility = '1.8'
targetCompatibility = '1.8' targetCompatibility = '1.8'
} }
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/LICENSE'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/license.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/notice.txt'
exclude 'META-INF/ASL2.0'
}
} }
dependencies { dependencies {
@ -32,4 +42,7 @@ dependencies {
implementation 'com.android.support:cardview-v7:26.1.0' implementation 'com.android.support:cardview-v7:26.1.0'
implementation 'com.android.support:recyclerview-v7:26.1.0' implementation 'com.android.support:recyclerview-v7:26.1.0'
implementation 'com.ibm.watson.developer_cloud:java-sdk:6.9.0' implementation 'com.ibm.watson.developer_cloud:java-sdk:6.9.0'
// https://mvnrepository.com/artifact/com.google.http-client/google-http-client
implementation 'com.google.http-client:google-http-client:1.27.0'
} }

View File

@ -31,6 +31,7 @@
</provider> </provider>
<activity android:name=".ArchiveActivity" android:label="@string/archive"></activity> <activity android:name=".ArchiveActivity" android:label="@string/archive"></activity>
<activity android:name=".TestNutritionixActivity" android:label="Nutritionix"></activity>
</application> </application>
</manifest> </manifest>

View File

@ -3,6 +3,8 @@ package com.krokogator.photoeat;
import android.content.Intent; import android.content.Intent;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.BitmapFactory; import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.media.ExifInterface;
import android.net.Uri; import android.net.Uri;
import android.os.Bundle; import android.os.Bundle;
import android.os.Environment; import android.os.Environment;
@ -14,7 +16,9 @@ import android.view.View;
import android.widget.Button; import android.widget.Button;
import android.widget.ImageView; import android.widget.ImageView;
import java.io.ByteArrayOutputStream;
import java.io.File; import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.Date; import java.util.Date;
@ -25,6 +29,8 @@ public class MainActivity extends AppCompatActivity {
ImageView photo_preview; ImageView photo_preview;
File newFile;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
@ -32,6 +38,7 @@ public class MainActivity extends AppCompatActivity {
Button btnCamera = (Button) findViewById(R.id.button_take_photo); Button btnCamera = (Button) findViewById(R.id.button_take_photo);
Button btnArchive = (Button) findViewById(R.id.button_archive); Button btnArchive = (Button) findViewById(R.id.button_archive);
Button btnNutritionix = (Button) findViewById(R.id.button_nutritionix);
btnCamera.setOnClickListener(new View.OnClickListener() { btnCamera.setOnClickListener(new View.OnClickListener() {
@Override @Override
@ -47,6 +54,11 @@ public class MainActivity extends AppCompatActivity {
startActivity(intent); startActivity(intent);
}); });
btnNutritionix.setOnClickListener((view) -> {
Intent intent = new Intent(this, TestNutritionixActivity.class);
startActivity(intent);
});
} }
@ -87,15 +99,90 @@ public class MainActivity extends AppCompatActivity {
"com.krokogator.photoeat.android.fileprovider", "com.krokogator.photoeat.android.fileprovider",
photoFile); photoFile);
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI); takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
newFile = photoFile;
startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO); startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
} }
} }
} }
private void resize(String imagePath){
File dir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
Bitmap b = BitmapFactory.decodeFile(imagePath);
b = getCorrectlyRotated(imagePath, b);
Bitmap out = resize(b, 320, 320);
File file = new File(dir, newFile.getName());
FileOutputStream fOut;
try {
fOut = new FileOutputStream(file);
out.compress(Bitmap.CompressFormat.JPEG, 100, fOut);
fOut.flush();
fOut.close();
b.recycle();
out.recycle();
} catch (Exception e) {}
}
private Bitmap getCorrectlyRotated(String imagePath, Bitmap bitmap) {
// Rotate Image if Needed
try {
// Determine Orientation
ExifInterface exif = new ExifInterface(imagePath);
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);
// Determine Rotation
int rotation = 0;
if (orientation == 6) rotation = 90;
else if (orientation == 3) rotation = 180;
else if (orientation == 8) rotation = 270;
// Rotate Image if Necessary
if (rotation != 0) {
// Create Matrix
Matrix matrix = new Matrix();
matrix.postRotate(rotation);
// Rotate Bitmap
Bitmap rotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
// Pretend none of this ever happened!
bitmap.recycle();
bitmap = rotated;
rotated = null;
}
} catch (Exception e) {
// TODO: Log Error Messages Here
}
return bitmap;
}
private static Bitmap resize(Bitmap image, int maxWidth, int maxHeight) {
if (maxHeight > 0 && maxWidth > 0) {
int width = image.getWidth();
int height = image.getHeight();
float ratioBitmap = (float) width / (float) height;
float ratioMax = (float) maxWidth / (float) maxHeight;
int finalWidth = maxWidth;
int finalHeight = maxHeight;
if (ratioMax > ratioBitmap) {
finalWidth = (int) ((float)maxHeight * ratioBitmap);
} else {
finalHeight = (int) ((float)maxWidth / ratioBitmap);
}
image = Bitmap.createScaledBitmap(image, finalWidth, finalHeight, true);
return image;
} else {
return image;
}
}
@Override @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) { if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
Intent previewPhotoIntent = new Intent(this, PhotoPreviewActivity.class); Intent previewPhotoIntent = new Intent(this, PhotoPreviewActivity.class);
resize(mCurrentPhotoPath);
previewPhotoIntent.putExtra("imagePath", mCurrentPhotoPath); previewPhotoIntent.putExtra("imagePath", mCurrentPhotoPath);
startActivity(previewPhotoIntent); startActivity(previewPhotoIntent);
} }

View File

@ -49,8 +49,8 @@ public class PhotoPreviewActivity extends AppCompatActivity {
private Bitmap getPic(String picPath) { private Bitmap getPic(String picPath) {
// Get the dimensions of the View // Get the dimensions of the View
int targetW = 800; int targetW = 320;
int targetH = 1200; int targetH = 320;
// Get the dimensions of the bitmap // Get the dimensions of the bitmap
BitmapFactory.Options bmOptions = new BitmapFactory.Options(); BitmapFactory.Options bmOptions = new BitmapFactory.Options();
@ -68,7 +68,7 @@ public class PhotoPreviewActivity extends AppCompatActivity {
bmOptions.inPurgeable = true; bmOptions.inPurgeable = true;
Bitmap bitmap = BitmapFactory.decodeFile(picPath, bmOptions); Bitmap bitmap = BitmapFactory.decodeFile(picPath, bmOptions);
bitmap = getCorrectlyRotated(picPath, bitmap); //bitmap = getCorrectlyRotated(picPath, bitmap);
return bitmap; return bitmap;
} }

View File

@ -0,0 +1,88 @@
package com.krokogator.photoeat;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import com.google.api.client.http.GenericUrl;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpRequestFactory;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.krokogator.photoeat.service.NutritionixService;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
public class TestNutritionixActivity extends AppCompatActivity {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_nutritionix);
EditText input = findViewById(R.id.input_nutri_food);
Button btnSend = findViewById(R.id.button_send);
btnSend.setOnClickListener((view) -> {
//getCalories(input.getText().toString());
new NutritionixBackground().execute(input.getText().toString());
});
textView = findViewById(R.id.text_output);
}
private void getCalories(String input) throws IOException {
}
private void setText(String results) {
textView.setText(results);
}
private class NutritionixBackground extends AsyncTask<String, Integer, JSONObject> {
protected JSONObject doInBackground(String... files) {
JSONObject out = null;
NutritionixService service = new NutritionixService();
try {
out = service.test(files[0]);
} catch (Exception e) {
e.printStackTrace();
}
// Escape early if cancel() is called
if (isCancelled()) return null;
return out;
}
protected void onPostExecute(JSONObject result) {
StringBuilder builder = new StringBuilder();
try {
int length = 0;
length = result.getJSONArray("foods").length();
for (int i = 0; i < length; i++) {
builder.append(result.getJSONArray("foods").getJSONObject(i).getString("food_name"));
builder.append(" ");
builder.append(result.getJSONArray("foods").getJSONObject(i).getString("nf_calories"));
builder.append("kcal \n");
}
} catch (Exception e){}
setText(builder.toString());
}
}
}

View File

@ -0,0 +1,27 @@
package com.krokogator.photoeat.model;
import com.google.api.client.json.GenericJson;
import com.google.api.client.util.Key;
public class Food extends GenericJson {
@Key
String food_name;
@Key
String nf_calories;
public String getFood_name() {
return food_name;
}
public void setFood_name(String food_name) {
this.food_name = food_name;
}
public String getNf_calories() {
return nf_calories;
}
public void setNf_calories(String nf_calories) {
this.nf_calories = nf_calories;
}
}

View File

@ -0,0 +1,19 @@
package com.krokogator.photoeat.model;
import com.google.api.client.json.GenericJson;
import com.google.api.client.util.Key;
import java.util.List;
public class Output extends GenericJson {
@Key
private Food[] foods;
public Food[] getFoods() {
return foods;
}
public void setFoods(Food[] foods) {
this.foods = foods;
}
}

View File

@ -0,0 +1,50 @@
package com.krokogator.photoeat.service;
import com.google.api.client.http.ByteArrayContent;
import com.google.api.client.http.GenericUrl;
import com.google.api.client.http.HttpContent;
import com.google.api.client.http.HttpHeaders;
import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpRequestFactory;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.GenericJson;
import com.google.gson.reflect.TypeToken;
import com.krokogator.photoeat.model.Output;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.lang.reflect.Type;
public class NutritionixService {
public JSONObject test(String input) throws IOException, JSONException {
/**
* NUTRITIONIX API CALL
*/
String content = "{\"query\":\"" + input + "\"}";
HttpRequestFactory requestFactory
= new NetHttpTransport().createRequestFactory();
HttpRequest request = requestFactory.buildPostRequest(
new GenericUrl("https://trackapi.nutritionix.com/v2/natural/nutrients"),
ByteArrayContent.fromString("application/json", content));
HttpHeaders headers = request.getHeaders();
headers.set("x-app-id", "83ec2635");
headers.set("x-app-key", "61c5dbdcecb2da0abd23e3e26b3e2437");
JSONObject jsonResponse = null;
try {
jsonResponse = new JSONObject(request.execute().parseAsString());
} catch (JSONException e) {
e.printStackTrace();
}
return jsonResponse;
}
}

View File

@ -39,11 +39,25 @@
android:layout_height="94dp" android:layout_height="94dp"
android:layout_marginStart="36dp" android:layout_marginStart="36dp"
android:layout_marginEnd="36dp" android:layout_marginEnd="36dp"
android:layout_marginBottom="16dp" android:layout_marginBottom="8dp"
android:backgroundTint="@color/colorAccent" android:backgroundTint="@color/colorAccent"
android:text="@string/archive" android:text="@string/archive"
app:layout_constraintBottom_toTopOf="@+id/button_nutritionix"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
<Button
android:id="@+id/button_nutritionix"
android:layout_width="0dp"
android:layout_height="94dp"
android:layout_marginStart="36dp"
android:layout_marginEnd="36dp"
android:layout_marginBottom="8dp"
android:backgroundTint="@color/colorAccent"
android:text="Nutritionix"
app:layout_constraintBottom_toTopOf="@+id/button4" app:layout_constraintBottom_toTopOf="@+id/button4"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent" /> app:layout_constraintStart_toStartOf="parent" />
<Button <Button

View File

@ -0,0 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/input_nutri_food"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="32dp"
android:ems="10"
android:inputType="textPersonName"
android:text="Food"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/text_output"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginTop="32dp"
android:layout_marginEnd="8dp"
android:text="TextView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/input_nutri_food" />
<Button
android:id="@+id/button_send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="32dp"
android:text="Send"
app:layout_constraintStart_toEndOf="@+id/input_nutri_food"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>