From b27245ea6a3ac300991e52b2af7e2cd74d4825d2 Mon Sep 17 00:00:00 2001 From: acasallas Date: Tue, 23 Jun 2015 16:44:24 -0400 Subject: [PATCH] -upload AffdexMe folder to GitHub -upload the AffdexMe project folder and corresponding README.md file --- AffdexMe/.gitignore | 7 + AffdexMe/.idea/.name | 1 + AffdexMe/.idea/compiler.xml | 22 + .../.idea/copyright/profiles_settings.xml | 3 + AffdexMe/.idea/gradle.xml | 19 + AffdexMe/.idea/misc.xml | 19 + AffdexMe/.idea/modules.xml | 9 + AffdexMe/.idea/vcs.xml | 6 + AffdexMe/AffdexMe.iml | 19 + AffdexMe/AffdexMe_original.iml | 19 + AffdexMe/app/.gitignore | 1 + AffdexMe/app/app.iml | 101 +++ AffdexMe/app/build.gradle | 38 ++ AffdexMe/app/build.xml | 92 +++ AffdexMe/app/proguard-rules.pro | 29 + AffdexMe/app/src/main/AndroidManifest.xml | 34 + AffdexMe/app/src/main/assets/fonts/Square.ttf | Bin 0 -> 13652 bytes .../com/affectiva/affdexme/DrawingView.java | 271 ++++++++ .../affdexme/GradientMetricView.java | 48 ++ .../com/affectiva/affdexme/MainActivity.java | 632 ++++++++++++++++++ .../com/affectiva/affdexme/MetricView.java | 115 ++++ .../affectiva_logo_clear_background.png | Bin 0 -> 12893 bytes .../affectiva_logo_clear_background.png | Bin 0 -> 5834 bytes .../affectiva_logo_clear_background.png | Bin 0 -> 19220 bytes .../affectiva_logo_clear_background.png | Bin 0 -> 31185 bytes .../app/src/main/res/layout/activity_main.xml | 51 ++ .../app/src/main/res/layout/menu_layout.xml | 60 ++ .../app/src/main/res/layout/metric_layout.xml | 106 +++ .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin 0 -> 4258 bytes .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin 0 -> 2142 bytes .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin 0 -> 5142 bytes .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin 0 -> 11271 bytes .../app/src/main/res/values-large/dimens.xml | 10 + .../app/src/main/res/values-normal/dimens.xml | 10 + .../app/src/main/res/values-small/dimens.xml | 10 + .../app/src/main/res/values-xlarge/dimens.xml | 11 + AffdexMe/app/src/main/res/values/attrs.xml | 9 + AffdexMe/app/src/main/res/values/colors.xml | 7 + AffdexMe/app/src/main/res/values/dimens.xml | 10 + .../src/main/res/values/metricStyleName.xml | 15 + .../src/main/res/values/metricStylePct.xml | 11 + .../app/src/main/res/values/optionsStyle.xml | 10 + AffdexMe/app/src/main/res/values/strings.xml | 18 + AffdexMe/app/src/main/res/values/styles.xml | 6 + AffdexMe/build.gradle | 19 + AffdexMe/gradle.properties | 18 + AffdexMe/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 49896 bytes .../gradle/wrapper/gradle-wrapper.properties | 6 + AffdexMe/gradlew | 164 +++++ AffdexMe/gradlew.bat | 90 +++ AffdexMe/settings.gradle | 1 + README.md | 28 + 52 files changed, 2155 insertions(+) create mode 100644 AffdexMe/.gitignore create mode 100644 AffdexMe/.idea/.name create mode 100644 AffdexMe/.idea/compiler.xml create mode 100644 AffdexMe/.idea/copyright/profiles_settings.xml create mode 100644 AffdexMe/.idea/gradle.xml create mode 100644 AffdexMe/.idea/misc.xml create mode 100644 AffdexMe/.idea/modules.xml create mode 100644 AffdexMe/.idea/vcs.xml create mode 100644 AffdexMe/AffdexMe.iml create mode 100644 AffdexMe/AffdexMe_original.iml create mode 100644 AffdexMe/app/.gitignore create mode 100644 AffdexMe/app/app.iml create mode 100644 AffdexMe/app/build.gradle create mode 100644 AffdexMe/app/build.xml create mode 100644 AffdexMe/app/proguard-rules.pro create mode 100644 AffdexMe/app/src/main/AndroidManifest.xml create mode 100644 AffdexMe/app/src/main/assets/fonts/Square.ttf create mode 100644 AffdexMe/app/src/main/java/com/affectiva/affdexme/DrawingView.java create mode 100644 AffdexMe/app/src/main/java/com/affectiva/affdexme/GradientMetricView.java create mode 100644 AffdexMe/app/src/main/java/com/affectiva/affdexme/MainActivity.java create mode 100644 AffdexMe/app/src/main/java/com/affectiva/affdexme/MetricView.java create mode 100644 AffdexMe/app/src/main/res/drawable-hdpi/affectiva_logo_clear_background.png create mode 100644 AffdexMe/app/src/main/res/drawable-mdpi/affectiva_logo_clear_background.png create mode 100644 AffdexMe/app/src/main/res/drawable-xhdpi/affectiva_logo_clear_background.png create mode 100644 AffdexMe/app/src/main/res/drawable-xxhdpi/affectiva_logo_clear_background.png create mode 100644 AffdexMe/app/src/main/res/layout/activity_main.xml create mode 100644 AffdexMe/app/src/main/res/layout/menu_layout.xml create mode 100644 AffdexMe/app/src/main/res/layout/metric_layout.xml create mode 100644 AffdexMe/app/src/main/res/mipmap-hdpi/ic_launcher.png create mode 100644 AffdexMe/app/src/main/res/mipmap-mdpi/ic_launcher.png create mode 100644 AffdexMe/app/src/main/res/mipmap-xhdpi/ic_launcher.png create mode 100644 AffdexMe/app/src/main/res/mipmap-xxhdpi/ic_launcher.png create mode 100644 AffdexMe/app/src/main/res/values-large/dimens.xml create mode 100644 AffdexMe/app/src/main/res/values-normal/dimens.xml create mode 100644 AffdexMe/app/src/main/res/values-small/dimens.xml create mode 100644 AffdexMe/app/src/main/res/values-xlarge/dimens.xml create mode 100644 AffdexMe/app/src/main/res/values/attrs.xml create mode 100644 AffdexMe/app/src/main/res/values/colors.xml create mode 100644 AffdexMe/app/src/main/res/values/dimens.xml create mode 100644 AffdexMe/app/src/main/res/values/metricStyleName.xml create mode 100644 AffdexMe/app/src/main/res/values/metricStylePct.xml create mode 100644 AffdexMe/app/src/main/res/values/optionsStyle.xml create mode 100644 AffdexMe/app/src/main/res/values/strings.xml create mode 100644 AffdexMe/app/src/main/res/values/styles.xml create mode 100644 AffdexMe/build.gradle create mode 100644 AffdexMe/gradle.properties create mode 100644 AffdexMe/gradle/wrapper/gradle-wrapper.jar create mode 100644 AffdexMe/gradle/wrapper/gradle-wrapper.properties create mode 100644 AffdexMe/gradlew create mode 100644 AffdexMe/gradlew.bat create mode 100644 AffdexMe/settings.gradle create mode 100644 README.md diff --git a/AffdexMe/.gitignore b/AffdexMe/.gitignore new file mode 100644 index 0000000..9c4de58 --- /dev/null +++ b/AffdexMe/.gitignore @@ -0,0 +1,7 @@ +.gradle +/local.properties +/.idea/workspace.xml +/.idea/libraries +.DS_Store +/build +/captures diff --git a/AffdexMe/.idea/.name b/AffdexMe/.idea/.name new file mode 100644 index 0000000..df588a5 --- /dev/null +++ b/AffdexMe/.idea/.name @@ -0,0 +1 @@ +AffdexMe \ No newline at end of file diff --git a/AffdexMe/.idea/compiler.xml b/AffdexMe/.idea/compiler.xml new file mode 100644 index 0000000..96cc43e --- /dev/null +++ b/AffdexMe/.idea/compiler.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AffdexMe/.idea/copyright/profiles_settings.xml b/AffdexMe/.idea/copyright/profiles_settings.xml new file mode 100644 index 0000000..e7bedf3 --- /dev/null +++ b/AffdexMe/.idea/copyright/profiles_settings.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/AffdexMe/.idea/gradle.xml b/AffdexMe/.idea/gradle.xml new file mode 100644 index 0000000..3ed2e6c --- /dev/null +++ b/AffdexMe/.idea/gradle.xml @@ -0,0 +1,19 @@ + + + + + + \ No newline at end of file diff --git a/AffdexMe/.idea/misc.xml b/AffdexMe/.idea/misc.xml new file mode 100644 index 0000000..e45faed --- /dev/null +++ b/AffdexMe/.idea/misc.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AffdexMe/.idea/modules.xml b/AffdexMe/.idea/modules.xml new file mode 100644 index 0000000..42ad053 --- /dev/null +++ b/AffdexMe/.idea/modules.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/AffdexMe/.idea/vcs.xml b/AffdexMe/.idea/vcs.xml new file mode 100644 index 0000000..6564d52 --- /dev/null +++ b/AffdexMe/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/AffdexMe/AffdexMe.iml b/AffdexMe/AffdexMe.iml new file mode 100644 index 0000000..dfe3cb4 --- /dev/null +++ b/AffdexMe/AffdexMe.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AffdexMe/AffdexMe_original.iml b/AffdexMe/AffdexMe_original.iml new file mode 100644 index 0000000..c05828d --- /dev/null +++ b/AffdexMe/AffdexMe_original.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AffdexMe/app/.gitignore b/AffdexMe/app/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/AffdexMe/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/AffdexMe/app/app.iml b/AffdexMe/app/app.iml new file mode 100644 index 0000000..8d4d2f8 --- /dev/null +++ b/AffdexMe/app/app.iml @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AffdexMe/app/build.gradle b/AffdexMe/app/build.gradle new file mode 100644 index 0000000..bea9053 --- /dev/null +++ b/AffdexMe/app/build.gradle @@ -0,0 +1,38 @@ +apply plugin: 'com.android.application' + +android { + compileSdkVersion 22 + buildToolsVersion '22.0.1' + + defaultConfig { + applicationId "com.affectiva.affdexme" + minSdkVersion 16 + targetSdkVersion 22 + versionCode 11 + versionName "1.0.844" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + //gson is necessary for the license to be parsed + compile 'com.google.code.gson:gson:2.3' + + //include the Affdex SDK jars + compile files('libs/Affdex-sdk.jar') + compile files('libs/Affdex-sdk-javadoc.jar') + compile files('libs/dagger-1.2.2.jar') + compile files('libs/flurry-analytics-4.1.0.jar') + compile files('libs/javax.inject-1.jar') + + //although the use of the CameraDetector class in this project does not require it, you may have to include + //the following dependencies if you use other features of the Affdex SDK + //compile 'com.android.support:support-v4:22.2.0' + //compile 'com.google.android.gms:play-services:7.5.0' + +} diff --git a/AffdexMe/app/build.xml b/AffdexMe/app/build.xml new file mode 100644 index 0000000..0cec068 --- /dev/null +++ b/AffdexMe/app/build.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/AffdexMe/app/proguard-rules.pro b/AffdexMe/app/proguard-rules.pro new file mode 100644 index 0000000..6914cbb --- /dev/null +++ b/AffdexMe/app/proguard-rules.pro @@ -0,0 +1,29 @@ +# Add project specific ProGuard rules here. +# By default, the flags in this file are appended to flags specified +# in /Users/AlanCasalas/Library/Android/sdk/tools/proguard/proguard-android.txt +# You can edit the include path and order by changing the proguardFiles +# directive in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# Add any project specific keep options here: + +#prevent proguard from warning us about not including the GooglePlay dependency +-dontwarn ** + +#keep all classes (otherwise Proguard may remove classes that use reflection, injection, Gson, etc...) +-keep class sun.** +-keep class com.** +-keep class android.** +-keep class dagger.** +-keep class javax.** + +#keep certain class members (otherwise Proguard would strip the members of these classes) +-keepclassmembers class com.affectiva.android.affdex.sdk.detector.License { *; } +-keepclassmembers class com.affectiva.android.affdex.sdk.detector.A* { *; } +-keepclassmembers class * { + @javax.inject.* *; + @dagger.* *; + (); +} \ No newline at end of file diff --git a/AffdexMe/app/src/main/AndroidManifest.xml b/AffdexMe/app/src/main/AndroidManifest.xml new file mode 100644 index 0000000..2415da8 --- /dev/null +++ b/AffdexMe/app/src/main/AndroidManifest.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/AffdexMe/app/src/main/assets/fonts/Square.ttf b/AffdexMe/app/src/main/assets/fonts/Square.ttf new file mode 100644 index 0000000000000000000000000000000000000000..9f1867ee0329a3c6295704d87cb1df3c43990036 GIT binary patch literal 13652 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 literal 0 HcmV?d00001 diff --git a/AffdexMe/app/src/main/java/com/affectiva/affdexme/DrawingView.java b/AffdexMe/app/src/main/java/com/affectiva/affdexme/DrawingView.java new file mode 100644 index 0000000..b2c8bb7 --- /dev/null +++ b/AffdexMe/app/src/main/java/com/affectiva/affdexme/DrawingView.java @@ -0,0 +1,271 @@ +package com.affectiva.affdexme; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.PixelFormat; +import android.graphics.PointF; +import android.graphics.PorterDuff; +import android.os.Process; +import android.os.SystemClock; +import android.util.AttributeSet; +import android.util.Log; +import android.view.SurfaceHolder; +import android.view.SurfaceView; + + +/** + * This class contains a SurfaceView and its own thread that draws to it. + * It is used to display the facial tracking dots over a user's face. + */ +public class DrawingView extends SurfaceView implements SurfaceHolder.Callback { + + //Inner Thread class + class DrawingThread extends Thread{ + private SurfaceHolder mSurfaceHolder; + private Paint circlePaint; + private Paint boxPaint; + private boolean stopFlag = false; //boolean to indicate when thread has been told to stop + private PointF[] nextPointsToDraw = null; //holds a reference to the most recent set of points returned by CameraDetector, passed in by main thread + boolean isDrawPointsEnabled = false; //saves whether user has selected dots to be drawn + float imageWidth = 0; + float imageHeight = 0; + float screenToImageRatio = 0; + float drawThickness = 0; //thickness with which dots and square will be drawn + + private final long drawPeriod = 33; //draw at 30 fps + + public DrawingThread(SurfaceHolder surfaceHolder, boolean drawPoints) { + mSurfaceHolder = surfaceHolder; + + circlePaint = new Paint(); + circlePaint.setColor(Color.WHITE); + + boxPaint = new Paint(); + boxPaint.setColor(Color.WHITE); + boxPaint.setStyle(Paint.Style.STROKE); + + isDrawPointsEnabled = drawPoints; + } + + /** + * Used to set the valence score, which determines the color of the bounding box. + * **/ + void setScore(float s) { + if (s > 0) { + float colorScore = ((100f-s)/100f)*255; + boxPaint.setColor(Color.rgb((int)colorScore,255,(int)colorScore)); + } else { + float colorScore = ((100f+s)/100f)*255; + boxPaint.setColor(Color.rgb(255,(int)colorScore,(int)colorScore)); + } + } + + public void stopThread() { + stopFlag = true; + } + + public boolean isStopped() { + return stopFlag; + } + + //Updates thread with latest points returned by the onImageResults() event. + public void updatePoints(PointF[] pointList) { + nextPointsToDraw = pointList; + } + + //Sets measurements thread will use to draw facial tracking dots. + public void setDimen(int w, int h, float appToImageRatio, float thickness) { + imageWidth = w; + imageHeight = h; + screenToImageRatio = appToImageRatio; + drawThickness = thickness; + boxPaint.setStrokeWidth(thickness); + } + + private void setDrawPointsEnabled(boolean b) { + isDrawPointsEnabled = b; + } + + private boolean getDrawPointsEnabled() { + return isDrawPointsEnabled; + } + + //Inform thread face detection has stopped, so array of points is no longer valid. + public void invalidatePoints() { + nextPointsToDraw = null; + } + + @Override + public void run() { + android.os.Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND); + + while(!stopFlag) { + long startTime = SystemClock.elapsedRealtime(); //get time at the start of thread loop + + /** + * We use SurfaceHolder.lockCanvas() to get the canvas that draws to the SurfaceView. + * After we are done drawing, we let go of the canvas using SurfaceHolder.unlockCanvasAndPost() + * **/ + Canvas c = null; + try { + c = mSurfaceHolder.lockCanvas(); + + if (c!= null) { + synchronized (mSurfaceHolder) { + c.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); //clear previous dots + if (isDrawPointsEnabled && (nextPointsToDraw != null) ) { + draw(c); + } + } + } + } + finally { + if (c!= null) { + mSurfaceHolder.unlockCanvasAndPost(c); + } + } + + //send thread to sleep so we don't draw faster than the requested 'drawPeriod'. + long sleepTime = drawPeriod - (SystemClock.elapsedRealtime() - startTime); + try { + if(sleepTime>0){ + this.sleep(sleepTime); + } + } catch (InterruptedException ex) { + Log.e(LOG_TAG,ex.getMessage()); + } + } + } + + void draw(Canvas c) { + //Save our own reference to the list of points, in case the previous reference is overwritten by the main thread. + PointF[] points = nextPointsToDraw; + + //Coordinates around which to draw bounding box. + float leftBx = imageWidth; + float rightBx = 0; + float topBx = imageHeight; + float botBx = 0; + + //Iterate through all the points given to us by the CameraDetector object + for (int i = 0; i < points.length; i++) { + + //We determine the left-most, top-most, right-most, and bottom-most points to draw the bounding box around. + if (points[i].x < leftBx) + leftBx = points[i].x; + if (points[i].x > rightBx) + rightBx = points[i].x; + if (points[i].y < topBx) + topBx = points[i].y; + if (points[i].y > botBx) + botBx = points[i].y; + + //Draw facial tracking dots. + //The camera preview is displayed as a mirror, so X pts have to be reversed + c.drawCircle((imageWidth - points[i].x - 1) * screenToImageRatio, (points[i].y)* screenToImageRatio, drawThickness, circlePaint); + } + + //Draw the bounding box. + c.drawRect((imageWidth - leftBx - 1) * screenToImageRatio, topBx * screenToImageRatio, (imageWidth - rightBx - 1) * screenToImageRatio, botBx * screenToImageRatio, boxPaint); + } + } + + //Class variables of DrawingView class + private SurfaceHolder surfaceHolder; + private DrawingThread drawingThread; //DrawingThread object + private boolean isDimensionsNeeded = true; + private boolean isDrawPointsEnabled = true; //by default, start drawing thread without drawing points + private static String LOG_TAG = "AffdexMe"; + + //three constructors required of any custom view + public DrawingView(Context context) { + super(context); + initView(); + } + public DrawingView(Context context, AttributeSet attrs) { + super(context, attrs); + initView(); + } + public DrawingView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + initView(); + } + + void initView(){ + surfaceHolder = getHolder(); //The SurfaceHolder object will be used by the thread to request canvas to draw on SurfaceView + surfaceHolder.setFormat(PixelFormat.TRANSPARENT); //set to Transparent so this surfaceView does not obscure the one it is overlaying (the one displaying the camera). + surfaceHolder.addCallback(this); //become a Listener to the three events below that SurfaceView throws + drawingThread = new DrawingThread(surfaceHolder, isDrawPointsEnabled); + } + + @Override + public void surfaceCreated(SurfaceHolder holder) { + if (drawingThread.isStopped()) { + drawingThread = new DrawingThread(surfaceHolder, isDrawPointsEnabled); + } + drawingThread.start(); + } + + @Override + public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { + } + + @Override + public void surfaceDestroyed(SurfaceHolder holder) { + //command thread to stop, and wait until it stops + boolean retry = true; + drawingThread.stopThread(); + while (retry) { + try { + drawingThread.join(); + retry = false; + } catch (InterruptedException e) { + Log.e(LOG_TAG,e.getMessage()); + } + } + isDimensionsNeeded = true; //Now that thread has been destroyed, we'll need dimensions to be recalculated if a new thread is later created. + } + + public void setDimensions(int width, int height, float appToImageRatio, float radius) { + drawingThread.setDimen(width, height, appToImageRatio, radius); + isDimensionsNeeded = false; + } + + public boolean isDimensionsNeeded() { + return isDimensionsNeeded; + } + + public void setDrawPointsEnabled(boolean b){ + isDrawPointsEnabled = b; + drawingThread.setDrawPointsEnabled(b); + } + + public void invalidateDimensions() { + isDimensionsNeeded = true; + } + + public boolean getDrawPointsEnabled() { + return isDrawPointsEnabled; + } + + //The methods below simply delegate to the drawingThread object + public void setScore(float s) { + drawingThread.setScore(s); + } + + public void updatePoints(PointF[] points) { + drawingThread.updatePoints(points); + } + + public void invalidatePoints(){ + drawingThread.invalidatePoints(); + } + + + + + + +} diff --git a/AffdexMe/app/src/main/java/com/affectiva/affdexme/GradientMetricView.java b/AffdexMe/app/src/main/java/com/affectiva/affdexme/GradientMetricView.java new file mode 100644 index 0000000..0a9f181 --- /dev/null +++ b/AffdexMe/app/src/main/java/com/affectiva/affdexme/GradientMetricView.java @@ -0,0 +1,48 @@ +package com.affectiva.affdexme; + +import android.content.Context; +import android.graphics.Color; +import android.util.AttributeSet; + +/** + * GradientMetricView is used to display the valence metric and adds functionality of allowing + * the bar's shade of color to scale with the metric's value, rather than just being red or green. + */ +public class GradientMetricView extends MetricView { + + //Three Constructors required of any custom view: + public GradientMetricView(Context context) { + super(context); + } + public GradientMetricView(Context context, AttributeSet attrs) { + super(context, attrs); + } + public GradientMetricView(Context context, AttributeSet attrs, int styleID){ + super(context, attrs, styleID); + } + + /** + * As in MetricView, we set our text to display the score and size the colored bar appropriately. + * In this class, however, we let the score determine the color of the bar (shades of red for negative + * and shades of green for positive). + */ + @Override + public void setScore(float s) { + text = String.format("%d%%", (int)s); + if (s > 0) { + left = midX - (halfWidth * (s / 100)); + right = midX + (halfWidth * (s / 100)); + } else { + left = midX - (halfWidth * (-s / 100)); + right = midX + (halfWidth * (-s / 100)); + } + if (s > 0) { + float colorScore = ((100f-s)/100f)*255; + boxPaint.setColor(Color.rgb((int)colorScore,255,(int)colorScore)); + } else { + float colorScore = ((100f+s)/100f)*255; + boxPaint.setColor(Color.rgb(255,(int)colorScore,(int)colorScore)); + } + invalidate(); //instruct Android to re-draw our view, now that the text has changed + } +} diff --git a/AffdexMe/app/src/main/java/com/affectiva/affdexme/MainActivity.java b/AffdexMe/app/src/main/java/com/affectiva/affdexme/MainActivity.java new file mode 100644 index 0000000..f04ade7 --- /dev/null +++ b/AffdexMe/app/src/main/java/com/affectiva/affdexme/MainActivity.java @@ -0,0 +1,632 @@ +package com.affectiva.affdexme; + +import android.app.Activity; +import android.content.Context; +import android.content.SharedPreferences; +import android.content.pm.PackageManager; +import android.graphics.Typeface; +import android.os.Bundle; +import android.os.SystemClock; +import android.util.Log; +import android.view.KeyEvent; +import android.view.MotionEvent; +import android.view.SurfaceView; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputMethodManager; +import android.widget.CheckBox; +import android.widget.EditText; +import android.widget.FrameLayout; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.InputStreamReader; +import java.util.List; + +import com.affectiva.android.affdex.sdk.Frame; +import com.affectiva.android.affdex.sdk.Frame.ROTATE; +import com.affectiva.android.affdex.sdk.detector.CameraDetector; +import com.affectiva.android.affdex.sdk.detector.Detector; +import com.affectiva.android.affdex.sdk.detector.Face; + +/* + * AffdexMe is an app that demonstrates the use of the Affectiva Android SDK. It uses the + * front-facing camera on your Android device to view, process and analyze live video of your face. + * Start the app and you will see your own face on the screen and metrics describing your + * expressions. + * + * Tapping the screen will bring up a menu with options to display the Processed Frames Per Second metric, + * display facial tracking points, and control the rate at which frames are processed by the SDK. + * + * Most of the methods in this file control the application's UI. Therefore, if you are just interested in learning how the Affectiva SDK works, + * you will find the calls relevant to the use of the SDK in the startCamera() and stopCamera() methods, as well as the onImageResults() method. + * + * This class implements the Detector.ImageListener interface, allowing it to receive the onImageResults() event. + * This class implements the Detector.FaceListener interface, allowing it to receive the onFaceDetectionStarted() and + * onFaceDetectionStopped() events. + * + * In order to use this project, you will need to: + * - Obtain the SDK from Affectiva (visit http://www.affdex.com/mobile-sdk) + * - Copy the SDK assets folder contents into this project's assets folder + * - Copy the SDK libs folder contents into this project's libs folder + * - Copy the armeabi-v7a folder (found in the SDK libs folder) into this project's jniLibs folder + * - Add your license file to the /assets/Affdex folder and uncomment the line in the startCamera() method + * to type in your license file name + * - Build the project + * - Run the app on an Android device with a front-facing camera + * + * Copyright (c) 2014 Affectiva. All rights reserved. + */ + +public class MainActivity extends Activity + implements Detector.FaceListener, Detector.ImageListener, TextView.OnEditorActionListener, View.OnTouchListener{ + + private static final String LOG_TAG = "AffdexMe"; + + //Affectiva SDK Object + private CameraDetector detector = null; + + //Metrics View UI Objects + private RelativeLayout metricViewLayout; + private LinearLayout leftMetricsLayout; + private LinearLayout rightMetricsLayout; + private MetricView smilePct; + private MetricView browRaisePct; + private MetricView browFurrowPct; + private MetricView frownPct; + private MetricView valencePct; + private MetricView engagementPct; + private TextView fpsName; + private TextView fpsPct; + private TextView smileName; + private TextView browRaiseName; + private TextView browFurrowName; + private TextView frownName; + private TextView valenceName; + private TextView engagementName; + + //Menu UI Objects + private RelativeLayout menuLayout; + private EditText fpsEditText; + private CheckBox fpsCheckbox; + private CheckBox trackingCheckbox; + private TextView fpsEditTextName; + + //Other UI objects + private ViewGroup activityLayout; //top-most ViewGroup in which all content resides + private RelativeLayout mainLayout; //layout, to be resized, containing all UI elements + private RelativeLayout progressBarLayout; //layout used to show progress circle while camera is starting + private SurfaceView cameraView; //SurfaceView used to display camera images + private DrawingView drawingView; //SurfaceView containing its own thread, used to draw facial tracking dots + + //The Shared Preferences object is used to restore/save settings when activity is created/destroyed + private final String PREFS_NAME = "AffdexMe"; + SharedPreferences sharedPreferences; + + //Application settings variables + private int detectorProcessRate = 20; + private boolean isMenuVisible = false; + private boolean isFPSVisible = false; + + //Frames Per Second (FPS) variables + private long firstSystemTime = 0; + private float numberOfFrames = 0; + private long timeToUpdate = 0; + + private boolean isFrontFacingCameraDetected = true; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); //To maximize UI space, we declare our app to be full-screen + setContentView(R.layout.activity_main); + + /** + * We check to make sure the device has a front-facing camera. + * If it does not, we obscure the app with a notice informing the user they cannot + * use the app. + */ + if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_FRONT)) { + isFrontFacingCameraDetected = false; + TextView notFoundTextView = (TextView) findViewById(R.id.not_found_textview); + notFoundTextView.setVisibility(View.VISIBLE); + } + + initializeUI(); + } + + void initializeUI() { + + //Get handles to UI objects + activityLayout = (ViewGroup) findViewById(android.R.id.content); + progressBarLayout = (RelativeLayout) findViewById(R.id.progress_bar_cover); + metricViewLayout = (RelativeLayout) findViewById(R.id.metric_view_group); + leftMetricsLayout = (LinearLayout) findViewById(R.id.left_metrics); + rightMetricsLayout = (LinearLayout) findViewById(R.id.right_metrics); + mainLayout = (RelativeLayout) findViewById(R.id.main_layout); + menuLayout = (RelativeLayout) findViewById(R.id.affdexme_menu); + smilePct = (MetricView) findViewById(R.id.smile_pct); + browRaisePct = (MetricView) findViewById(R.id.brow_raise_pct); + browFurrowPct = (MetricView) findViewById(R.id.brow_furrow_pct); + frownPct = (MetricView) findViewById(R.id.frown_pct); + valencePct = (MetricView) findViewById(R.id.valence_pct); + engagementPct = (MetricView) findViewById(R.id.engagement_pct); + fpsPct = (TextView) findViewById(R.id.fps_value); + smileName = (TextView) findViewById(R.id.smile_name); + browRaiseName = (TextView) findViewById(R.id.brow_raise_name); + browFurrowName = (TextView) findViewById(R.id.brow_furrow_name); + frownName = (TextView) findViewById(R.id.frown_name); + valenceName = (TextView) findViewById(R.id.valence_name); + engagementName = (TextView) findViewById(R.id.engagement_name); + fpsName = (TextView) findViewById(R.id.fps_name); + fpsEditText = (EditText) findViewById(R.id.fps_edittext); + fpsEditTextName = (TextView) findViewById(R.id.fps_edittext_name); + fpsCheckbox = (CheckBox) findViewById(R.id.fps_checkbox); + trackingCheckbox = (CheckBox) findViewById(R.id.tracking_checkbox); + cameraView = (SurfaceView) findViewById(R.id.camera_preview); + drawingView = (DrawingView) findViewById(R.id.drawing_view); + + //Load Application Font and set UI Elements to use it + Typeface face = Typeface.createFromAsset(getAssets(), "fonts/Square.ttf"); + smilePct.setTypeface(face); + browRaisePct.setTypeface(face); + browFurrowPct.setTypeface(face); + frownPct.setTypeface(face); + valencePct.setTypeface(face); + engagementPct.setTypeface(face); + smileName.setTypeface(face); + browRaiseName.setTypeface(face); + browFurrowName.setTypeface(face); + frownName.setTypeface(face); + valenceName.setTypeface(face); + engagementName.setTypeface(face); + fpsPct.setTypeface(face); + fpsName.setTypeface(face); + fpsEditTextName.setTypeface(face); + fpsCheckbox.setTypeface(face); + trackingCheckbox.setTypeface(face); + + //Hide left and right metrics by default (will be made visible when face detection starts) + leftMetricsLayout.setAlpha(0); + rightMetricsLayout.setAlpha(0); + + /** + * This app uses two SurfaceView objects: one to display the camera image and the other to draw facial tracking dots. + * Since we want the tracking dots to appear over the camera image, we use SurfaceView.setZOrderMediaOverlay() to indicate that + * cameraView represents our 'media', and drawingView represents our 'overlay', so that Android will render them in the + * correct order. + */ + drawingView.setZOrderMediaOverlay(true); + cameraView.setZOrderMediaOverlay(false); + + //Attach event listeners to the menu and edit box + activityLayout.setOnTouchListener(this); + menuLayout.setOnTouchListener(new View.OnTouchListener() { + @Override + public boolean onTouch(View v, MotionEvent event) { + /** + * This method effectively blocks the mainLayout from receiving a touch event + * when the menu is pressed. This is to prevent the menu from closing if the user accidentally touches it + * when aiming for a checkbox or edit box. + */ + return true; + } + }); + fpsEditText.setOnEditorActionListener(this); + + /** + * This app sets the View.SYSTEM_UI_FLAG_HIDE_NAVIGATION flag. Unfortunately, this flag causes + * Android to steal the first touch event after the navigation bar has been hidden, a touch event + * which should be used to make our menu visible again. Therefore, we attach a listener to be notified + * when the navigation bar has been made visible again, which corresponds to the touch event that Android + * steals. If the menu bar was not visible, we make it visible. + */ + activityLayout.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() { + @Override + public void onSystemUiVisibilityChange(int uiCode) { + if ((uiCode == 0) && (isMenuVisible == false)) { + setMenuVisible(true); + } + + } + }); + } + + /** + * We use onResume() to restore application settings using the SharedPreferences object and + * to indicate that dimensions should be recalculated. + */ + @Override + public void onResume() { + super.onResume(); + restoreApplicationSettings(); + drawingView.invalidateDimensions(); //set flag to have screen dimensions resized (usage appears in onImageResults()) + setMenuVisible(false); //always make the menu invisible by default + } + + /** + * We use the Shared Preferences object to restore application settings. + * **/ + public void restoreApplicationSettings() { + sharedPreferences = getSharedPreferences(PREFS_NAME, 0); + + detectorProcessRate = sharedPreferences.getInt("rate", detectorProcessRate); //restore camera processing rate + fpsEditText.setText(String.valueOf(detectorProcessRate)); + + if (sharedPreferences.getBoolean("fps",isFPSVisible)) { //restore isFPSMetricVisible + fpsCheckbox.setChecked(true); + setFPSVisible(true); + } else { + fpsCheckbox.setChecked(false); + setFPSVisible(false); + } + + if (sharedPreferences.getBoolean("track",drawingView.getDrawPointsEnabled())) { //restore isTrackingDotsVisible + setTrackPoints(true); + trackingCheckbox.setChecked(true); + } else { + setTrackPoints(false); + trackingCheckbox.setChecked(false); + } + } + + /** + * Reset the variables used to calculate processed frames per second. + * **/ + public void resetFPSCalculations() { + firstSystemTime = SystemClock.elapsedRealtime(); + timeToUpdate = firstSystemTime + 1000L; + numberOfFrames = 0; + } + + /** + * We start the camera as soon as the application has been given focus, which occurs as soon as the application has + * been opened or reopened. Although this can also occur when the application regains focus after a dialog box has been closed, + * the camera will not be reinitialized because the detector object will not have been set to null during onPause(). + * We also reset variables used to calculate the Processed Frames Per Second. + */ + @Override + public void onWindowFocusChanged(boolean hasFocus) { + if (hasFocus && isFrontFacingCameraDetected) { + startCamera(); + resetFPSCalculations(); + } + } + + void startCamera() { + if (detector == null) { + /** Put the SDK in camera mode by using this constructor. The SDK will be in control of + * the camera. If a SurfaceView is passed in as the last argument to the constructor, + * that view will be painted with what the camera sees. + */ + detector = new CameraDetector(this, CameraDetector.CameraType.CAMERA_FRONT, cameraView); + + // NOTE: uncomment the line below and replace "YourLicenseFile" with your license file, which should be stored in /assets/Affdex/ + //detector.setLicensePath("YourLicenseFile"); + + // We want to detect all expressions, so turn on all classifiers. + detector.setDetectSmile(true); + detector.setDetectBrowFurrow(true); + detector.setDetectBrowRaise(true); + detector.setDetectEngagement(true); + detector.setDetectValence(true); + detector.setDetectLipCornerDepressor(true); + + detector.setMaxProcessRate(detectorProcessRate); + + detector.setImageListener(this); + detector.setFaceListener(this); + + //now that the CameraDetector object has been set up, start the camera + try { + detector.start(); + } catch (Exception e) { + Log.e(LOG_TAG, e.getMessage()); + } + } + } + + + @Override + public void onFaceDetectionStarted() { + leftMetricsLayout.animate().alpha(1); //make left and right metrics appear + rightMetricsLayout.animate().alpha(1); + resetFPSCalculations(); //Since the FPS may be different whether a face is being tracked or not, reset variables. + + } + + @Override + public void onFaceDetectionStopped() { + performFaceDetectionStoppedTasks(); + } + + void performFaceDetectionStoppedTasks() { + leftMetricsLayout.animate().alpha(0); //make left and right metrics disappear + rightMetricsLayout.animate().alpha(0); + drawingView.invalidatePoints(); //inform the drawing thread that the latest facial tracking points are now invalid + resetFPSCalculations(); //Since the FPS may be different whether a face is being tracked or not, reset variables. + } + + + /** + * This event is received every time the SDK processes a frame. + */ + @Override + public void onImageResults(List faces, Frame image, float timeStamp) { + /** + * If the flag indicating that we need to size our layout is set, call calculateDimensions(). + * The flag is a boolean stored in our drawingView object, retrieved through DrawingView.isDimensionsNeeded(). + */ + if (drawingView.isDimensionsNeeded() ) { + calculateDimensions(image); + } + + //If the faces object is null, we received an unprocessed frame + if (faces == null) { + return; + } + + //At this point, we know the frame received was processed, so we perform our processed frames per second calculations + performFPSCalculations(); + + //If faces.size() is 0, we received a frame in which no face was detected + if (faces.size() == 0) { + return; + } + + //The SDK currently detects one face at a time, so we recover it using .get(0). + //'0' indicates we are recovering the first face. + Face face = faces.get(0); + + //update metrics with latest face information. The metrics are displayed on a MetricView, a custom view with a .setScore() method. + smilePct.setScore(face.getSmileScore()); + browRaisePct.setScore(face.getBrowRaiseScore()); + browFurrowPct.setScore(face.getBrowFurrowScore()); + engagementPct.setScore(face.getEngagementScore()); + frownPct.setScore(face.getLipCornerDepressorScore()); + float valenceScore = face.getValenceScore(); + valencePct.setScore(valenceScore); + + /** + * If the user has selected to have facial tracking dots drawn, we use face.getFacePoints() to send those points + * to our drawing thread and also inform the thread what the valence score was, as that will determine the color + * of the bounding box. + */ + if (drawingView.getDrawPointsEnabled()) { + drawingView.setScore(valenceScore); + drawingView.updatePoints(face.getFacePoints()); + } + } + + /** + * This method serves two purposes: + * -It informs the drawing thread of the size of the frames passed by the CameraDetector object. + * -It corrects the dimensions of our mainLayout object to conform to the aspect ratio of the frames passed by the CameraDetector object. + */ + void calculateDimensions(Frame image){ + //Log.i(LOG_TAG,"Dimensions being re-calculated"); + float screenWidth = activityLayout.getWidth(); + float screenHeight = activityLayout.getHeight(); + float referenceDimension = screenHeight; //referenceDimension will be used to determine the size of the facial tracking dots + + //get size of frames being passed by camera + float imageWidth = image.getWidth(); + float imageHeight = image.getHeight(); + + /** + * If device is rotated vertically, reverse the width and height returned by the Frame object, + * and switch the dimension we consider to be the reference dimension. + */ + if ((ROTATE.BY_90_CW == image.getTargetRotation()) || (ROTATE.BY_90_CCW == image.getTargetRotation())) { + float temp = imageWidth; + imageWidth = imageHeight; + imageHeight = temp; + + referenceDimension = screenWidth; + } + + /** + * In this section, we resize our layouts so that the SurfaceView displaying the camera images to will have the same + * aspect ratio as the frames we are receiving from the camera. + * Since all elements in our app are inside 'mainLayout', we just have to adjust the height and width of this layout. + */ + + //calculate aspect ratios of camera frames and screen + float imageAspectRatio = imageWidth/imageHeight; + float screenAspectRatio = screenWidth/screenHeight; + float screenToImageRatio = 0; + int newLayoutHeight = 0; + int newLayoutWidth = 0; + + if (screenAspectRatio < imageAspectRatio) { + newLayoutHeight = (int) (screenWidth / imageAspectRatio); + screenToImageRatio = screenWidth / imageWidth; + newLayoutWidth = (int)screenWidth; + } else { + newLayoutWidth = (int) (screenHeight * imageAspectRatio); + screenToImageRatio = screenHeight/imageHeight; + newLayoutHeight = (int)screenHeight; + } + + + FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mainLayout.getLayoutParams(); + params.height = newLayoutHeight; + params.width = newLayoutWidth; + mainLayout.setLayoutParams(params); + + /** + * Send necessary dimensions to the drawing thread. + * The dimensions are: width of frame, height of frame, ratio of screen to frame size, and thickness of facial tracking dots. + * This method will clear the flag that indicates whether we need to calculate dimensions, so this calculateDimensions() + * will not be continuously called. + */ + drawingView.setDimensions((int) imageWidth, (int) imageHeight, screenToImageRatio, referenceDimension / 160); + + //Now that the aspect ratio has been corrected, remove the progress bar from obscuring the screen + progressBarLayout.setVisibility(View.GONE); + } + + /** + * FPS measurement simply uses SystemClock to measure how many frames were processed since + * the FPS variables were last reset. + * The constants 1000L and 1000f appear because .elapsedRealtime() measures time in milliseconds. + * Note that if 20 frames per second are processed, this method could run for 1.5 years without being reset + * before numberOfFrames overflows. + */ + void performFPSCalculations() { + numberOfFrames += 1; + long currentTime = SystemClock.elapsedRealtime(); + if (currentTime > timeToUpdate) { + float framesPerSecond = (numberOfFrames/(float)(currentTime - firstSystemTime))*1000f; + fpsPct.setText(String.format(" %.1f",framesPerSecond)); + timeToUpdate = currentTime + 1000L; + } + } + + /** + * Although we start the camera in onWindowFocusChanged(), we stop it in onPause(), and set detector to be null so that when onWindowFocusChanged() + * is called it restarts the camera. We also set the Progress Bar to be visible, so the camera (which may need resizing when the app + * is resumed) is obscured. + */ + @Override + public void onPause() { + super.onPause(); + saveApplicationSettings(); + progressBarLayout.setVisibility(View.VISIBLE); + stopCamera(); + } + + private void stopCamera() { + performFaceDetectionStoppedTasks(); + + if (null != detector) { + try { + detector.stop(); + } catch (Exception e) { + Log.e("AffdexMe", e.getMessage()); + } + } + detector = null; //setting detector to null will allow startCamera() to recreate the detector object when the application is reopened. + } + + /** + * We use the SharedPreferences object to save application settings. + **/ + public void saveApplicationSettings() { + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putBoolean("fps", isFPSVisible); + editor.putBoolean("track", drawingView.getDrawPointsEnabled()); + editor.putInt("rate", detectorProcessRate); + editor.commit(); + } + + public void fps_checkbox_click(View view) { + setFPSVisible(((CheckBox) view).isChecked()); + } + + public void tracking_checkbox_click(View view) { + setTrackPoints(((CheckBox) view).isChecked()); + } + + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + /** + * When a user has selected the Edit box to change the number of frames the detector processes per second + * and presses the 'DONE' button, the below block will be executed. + * */ + if (actionId == EditorInfo.IME_ACTION_DONE) { + int parsedInt = 0; + try { + parsedInt = Integer.parseInt(v.getText().toString()); + } catch (Exception e) { + v.setText(String.valueOf(detectorProcessRate)); + return false; + } + if (parsedInt > 0) { + detectorProcessRate = parsedInt; + detector.setMaxProcessRate(detectorProcessRate); + resetFPSCalculations(); //reset FPS variables, since changing the process rate should change the FPS. + } else { + v.setText(String.valueOf(detectorProcessRate)); + } + } + return false; //return false regardless, so Android closes the keyboard when user presses 'DONE' + } + + /** + * When the user taps the screen, hide the menu if it is visible and show it if it is hidden. + * **/ + void setMenuVisible(boolean b){ + isMenuVisible = b; + if (b) { + menuLayout.setVisibility(View.VISIBLE); + + //We display the navigation bar again + getWindow().getDecorView().setSystemUiVisibility( + View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); + } + else { + InputMethodManager imm = (InputMethodManager)getSystemService( + Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(fpsEditText.getWindowToken(), 0); + + //We hide the navigation bar + getWindow().getDecorView().setSystemUiVisibility( + View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_FULLSCREEN + | View.SYSTEM_UI_FLAG_IMMERSIVE); + + + menuLayout.setVisibility(View.INVISIBLE); + } + } + + /** + * If a user has a phone with a physical menu button, they may expect it to toggle + * the menu, so we add that functionality. + */ + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if (keyCode == KeyEvent.KEYCODE_MENU) { + setMenuVisible(!isMenuVisible); + return true; + } + return super.onKeyDown(keyCode, event); + } + + //If the user selects to have facial tracking dots drawn, inform our drawing thread. + void setTrackPoints(boolean b) { + drawingView.setDrawPointsEnabled(b); + } + + void setFPSVisible(boolean b) { + isFPSVisible = b; + if (b) { + fpsName.setVisibility(View.VISIBLE); + fpsPct.setVisibility(View.VISIBLE); + } else { + fpsName.setVisibility(View.INVISIBLE); + fpsPct.setVisibility(View.INVISIBLE); + } + } + + @Override + public boolean onTouch(View v, MotionEvent event) { + if (event.getAction() == MotionEvent.ACTION_DOWN) { + setMenuVisible(!isMenuVisible); + } + return false; + } +} + + diff --git a/AffdexMe/app/src/main/java/com/affectiva/affdexme/MetricView.java b/AffdexMe/app/src/main/java/com/affectiva/affdexme/MetricView.java new file mode 100644 index 0000000..9b300fe --- /dev/null +++ b/AffdexMe/app/src/main/java/com/affectiva/affdexme/MetricView.java @@ -0,0 +1,115 @@ +package com.affectiva.affdexme; + +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.Typeface; +import android.util.AttributeSet; +import android.view.View; +import java.lang.Math; + +/** + * The MetricView class is used to display metric scores on top of colored bars whose color depend on the score. + */ +public class MetricView extends View { + + float midX = 0; //coordinates of the center of the view + float midY = 0; + float halfWidth = 50;//default width and height of view + float height = 10; + String text = ""; //score in text format + Paint textPaint; + Paint boxPaint; + float left = 0; //colored bar is drawn using left,right,top, and height variables + float right = 0; + float top = 0; + float textBottom = 0; //tells our view where to draw the baseline of the font + + public MetricView(Context context) { + super(context); + initResources(context,null); + } + public MetricView(Context context, AttributeSet attrs) { + super(context,attrs); + initResources(context,attrs); + } + public MetricView(Context context, AttributeSet attrs, int styleID){ + super(context, attrs, styleID); + initResources(context,attrs); + } + + void initResources(Context context, AttributeSet attrs) { + + boxPaint = new Paint(); + boxPaint.setColor(Color.GREEN); + + textPaint = new Paint(); + textPaint.setStyle(Paint.Style.FILL); + textPaint.setTextAlign(Paint.Align.CENTER); + + int textSize = 15; //default text size value + + //load and parse XML attributes + if (attrs != null) { + TypedArray a = getContext().obtainStyledAttributes(attrs,R.styleable.custom_attributes,0,0); + textPaint.setColor(a.getColor(R.styleable.custom_attributes_textColor, Color.BLACK)); + textSize = a.getDimensionPixelSize(R.styleable.custom_attributes_textSize, textSize); + textPaint.setTextSize(textSize); + halfWidth = a.getDimensionPixelSize(R.styleable.custom_attributes_barLength,100)/2; + a.recycle(); + } else { + textPaint.setColor(Color.BLACK); + textPaint.setTextSize(textSize); + } + + /** + * We set the desired height of the view to be as large as our text. + * We also offset the bottom line at which our text is drawn, to give the appearance + * that the text is centered vertically. + */ + height = textSize; + textBottom = height - 5; + + } + + public void setTypeface(Typeface face) { + textPaint.setTypeface(face); + } + + public void setScore(float s){ + text = String.format("%.0f%%", s); //change the text of the view + left = midX - (halfWidth * (s / 100)); //change the coordinates at which the colored bar will be drawn + right = midX + (halfWidth * (s / 100)); + invalidate(); //instruct Android to re-draw our view, now that the text has changed + } + + /** + * set our view to be the minimum of the sizes that Android will allow and our desired sizes + * **/ + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setMeasuredDimension((int)Math.min(MeasureSpec.getSize(widthMeasureSpec), halfWidth *2), (int)Math.min(MeasureSpec.getSize(heightMeasureSpec),height)); + } + + @Override + protected void onSizeChanged(int w, int h, int oldW, int oldH) { + super.onSizeChanged(w,h,oldW,oldH); + midX = w/2; + midY = h/2; + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + //draws the colored bar that appears behind our score + canvas.drawRect(left,top,right,height, boxPaint); + //draws the score + canvas.drawText(text,midX , textBottom, textPaint); + } + + + + +} diff --git a/AffdexMe/app/src/main/res/drawable-hdpi/affectiva_logo_clear_background.png b/AffdexMe/app/src/main/res/drawable-hdpi/affectiva_logo_clear_background.png new file mode 100644 index 0000000000000000000000000000000000000000..4778791ca2352dfb98f17a1aac29040ea70aa96d GIT binary patch literal 12893 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 G;Qs+qT(RW< literal 0 HcmV?d00001 diff --git a/AffdexMe/app/src/main/res/drawable-mdpi/affectiva_logo_clear_background.png b/AffdexMe/app/src/main/res/drawable-mdpi/affectiva_logo_clear_background.png new file mode 100644 index 0000000000000000000000000000000000000000..2885705672dc999c0dec39db25e957489bcc8ffb GIT binary patch literal 5834 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 Un8%Tk*Z=?k07*qoM6N<$f(!>MR{#J2 literal 0 HcmV?d00001 diff --git a/AffdexMe/app/src/main/res/drawable-xhdpi/affectiva_logo_clear_background.png b/AffdexMe/app/src/main/res/drawable-xhdpi/affectiva_logo_clear_background.png new file mode 100644 index 0000000000000000000000000000000000000000..ed553b9486a79a3697329cd4057770332820ea25 GIT binary patch literal 19220 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 P;746qN2x}^GW>r5GI(3g literal 0 HcmV?d00001 diff --git a/AffdexMe/app/src/main/res/layout/activity_main.xml b/AffdexMe/app/src/main/res/layout/activity_main.xml new file mode 100644 index 0000000..f9c2ad1 --- /dev/null +++ b/AffdexMe/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + diff --git a/AffdexMe/app/src/main/res/layout/menu_layout.xml b/AffdexMe/app/src/main/res/layout/menu_layout.xml new file mode 100644 index 0000000..2a85b8b --- /dev/null +++ b/AffdexMe/app/src/main/res/layout/menu_layout.xml @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AffdexMe/app/src/main/res/layout/metric_layout.xml b/AffdexMe/app/src/main/res/layout/metric_layout.xml new file mode 100644 index 0000000..fd9acd8 --- /dev/null +++ b/AffdexMe/app/src/main/res/layout/metric_layout.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/AffdexMe/app/src/main/res/mipmap-hdpi/ic_launcher.png b/AffdexMe/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..563dd9f4c121c4220e687fa80667b9c1c4811c7a GIT binary patch literal 4258 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 Ef`P~s#Q*>R literal 0 HcmV?d00001 diff --git a/AffdexMe/app/src/main/res/mipmap-mdpi/ic_launcher.png b/AffdexMe/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..b930cda0bb4621b3b1988bc176d549ab41af072d GIT binary patch literal 2142 zcmV-k2%-0hP)Ip6d7obThjfXDKPh)+}R`j44)%p7^+7j|cTeS60Pk4pmq{*ud$g8BxL6lIOr zQe*%AS&#EAM?jm<6i}n2CP5&87-pT06Ak)`c$0q5Ysm>4epmMSmG+;^mH=Sya3I+l z^>7JPx3pnQYzzRPz+N|OUG=5-3a_8cI*aPl+#D9vVuYeRX(462OVehx`U0Z@#1IhB z5nxj2qE)ZoyDM|l@~4N5?D*-iVth1t!r&4pY`Bcfk%<6+&1Kc$t*VwxEWgtc)Up^d z-LG*hgGmn&)G1U)z?nF+dEanF?4R>Y5=}o`I=|fMTmUE|HI@p2p@)JOV#2fMB@f^9 z=9p3HlEPAan3*x~1nlijBu7U809GC^$@OUT8UgVVOaubJAONykJA;_O00bbJ&}tG& zWlCiDA2(dNa$fUmxiv2D9K9e&Ff59wD|>0&w-QIhUmr9JtSTyBAmT31k=B!~bK-k0O7 znV(FXSTT=bUR7cRFXTFh)w6po8D z!(ueCrZGGLKQ(oFpt43TjVUcQ+F&H4SGBZF4@%66HHT#vIy+Nr*V=X{%;b|2Zzm^A z=#>7F?NcT`7=gbQSHP%K5*nS}!T@tB1276vuM^0NH5+#QEF-P7Z2B{_a{pzzs44)->9P<_@w)YkCbZ>LzItj?bBiQWi2 z9cdPgF5lrGQz`+@5hmTjHIp-*T9ujc=Y{E`Yj16PFYva!Y*^!x(b8C}R36(Zj&6FF zYv$sCB{2a{8&V?;MM}V1`CA-?M!eSk+2tfb|z8UK?vvcpY03vngfqz`_X$!_i znCG2%_2n%g1*%)s001kB%4hxdNLkyu;))pnu&ki8&pK@RIR;yPPB)>O^QJ<#P+?RFW2uMEWD8_OOO5K#And}u)XR+DB$k`d}sZw-}?#soFZxaKHKCy z$A1wri5*onlU5a#jR62h!2gx*vnK31xbbMcUEg;X3IxE+G*AHUH`9Hw#QcI&U}kFQ zaEOoxZu58toj^~q&=={ERZN(9KnUC`(>zkrTQEPC$MRT)Sg`(I2JJ22=~1u%4LNJ{ z70?|d=vFdAfdoAW`60cc-p@i`Dfmza@5x;bZGQi@?~vTT^mfoW^si+DlcBu!{Qv;x z*}pwB-?il}#_sit?jjIqIoCgh&dT+30KikY7y$4^+5X$UgC%?Nvb)PcZ`TD~p#958 z@1>)57xgRAT(HOU z>68V^wB6t{KY$QA?_kcnVva^c)^7MqKKMO#)Sidl{7V1`UatvFks4^lWoDgcTgoNh z)&zF%&sqckj=uwHpmRV$2QL+Lm;GgH(tW3vo>7aIu>a(HM*%`aO{|5agaGNEL%v-3tdT^sA6hH>RaZ~4t zlsV^=rosZLn8HaPUBRp#lo2VX4Ux(9thYEo`XC8nDK(JP%F2O>2|Riz`TavxrqNDPRZy0z?D`11v#&!MJs z*k=p4PJDpyiL2o$U;A}Y`{4nQc#0uGS`gAaqMFT5E})dRniQ9PA^ESrPLOd#B8pk+ zyHMUavJwQ#4i@H8wti!oarA;S{c*#P_8#8G0+^Gg!da1P)?M8Y#g8NiSL zM5{E!R3c{L*09O>HtmAV!)iw=OYbO6^(7HY2%)ztLR{25*RHW~SgSE@u@eA%jYTje zO&VMRH^tXl0n-!DcUk7sX*t5vI9EWXNzG>!(g%hLzyLPJx`~u(X7x)=AMH}i$!)3< zaT#I5?S|A>_nC%eJn*e?zjuGW<}#S##&xaOwOa{iS1Y=)E8+sz&rP8Aif`%y*P<8% zsgH515zkyOC%jk`JiW9|vpy%oU-?8MA_Rj@==Bjp<1iC&HTIr1o%N5eW*#~DADz~_ UquVJgxBvhE07*qoM6N<$f}~;qoB#j- literal 0 HcmV?d00001 diff --git a/AffdexMe/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/AffdexMe/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..514621e946ead4cc39a702fcb7871cf7055aa2f1 GIT binary patch literal 5142 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 Ef=W`*MgRZ+ literal 0 HcmV?d00001 diff --git a/AffdexMe/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/AffdexMe/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 0000000000000000000000000000000000000000..8db4bba9478f9c167428de9958883d09104d46c9 GIT binary patch literal 11271 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

)l&4YlRvTD)B-BYpOYkuExvA-e- zE^wt6TeuPg`thBOf-bi1NEyib0$bM$? ztMk3xy*>WZ>@M!KTt4{WTXYPwkH`jb4-x$&oaDDGDooHdlvE z=YjnQ;-g{U*r{Q;GbzdC;@^hFF>$wnqakh&@PM=^>D?>BFHLQna;gY68Jb12pILdD z+PWA8O97k}hm;fs(_&y}f1F~stH<7+#2VdVJy zXd{Ik4B&*=U;ia-G`{{m$Zyoan_~Cv9FKg89)Y@_>N*}+5IIs4-;Y_Y`*egHYkb2+ z71-keD4->R&|WfrDZ?8aTYbgZ-i&!JdA0jJXXst2pTPAYqk!Hb$!T-kOGF9$asI&? zC_M+tA0nO}Fgoi#ZhfLfw<+`I=g;xatt~4P&bdZk3-HwoOPkI2RtG84esCHK{za#e z>ooppQg83aNA(|0jbc%@-e^*nP^BWBNA#kCw$KRsZ$+EQh`)Aa%HgykVdwRo6af}Uq>E=SDQ-{EqmmoWvY zKGWY~Ra>Zp`vF>V0zecc5PK-oS)~2HOLp|;`IP`}DwDmXeqlX5iLB^-DTzdd5d$oz z{vql5Eh^#~$x&bx!hV^*C}inci^42l&xpW)g!a@qxrFLb-St*p)T#r*qN~ zYjVt@m|j{(iT_67w~$TUQ{sqEWIBe=>x8V?(AB4bGEAi4sewJ)qbA?2RW*@k)Znwj z4?*Ji0chSBc}pZP{BL#v>Q2k3EbGwW$UR?)K4V8^Gu;9FFnI-%KSnSML`BfcOEKH) zMTxNpCFX~qG&UbD1+M|G&=DeD>cv7>Y4<=xcS(oK;YFAJ?9|<}mCCh8!^{rUla58j zf&EhNnl{hMB5m2yBb*_;)F#CGFzur)*%XF|P)b6>jEGToZAbNK(ut(m-mmC!57y6B z>k>OchLp!E{wItSo`>ijH`i4|h+bf{9bW190Cf>285DCYnTXvI>q?*Bh%Wp7g!x3j zIAR1~-$(Q1$-h2Wa5ah5z7)HC3u)R_p-{$QmBIEzR^g;!Y$xCiqE_BJGL1%5xy_>R zRl~NYMm7bOr66$8soMwyq7`yC~9av~7d40EiaqEZx}pNvu;@n=hu>9*6fV zq@B4G}aAcuRAKt$#Xz}H^Jy{<$M=%e# zg)`Bw;-Wq!$7zelyQ&MQy>U-obgWvx%2T2=eEp)=Tepy_45p1RiveD!!@>LWR(yV! zMb_Di3FGc%Bk~&0XNU_xCcI=ty*~b&m9Lje&j^m?7Z|L94iGS005u1|O0>%)>D%4* zk&l1X^(iZ5nP6_#evgYajQPtB`hxT~CSSF|HC@yDHo30WPNF6%gnGTu5{d_bVCr0T zP}K*UxmYpiz&T+Cok*TSF-jsKjay$j9pXQS<7Yy@+PwX93H0{bDDje57KICswV!k3 zYzC5+RmIbrcEih);V5KvGL~uR{8O~>CJGl-`{&rgjPTd7M+(oKIaAl$N^>#sXp*Ln zFj@@TsLi;qN5g}ir);Byz9tFRXvw=iVdTh(g%fg`?z4-FpuQ~76~oK=m-O~i2w-P)-&x|wa!STwlu3^)X|0JGOT-JQsY z5b;0nlUidmNKcHU*+49R!#apo@FRj022DU|?503p1#|0Z5jx@1c7}fC zE#|Eo#83~Em_8Eq(2_+0_~UwJDikWkgEB^?AIMRrN)dg{aMWi!W)4HtV7(h2Am?`-boau%hwJCoz}b3B zZ#q03j@xwB=i2+2jqBf9rz2mm>k_&@6+eTbJ;IS z&Y?JUM+F=MQH`)uujSgviI%VT8uRmrCJF-tL9PZ~6$i*wUBM#G3dyA#5e2Enw|}*C z+p+k1;xMPSx!S4vmU_PaW+QEUrv2HB$Qv%pAFq|c=wuEAxWB>w^yFUS>iwxLJq^Ld&eA~ z6=*a*PH-?TUfl3TWaiR(ZHwcE9(F((G*uNz zI0@aR=P>Ye^PNkQWC|vdPgz1BTHN3C;ybMd&r$Epen(gw;$sGvKENSP=Lz?w&DS%@ zr{wu4PRDua_-#r~dq-;aFH{>JbJeb>7#XF@mRJ6SKZ`Jm&IzBzRGecEP#YjXU*EE% zX8Z27H!lBF{r)Dn`;ZS$P~OJ>Wh`goYiZiWSy^(YJvP3qPpN@XyXQHfgRoV37R&|iQ0r4NuO@gn9QmWE&Q_8 z{S^#%Ok$mIxhj}WdMB-p)9!WtMB3Hry*O(X9?u(mYQK0}JYnv|5c}OrRTvh}tcNed zvi9#3-4Fg?+nOPEoA2CBE2u8J7CAzj<~Zxwtd|cL0TAet)m<(53%eg&)3aHusxP=s zp7{Dp;TgT(Le05T_O$U|zbA!;P73&*L>-xUjOCZRB)bC?n}U5i$$2Eqh_T&#-A_$B zwrF$o8qYorar(`49@#szfYfwhEo0{|H}bDXHQX(ThVxdWJbWTlC9n^}ClhoAzYU|cZSzRGtY&c%R z{*4D5mC;@s)Qd(hJHfL{sw%RXz;jr}|6(_otyIF+EgdYR_&i>1+Iif{Y%$Xi*!(QJ zY92HbDRK(fE)2>tGVhnh#(8h`l$|;8;XL~9vk3Yq%}>{HnlCy>$LsvNF3)8`^lUBP zRltAnKmMDo&Af4^&#+s+z=ZNlEo1${_}FyZcuL&WirS^+VarPgMY?mSFsc-WMx=#7 z24yPhherNiQYtsAX;sTY)6I6z-O^3tXtmmR47kG$Y_e8_JsBQyw++>nP?F(A`VJTVxWjt}{+!Y~wrqV#Az zZAt$RrT#;wnF6$A)byqQ?D34gBP-cYd(B_gjQ!)RiYHpIqLe_^|81rOOfmS+{69sj znfbr^&*XpV|Br%L8)p6yix8Df-AYQ)6n4W*0i|1H6_Njjn?6eh9do`heK(}}CdIjM z-)7)a3oB*G66_baKqNf3p7XD>!iCAeU?{Rb{8@Oe1fXQ^+)gC@tEpP#-$W9Tx%n6n z7vg;)e`D|>E@;EX3g_P=E?B0=v=krk`_re)(J;O-LiXd4GssjHSqKhN*7{lm5Wa}3 zM8i=4-hj5v@xD1xJouJDET%YJH2y8*4QR{-I7{szQqR{D@p}!PBB-PV6M57i|J6Ld z5BMS0m0Zlc;F(r;)t3|`Ldb%3E!97b4z~1fSQPNy1RQt2E5ZKb(w^M`ZORZ}*6mD9 zkAcJ;xDpTlfiSr1;XM|e;gZyH;e!-9Z&Rp-J-4kzzM6~1K@0f~^gM1Av^gJSx_@Ir z8ufVEw__r6xpFb!lHDi5+Sh`<+6K#+)2_52Z3(m_^+!+x6GEO_lX7 zG_Z7GjnGZOpBB~f8K_Fgt0tBtlE!HwqvraY*5VyE8xRTba-4XY9430D-*(!GE`h-j z5MH!@rE{JTXv-`@gb>2U(o-q+A~{v>^H&-v78O}<%6Z^#l0AD!*W*;G%ISm7$Z>O8 zpStfH9xZ0979<}H2vIU_xH*4)!qMRs>zj39tathM)D#1(KOM*4JKm+tzYfk#KU3a! zVz{wlq*K$HiMUrO^d}2s3nQ1e4}^K{a8-A8O9(wQBnqjLX_PW+v$Ep2em=GH-D2^` zZ}*5#ht3gN1^zAzr@sfI0Ph7kUR0C5p_1I~Y80(^J-*R8wBgG})&y*|uqF~ogG9l7 z(!ndg-k{?4-*Nm+Lg+bM2;?DWponMKkIVXi=ixPEb<6dx8>zVFnMwaOdAam#Cj7I( zrK#U+!gVmpiLA;f_B(Zy=G{W*FP{ggKCiF)(YxScb&>4q$UB*8A58pt#sPrR9t7>@JGI?sGRoQH|!_EEH|Xco^vgxAksKh zRyxo8>QV_5?sNe?&td-`_#2mGQ&o=N2u1J0PpM9-Yb^ovw?F&B$Ryo-%dISO%d*Qf zFM__@Nrl~+>F^H6mX!Hjv|o@!dpYhpUR4thnkx4t1L?6*Mj|{0j z1(C$uGw`!}4dD>*CEVqLe6X8*dyqPXKr>wm$>5s$*G*^p6N;FzTtDz8P7jH#db}*6Qkg>=Dv}octnZ=rwz| zSV3oJouQvc)v7kL!`4qpvACe(`qVBHtpj3*`D%e#Q)ts*gAc~Qy$MbRM41lEUDJ*O z>ff(JH0L~2Zx>3j>NmcLovXFnjC0OP$yT^%7Q&dtLETE9G;Aj4)V^%h>jP9I^I+s0 zCqBpht!sv;&LaOhO&q*U$6FpSCe(Y&WzT2D>ex382u=Nk~#FEDh z1|PG5oBa2m&Tda1^Ds^`sfT`c)0p3~Ut$z-(kPO!YLce5)wzLkTMb9b;KG!`l~+5d zr(A8P&-<*(xmf}9K&H@SpeN77W7>TE!+aqqZx~@=CwNGD%muubJ5zTv^QTJbH{kvPG@^i^SWpg>za@x^82$FD63+7^J#Rz~E`Hw)lwXu*PL)c1yGBG>BYy8+%G+ z$rFH71BQVqXr%dMwIB0McRm`u*kIbw$bx4T+1-e|IO)al4k_MO`E{ETon@vP{EV7?S2nSLp6C1bN-}X?LTszdT+n~94rl!9%Zx=M^xV7dw|8f=bVmj zFU-|!qGyb2J+R4xV0*e!e-hY``xe_FA$0QkS$)NsRhc5i$1@-M6G|8)6Ud2D-Xdz^ zw8*0Ty9^m@<%uhvFe;?4@K%NI3jv}$VqcWzWC7!0^}2JajYl*IQg8PHnK)P9O^^;3>$IrJzR&-yc`a*b^1etPCDGO+){ag67Xwb{wAQqy9hVwsu)2qcM#!l~?Vz8LYLzn(PwyWagbi$9|j=&0Yo|x#UH%MGPlm>w+^cPV+F&rbL zexpG*&5Lm5P_H(Gh1{tK=GqKA7Jm_EH!2f1YkArz=_)p?x)0p&x2R z2^WG`cWh#{Y>T-G9unB8!;e^$Kr%(a!=<0Cph4HzrRlYMw*N`xNrnu}TlI}OF^>q=D7K*Asj&ty z$gIFz=lrE<9q;&MGo0@?K#dp{qKWYt6Q7#tL|VJfrrKl0P1kBK%cG3}LK7~)?mixT z9-ZU3_T9oOO~}zyu%uUJ`s;R4JoK1IH>!E67FUE+EpDyhw76$twk&?ouA2(GU7AC? zhD6UD7aR%vg3%x<851@hsN3<|5qeO`ZqRI})lJoaTErXP>6GSNbFOMC0YbsE{5;=t zmfiH)L)vWnJ#Eo}fCga-AZ;sALuDwts5f;H>rV|G6Ba|#GKQdPu)8%5RXvJgW4N*Z zh*oOybVK*+X-Oxwi#xh~SNgt$&dQM7h1Lmh#_SM3U}P#N@N16ik1qo-4cAW~hAJxO zv(VN!o?kNfjt&>3c~jr)*!Xw-iQvjk?+bEM*F@|is0JvI83#qm%Mu?&76=4E5ThPy z)Jw@jd1qJG@^wvBdDLFt1^fh|*y7@I9ps(g1Jlr$ecKoQ#RA>8Z_{DE&~-M)GLbQs&Y{GRer7@#gZR@BkuThh3G ztsr*jm||oRwzGG9?xLdRG@HNtZhnfsrI=ArYgz5=jXsbvBprfJAw+|J1O((c<&ucx zGO)2HZD`962B~l{RK$wNMhP5d7Dz!;54sx@OK%U9JWDNNmLzGZs5rXsPD1G-8TK1; zcj!<6!6=2q@GGh@c0E#7pY67eJ$nBdfSv_5h|yWiX-}jGpoJojvQ>=N9o!84d%x+p z{;Zm)Znj}?I8PY?ug^`A|(N7G=$NqGLz9;i~cd(McznW{(2?h|Y%^R%w&Obi? z`|ZbCmaGI5aB)K}un{ZOpy{Dv-V&>jtjrd<%kfncb!aN8&F#<8)Y;oGAX4lX=3h=t z&QGsE3-9wku&7h)Y?$m*BO;x7M81y^MMZ5tgTP-?*m!!!{ULfmVV zYDj{pkdml8IWj$p9uZd<1eHEXiw z?fTaR)6v~Ep@_$$ejD2FA)66~ms$7-p*?hLJkIJC@1iT-Ujvwfctd*tBog0Sm6j&j z26CWlsc?kSfm~@Gmm(@e7PXdQo_-2e9JFLWk}(x7Cp+1SWbd}T3BOr!`n3PUY{;6hxSFP~S` zFdA__g99@v2q2sb8bE=vjh)XN3eH(I%J78CYo`sNdqoEYCJ7yE#kZx6f34R7=Y6JT z*p{^8`N`5;wJ(Z^%3hKfMYU8f^xrwnvS&J>i?St&3~lTcgi+oN&8zHVsY3h-$UL|K z`8)aOdcNYmankTD(a+-%CMNE?`(saDe~>M4P-1Ztu? z^$VjRnoLV|_8_<1d7JheY(7Tv zUt{S6ReQq|xdX|)y`xtj&*W6*2XxFmI4mx@hv>4T@v6(H?%tdgatbw4@!q>l1qo&` z1pYw&7$|`XIvOAhtMPkgw-MPT==vMwFV|?r5k1UMocaFp-?tid6&NImfz$>fP0hZG zRZAZfyTsx|z`qx?%e!UVaPaT25!?9Pa!w5gEWLFA@g^n4{>Upi}_tz<0cv z_4j>-UUS2y5^l>Tpl%yu755AqzxU)McSdpyK{^S%XlNl4&5zlUJ9)9M!f05H-k(%8 z{gZ;;J0@g7_b|n`vB~77LS3@E^ZD0p2u#l2axAYPG#7iSv3`b(a%oH!>*jm(+O{;? z^3sjr;&bXVL1Qwb@7N;G+Y;5DuASL{NuF$(NnZFQs7buCeiIhcJ|odHKOWwU@Vk3| zokpQgqWtZNm%mR5*%GIEcG8cz!ou-5fh4Wu%dM3{aGMjNM&}t}g5>nHW$X z6s+kD_<=~hFC+j-G_)Q#s|_!oZFQllK^rnCjlhfG87KYjcM$ul{bJu_b?b3ql|YMQy$u4$dY^=BwQvRd*8-niotXCGE*Qd58eQTdyOKaDtYq>J|p|A63B*$r1k9?+m zA@(IU0t=;$oH_KaW^k4cw(wT9wX_j4`a;p)2Adj~5!&L+FatOfs}~g?{Rp3Zlnr6^ zc?>S9m86vmYJfjn@-dGkH@n6xG=H=o0yp^?OO%b|bDBS`P~321 z5qFg(K0k;K?;z8c9&F}1v^jJ3oRBSRoynhP{zFBT!Y;!AdIOF6+W_6OaSAFk zfn8XhL8zqJvtZou^o#Q9#k$w5eOvxg%U?}lN9#EI)jw7lbBVh2BMe|IpWI+CCYa!Z z2_L@9tR~5bTqA~-&U(L}z4S<~VjB)UL>OeygT(=(_dUc2)ZBRr_>_Ri03$z4Bmdia z#9en8)AjCF)TxZpAw&)*IFq@R8BCF6!70h4oInRwy)LFP;%Y&o0~~N_)56~b&GgV< z@nW8J*ict@YH_>eSsp&vf0C_!&_U$prS`ffk~W`N0Bg(U=T#&<{$Mz?#WtMKC~jPT zU)`K)IMGV4DsBZn}l97Y!6#LeJQ zJ<9;k0`$%;b0xok}8 z&SMNp{D$oCUuhNl2@Fm8GM8rDL(4LZ;kHYSUmM-ZDQDcG{i_)&4nrEazs0O{P-NTY zv|!t{pz)1JZHd#1US%#a)e`pH(Wm92c%JV>G5#0d`YfZw50n3gVE+fW{vZAS0PG{n c-&cfHsh9*eGM~kNA-ezt8CB^jNl4)T0+;MwZU6uP literal 0 HcmV?d00001 diff --git a/AffdexMe/app/src/main/res/values-large/dimens.xml b/AffdexMe/app/src/main/res/values-large/dimens.xml new file mode 100644 index 0000000..62daeb5 --- /dev/null +++ b/AffdexMe/app/src/main/res/values-large/dimens.xml @@ -0,0 +1,10 @@ + + 24sp + 14sp + 18sp + 130dp + 10dp + 190dp + 180dp + 15dp + diff --git a/AffdexMe/app/src/main/res/values-normal/dimens.xml b/AffdexMe/app/src/main/res/values-normal/dimens.xml new file mode 100644 index 0000000..409136a --- /dev/null +++ b/AffdexMe/app/src/main/res/values-normal/dimens.xml @@ -0,0 +1,10 @@ + + 14sp + 11sp + 13sp + 80dp + 5dp + 130dp + 120dp + 10dp + diff --git a/AffdexMe/app/src/main/res/values-small/dimens.xml b/AffdexMe/app/src/main/res/values-small/dimens.xml new file mode 100644 index 0000000..1651c62 --- /dev/null +++ b/AffdexMe/app/src/main/res/values-small/dimens.xml @@ -0,0 +1,10 @@ + + 12sp + 9sp + 12sp + 70dp + 5dp + 130dp + 100dp + 8dp + diff --git a/AffdexMe/app/src/main/res/values-xlarge/dimens.xml b/AffdexMe/app/src/main/res/values-xlarge/dimens.xml new file mode 100644 index 0000000..f1b3f07 --- /dev/null +++ b/AffdexMe/app/src/main/res/values-xlarge/dimens.xml @@ -0,0 +1,11 @@ + + + 28sp + 18sp + 23sp + 140dp + 15dp + 220dp + 250dp + 25dp + \ No newline at end of file diff --git a/AffdexMe/app/src/main/res/values/attrs.xml b/AffdexMe/app/src/main/res/values/attrs.xml new file mode 100644 index 0000000..803712e --- /dev/null +++ b/AffdexMe/app/src/main/res/values/attrs.xml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/AffdexMe/app/src/main/res/values/colors.xml b/AffdexMe/app/src/main/res/values/colors.xml new file mode 100644 index 0000000..231fb0c --- /dev/null +++ b/AffdexMe/app/src/main/res/values/colors.xml @@ -0,0 +1,7 @@ + + + #55ffffff + #514a40 + #ff8000 + #000000 + \ No newline at end of file diff --git a/AffdexMe/app/src/main/res/values/dimens.xml b/AffdexMe/app/src/main/res/values/dimens.xml new file mode 100644 index 0000000..d95eff9 --- /dev/null +++ b/AffdexMe/app/src/main/res/values/dimens.xml @@ -0,0 +1,10 @@ + + 14sp + 11sp + 13sp + 80dp + 5dp + 140dp + 120dp + 10dp + diff --git a/AffdexMe/app/src/main/res/values/metricStyleName.xml b/AffdexMe/app/src/main/res/values/metricStyleName.xml new file mode 100644 index 0000000..9be4d73 --- /dev/null +++ b/AffdexMe/app/src/main/res/values/metricStyleName.xml @@ -0,0 +1,15 @@ + + + + \ No newline at end of file diff --git a/AffdexMe/app/src/main/res/values/metricStylePct.xml b/AffdexMe/app/src/main/res/values/metricStylePct.xml new file mode 100644 index 0000000..1d43135 --- /dev/null +++ b/AffdexMe/app/src/main/res/values/metricStylePct.xml @@ -0,0 +1,11 @@ + + + + \ No newline at end of file diff --git a/AffdexMe/app/src/main/res/values/optionsStyle.xml b/AffdexMe/app/src/main/res/values/optionsStyle.xml new file mode 100644 index 0000000..d359cd0 --- /dev/null +++ b/AffdexMe/app/src/main/res/values/optionsStyle.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/AffdexMe/app/src/main/res/values/strings.xml b/AffdexMe/app/src/main/res/values/strings.xml new file mode 100644 index 0000000..41f773b --- /dev/null +++ b/AffdexMe/app/src/main/res/values/strings.xml @@ -0,0 +1,18 @@ + + AffdexMe + + SMILE + BROW RAISE + BROW FURROW + VALENCE + ENGAGEMENT + FROWN + FPS: + + Show FPS + Show Tracking + Processed Frames Per Second: + + Sorry, AffdexMe requires the use of a front-facing camera, which was not found on your device. + + diff --git a/AffdexMe/app/src/main/res/values/styles.xml b/AffdexMe/app/src/main/res/values/styles.xml new file mode 100644 index 0000000..7cc1e27 --- /dev/null +++ b/AffdexMe/app/src/main/res/values/styles.xml @@ -0,0 +1,6 @@ + + + + diff --git a/AffdexMe/build.gradle b/AffdexMe/build.gradle new file mode 100644 index 0000000..9405f3f --- /dev/null +++ b/AffdexMe/build.gradle @@ -0,0 +1,19 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + repositories { + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:1.2.3' + + // NOTE: Do not place your application dependencies here; they belong + // in the individual module build.gradle files + } +} + +allprojects { + repositories { + jcenter() + } +} diff --git a/AffdexMe/gradle.properties b/AffdexMe/gradle.properties new file mode 100644 index 0000000..1d3591c --- /dev/null +++ b/AffdexMe/gradle.properties @@ -0,0 +1,18 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +# Default value: -Xmx10248m -XX:MaxPermSize=256m +# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 + +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true \ No newline at end of file diff --git a/AffdexMe/gradle/wrapper/gradle-wrapper.jar b/AffdexMe/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..8c0fb64a8698b08ecc4158d828ca593c4928e9dd GIT binary patch literal 49896 zcmagFb986H(k`5d^NVfUwr$(C?M#x1ZQHiZiEVpg+jrjgoQrerx!>1o_ul)D>ebz~ zs=Mmxr&>W81QY-S1PKWQ%N-;H^tS;2*XwVA`dej1RRn1z<;3VgfE4~kaG`A%QSPsR z#ovnZe+tS9%1MfeDyz`RirvdjPRK~p(#^q2(^5@O&NM19EHdvN-A&StN>0g6QA^VN z0Gx%Gq#PD$QMRFzmK+utjS^Y1F0e8&u&^=w5K<;4Rz|i3A=o|IKLY+g`iK6vfr9?+ z-`>gmU&i?FGSL5&F?TXFu`&Js6h;15QFkXp2M1H9|Eq~bpov-GU(uz%mH0n55wUl- zv#~ccAz`F5wlQ>e_KlJS3@{)B?^v*EQM=IxLa&76^y51a((wq|2-`qON>+4dLc{Oo z51}}o^Zen(oAjxDK7b++9_Yg`67p$bPo3~BCpGM7uAWmvIhWc5Gi+gQZ|Pwa-Gll@<1xmcPy z|NZmu6m)g5Ftu~BG&Xdxclw7Cij{xbBMBn-LMII#Slp`AElb&2^Hw+w>(3crLH!;I zN+Vk$D+wP1#^!MDCiad@vM>H#6+`Ct#~6VHL4lzmy;lSdk>`z6)=>Wh15Q2)dQtGqvn0vJU@+(B5{MUc*qs4!T+V=q=wy)<6$~ z!G>e_4dN@lGeF_$q9`Ju6Ncb*x?O7=l{anm7Eahuj_6lA{*#Gv*TaJclevPVbbVYu z(NY?5q+xxbO6%g1xF0r@Ix8fJ~u)VRUp`S%&rN$&e!Od`~s+64J z5*)*WSi*i{k%JjMSIN#X;jC{HG$-^iX+5f5BGOIHWAl*%15Z#!xntpk($-EGKCzKa zT7{siZ9;4TICsWQ$pu&wKZQTCvpI$Xvzwxoi+XkkpeE&&kFb!B?h2hi%^YlXt|-@5 zHJ~%AN!g_^tmn1?HSm^|gCE#!GRtK2(L{9pL#hp0xh zME}|DB>(5)`iE7CM)&_+S}-Bslc#@B5W4_+k4Cp$l>iVyg$KP>CN?SVGZ(&02>iZK zB<^HP$g$Lq*L$BWd?2(F?-MUbNWTJVQdW7$#8a|k_30#vHAD1Z{c#p;bETk0VnU5A zBgLe2HFJ3032$G<`m*OB!KM$*sdM20jm)It5OSru@tXpK5LT>#8)N!*skNu1$TpIw zufjjdp#lyH5bZ%|Iuo|iu9vG1HrIVWLH>278xo>aVBkPN3V$~!=KnlXQ4eDqS7%E% zQ!z^$Q$b^6Q)g#cLpwur(|<0gWHo6A6jc;n`t(V9T;LzTAU{IAu*uEQ%Ort1k+Kn+f_N`9|bxYC+~Z1 zCC1UCWv*Orx$_@ydv9mIe(liLfOr7mhbV@tKw{6)q^1DH1nmvZ0cj215R<~&I<4S| zgnr;9Cdjqpz#o8i0CQjtl`}{c*P)aSdH|abxGdrR)-3z+02-eX(k*B)Uqv6~^nh** z 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >&- +APP_HOME="`pwd -P`" +cd "$SAVED" >&- + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/AffdexMe/gradlew.bat b/AffdexMe/gradlew.bat new file mode 100644 index 0000000..8a0b282 --- /dev/null +++ b/AffdexMe/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windowz variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/AffdexMe/settings.gradle b/AffdexMe/settings.gradle new file mode 100644 index 0000000..e7b4def --- /dev/null +++ b/AffdexMe/settings.gradle @@ -0,0 +1 @@ +include ':app' diff --git a/README.md b/README.md new file mode 100644 index 0000000..430e17a --- /dev/null +++ b/README.md @@ -0,0 +1,28 @@ +#Sample App for Affdex SDK for Android + +Welcome to our repository on GitHub! Here you will find example code to get you started with our Affdex SDK for Android and begin emotion-enabling you own app! + +AffdexMe +-------- + +*Dependencies* + +- Affectiva Android SDK (visit http://www.affectiva.com/solutions/apis-sdks/) + +**AffdexMe** is an app that demonstrates the use of the Affectiva Android SDK. It uses the front-facing camera on your Android device to view, process and analyze live video of your face. Start the app and you will see your own face on the screen and metrics describing your expressions. Tapping the screen will bring up a menu with options to display the Processed Frames Per Second metric, display facial tracking points, and control the rate at which frames are processed by the SDK. + +Most of the methods in this file control the application's UI. Therefore, if you are just interested in learning how the Affectiva SDK works, you will find the calls relevant to the use of the SDK in the startCamera() and stopCamera() methods, as well as the onImageResults() method. + +In order to use this project, you will need to: +- Obtain the Affectiva Android SDK +- Copy the contents of the SDK's assets folder into this project's assets folder +- Copy the contents of the SDK's libs folder into this project's libs folder +- Copy the armeabi-v7a folder (found in the SDK libs folder) into this project's jniLibs folder +- Add your license file to the /assets/Affdex folder and uncomment the line in the startCamera() method which specifies your license file path +- Build the project +- Run the app on an Android device with a front-facing camera + +Copyright (c) 2014 Affectiva. All rights reserved. + + +See the comment section at the top of the MainActivity.java file for more information. \ No newline at end of file