From fc4f6ea0e5e30c3a6d2e00461c63696836cfdba4 Mon Sep 17 00:00:00 2001 From: Roy Ben-Shabat Date: Mon, 19 Nov 2018 17:30:31 +0200 Subject: Working on color capture app... --- .../Android_Studio/ColorCapture/app/build.gradle | 5 +- .../app/src/main/color_fine_tuning-web.png | Bin 0 -> 21864 bytes .../ColorCapture/app/src/main/cpp/native-lib.cpp | 132 ++++- .../colorcapture/dagger/ApplicationComponent.java | 3 + .../colorcapture/dagger/ViewModelsModule.java | 10 +- .../com/twine/colorcapture/mvvm/FragmentBase.java | 14 + .../com/twine/colorcapture/mvvm/RelayCommand.java | 2 +- .../colorcapture/navigation/NavigationView.java | 1 + .../twine/colorcapture/opencv/ImageProcessor.java | 6 + .../views/capture/CaptureFragment.java | 249 ++++++++++ .../views/capture/CaptureFragmentVM.java | 8 + .../views/capture/ICaptureFragment.java | 7 + .../colorcapture/views/home/HomeFragment.java | 43 ++ .../colorcapture/views/home/HomeFragmentVM.java | 18 +- .../colorcapture/views/home/IHomeFragment.java | 4 +- .../colorcapture/views/main/MainActivity.java | 34 +- .../colorcapture/views/main/MainActivityVM.java | 7 +- .../app/src/main/res/drawable/application_logs.png | Bin 0 -> 16421 bytes .../app/src/main/res/drawable/hand_fabric.png | Bin 0 -> 231422 bytes .../app/src/main/res/drawable/hand_phone.png | Bin 0 -> 268124 bytes .../src/main/res/drawable/loading_background.png | Bin 0 -> 347710 bytes .../app/src/main/res/drawable/take_picture.png | Bin 0 -> 232959 bytes .../app/src/main/res/layout/fragment_capture.xml | 46 ++ .../app/src/main/res/layout/fragment_home.xml | 11 + .../app/src/main/res/layout/fragment_loading.xml | 75 +-- .../ColorCapture/onboarding/.gitignore | 1 + .../ColorCapture/onboarding/build.gradle | 34 ++ .../ColorCapture/onboarding/proguard-rules.pro | 21 + .../twine/onboarding/ExampleInstrumentedTest.java | 28 ++ .../onboarding/src/main/AndroidManifest.xml | 2 + .../twine/onboarding/PaperOnboardingEngine.java | 542 +++++++++++++++++++++ .../twine/onboarding/PaperOnboardingFragment.java | 81 +++ .../com/twine/onboarding/PaperOnboardingPage.java | 103 ++++ .../onboarding/listeners/AnimatorEndListener.java | 24 + .../onboarding/listeners/OnSwipeListener.java | 77 +++ .../listeners/PaperOnboardingOnChangeListener.java | 7 + .../PaperOnboardingOnLeftOutListener.java | 7 + .../PaperOnboardingOnRightOutListener.java | 7 + .../utils/PaperOnboardingEngineDefaults.java | 28 ++ .../res/drawable/onboarding_pager_circle_icon.xml | 9 + .../res/drawable/onboarding_pager_round_icon.xml | 7 + .../src/main/res/layout/onboarding_main_layout.xml | 67 +++ .../main/res/layout/onboarding_pager_layout.xml | 19 + .../res/layout/onboarding_text_content_layout.xml | 25 + .../onboarding/src/main/res/values/strings.xml | 3 + .../java/com/twine/onboarding/ExampleUnitTest.java | 19 + .../Android_Studio/ColorCapture/settings.gradle | 2 +- .../Graphics/True Color Capture/hand_fabric.png | Bin 0 -> 231422 bytes .../Graphics/True Color Capture/hand_phone.png | Bin 0 -> 268124 bytes .../True Color Capture/loading_background.png | Bin 0 -> 347710 bytes .../Graphics/True Color Capture/take_picture.png | Bin 0 -> 232959 bytes 51 files changed, 1727 insertions(+), 61 deletions(-) create mode 100644 Software/Android_Studio/ColorCapture/app/src/main/color_fine_tuning-web.png create mode 100644 Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/opencv/ImageProcessor.java create mode 100644 Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/capture/CaptureFragment.java create mode 100644 Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/capture/CaptureFragmentVM.java create mode 100644 Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/capture/ICaptureFragment.java create mode 100644 Software/Android_Studio/ColorCapture/app/src/main/res/drawable/application_logs.png create mode 100644 Software/Android_Studio/ColorCapture/app/src/main/res/drawable/hand_fabric.png create mode 100644 Software/Android_Studio/ColorCapture/app/src/main/res/drawable/hand_phone.png create mode 100644 Software/Android_Studio/ColorCapture/app/src/main/res/drawable/loading_background.png create mode 100644 Software/Android_Studio/ColorCapture/app/src/main/res/drawable/take_picture.png create mode 100644 Software/Android_Studio/ColorCapture/app/src/main/res/layout/fragment_capture.xml create mode 100644 Software/Android_Studio/ColorCapture/onboarding/.gitignore create mode 100644 Software/Android_Studio/ColorCapture/onboarding/build.gradle create mode 100644 Software/Android_Studio/ColorCapture/onboarding/proguard-rules.pro create mode 100644 Software/Android_Studio/ColorCapture/onboarding/src/androidTest/java/com/twine/onboarding/ExampleInstrumentedTest.java create mode 100644 Software/Android_Studio/ColorCapture/onboarding/src/main/AndroidManifest.xml create mode 100644 Software/Android_Studio/ColorCapture/onboarding/src/main/java/com/twine/onboarding/PaperOnboardingEngine.java create mode 100644 Software/Android_Studio/ColorCapture/onboarding/src/main/java/com/twine/onboarding/PaperOnboardingFragment.java create mode 100644 Software/Android_Studio/ColorCapture/onboarding/src/main/java/com/twine/onboarding/PaperOnboardingPage.java create mode 100644 Software/Android_Studio/ColorCapture/onboarding/src/main/java/com/twine/onboarding/listeners/AnimatorEndListener.java create mode 100644 Software/Android_Studio/ColorCapture/onboarding/src/main/java/com/twine/onboarding/listeners/OnSwipeListener.java create mode 100644 Software/Android_Studio/ColorCapture/onboarding/src/main/java/com/twine/onboarding/listeners/PaperOnboardingOnChangeListener.java create mode 100644 Software/Android_Studio/ColorCapture/onboarding/src/main/java/com/twine/onboarding/listeners/PaperOnboardingOnLeftOutListener.java create mode 100644 Software/Android_Studio/ColorCapture/onboarding/src/main/java/com/twine/onboarding/listeners/PaperOnboardingOnRightOutListener.java create mode 100644 Software/Android_Studio/ColorCapture/onboarding/src/main/java/com/twine/onboarding/utils/PaperOnboardingEngineDefaults.java create mode 100644 Software/Android_Studio/ColorCapture/onboarding/src/main/res/drawable/onboarding_pager_circle_icon.xml create mode 100644 Software/Android_Studio/ColorCapture/onboarding/src/main/res/drawable/onboarding_pager_round_icon.xml create mode 100644 Software/Android_Studio/ColorCapture/onboarding/src/main/res/layout/onboarding_main_layout.xml create mode 100644 Software/Android_Studio/ColorCapture/onboarding/src/main/res/layout/onboarding_pager_layout.xml create mode 100644 Software/Android_Studio/ColorCapture/onboarding/src/main/res/layout/onboarding_text_content_layout.xml create mode 100644 Software/Android_Studio/ColorCapture/onboarding/src/main/res/values/strings.xml create mode 100644 Software/Android_Studio/ColorCapture/onboarding/src/test/java/com/twine/onboarding/ExampleUnitTest.java create mode 100644 Software/Graphics/True Color Capture/hand_fabric.png create mode 100644 Software/Graphics/True Color Capture/hand_phone.png create mode 100644 Software/Graphics/True Color Capture/loading_background.png create mode 100644 Software/Graphics/True Color Capture/take_picture.png diff --git a/Software/Android_Studio/ColorCapture/app/build.gradle b/Software/Android_Studio/ColorCapture/app/build.gradle index febf35bea..6caa47dec 100644 --- a/Software/Android_Studio/ColorCapture/app/build.gradle +++ b/Software/Android_Studio/ColorCapture/app/build.gradle @@ -39,7 +39,7 @@ android { } dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation fileTree(include: ['*.jar'], dir: 'libs') implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support.constraint:constraint-layout:1.1.3' implementation 'com.android.support:support-v4:27.1.1' @@ -47,7 +47,6 @@ dependencies { testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' - compile 'io.reactivex.rxjava2:rxandroid:2.0.1' compile 'io.reactivex.rxjava2:rxjava:2.1.5' compile 'com.google.dagger:dagger:2.11' @@ -59,8 +58,8 @@ dependencies { compile 'com.jakewharton:butterknife:8.7.0' compile 'net.danlew:android.joda:2.9.9.1' compile 'com.squareup:otto:1.3.8' - annotationProcessor 'com.jakewharton:butterknife-compiler:8.7.0' annotationProcessor 'com.google.dagger:dagger-android-processor:2.11' annotationProcessor 'com.google.dagger:dagger-compiler:2.11' + implementation project(':onboarding') } diff --git a/Software/Android_Studio/ColorCapture/app/src/main/color_fine_tuning-web.png b/Software/Android_Studio/ColorCapture/app/src/main/color_fine_tuning-web.png new file mode 100644 index 000000000..7f1c46806 Binary files /dev/null and b/Software/Android_Studio/ColorCapture/app/src/main/color_fine_tuning-web.png differ diff --git a/Software/Android_Studio/ColorCapture/app/src/main/cpp/native-lib.cpp b/Software/Android_Studio/ColorCapture/app/src/main/cpp/native-lib.cpp index 6da71fd81..3afccbec0 100644 --- a/Software/Android_Studio/ColorCapture/app/src/main/cpp/native-lib.cpp +++ b/Software/Android_Studio/ColorCapture/app/src/main/cpp/native-lib.cpp @@ -3,18 +3,132 @@ #include #include #include +#include #include using namespace cv; -extern "C" JNIEXPORT jstring JNICALL -Java_com_twine_colorcapture_views_main_MainActivity_stringFromJNI( - JNIEnv *env, - jobject /* this */) -{ - ColorCaptureLib capture; - Mat rgb; +Mat *mCanny = NULL; + +enum RotateFlags { + ROTATE_90DEG_CLOCKWISE = 0, //Rotate 90 degrees clockwise + ROTATE_180DEG = 1, //Rotate 180 degrees clockwise + ROTATE_90_DEFCOUNTERCLOCKWISEDEG = 2, //Rotate 270 degrees clockwise +}; - std::string hello = "Hello from C++"; - return env->NewStringUTF(hello.c_str()); +void rot90(cv::Mat &matImage, int rotflag) { + //1=CW, 2=CCW, 3=180 + if (rotflag == 1) { + transpose(matImage, matImage); + flip(matImage, matImage, 1); //transpose+flip(1)=CW + } else if (rotflag == 2) { + transpose(matImage, matImage); + flip(matImage, matImage, 0); //transpose+flip(0)=CCW + } else if (rotflag == 3) { + flip(matImage, matImage, -1); //flip(-1)=180 + } else if (rotflag != 0) { //if not 0,1,2,3: + cout << "Unknown rotation flag(" << rotflag << ")" << endl; + } } + +extern "C" JNIEXPORT jboolean JNICALL +Java_com_twine_colorcapture_opencv_ImageProcessor_ProcessImage( + JNIEnv *env, jobject instance, jint width, + jint height, jbyteArray NV21FrameData, + jintArray outPixels,jintArray wrapedOutPixels) +{ + jbyte *pNV21FrameData = env->GetByteArrayElements(NV21FrameData, 0); + jint *poutPixels = env->GetIntArrayElements(outPixels, 0); + jint *pwrapedPixels = env->GetIntArrayElements(wrapedOutPixels, 0); + + //// + + jboolean has_result = false; + + try { + ColorCaptureLib capture; + + if (mCanny == NULL) { + mCanny = new Mat(height, width, CV_8UC1); + } + + Mat yuv(height + height / 2, width, CV_8UC1, (unsigned char *) pNV21FrameData); + Mat rgb; + Mat result(width, height, CV_8UC4, (unsigned char *) poutPixels); + cvtColor(yuv, rgb, COLOR_YUV2RGB_NV21); + + Mat gray; + Mat dst; + cvtColor(rgb, gray, CV_RGB2GRAY); + cv::Laplacian(gray, dst, CV_64F); + + cv::Scalar mu, sigma; + cv::meanStdDev(dst, mu, sigma); + + double focusMeasure = sigma.val[0] * sigma.val[0]; + + __android_log_print(ANDROID_LOG_ERROR, "FOCUS", "\n Focus measure is %f \n", focusMeasure); + + rot90(rgb,ROTATE_180DEG); + + //resize(src, dst, dst.size(), 0, 0, interpolation); + +/* Point2f src_center(rgb.cols / 2.0F, rgb.rows / 2.0F); + Mat rot_mat = getRotationMatrix2D(src_center, -90, 1.0); + warpAffine(rgb, rgb, rot_mat, rgb.size());*/ + + vector vertices = capture.GetQRVertices4(rgb); + + for (size_t i = 0; i < vertices.size(); i++) { + circle(rgb, vertices[i], 2, CV_RGB(0, 0, 255), -1); + } + + int w = 300; + int h = 330; + + Mat wraped(h,w,CV_8UC4, (unsigned char *) pwrapedPixels); + + if (vertices.size() == 4) { + + has_result = jboolean(true); + + Mat m = capture.ApplyHomography(rgb, vertices, Size(w, h)); + cvtColor(m, wraped, COLOR_RGB2BGRA); + //BhBlocks b(image, w / columns, h / rows); + //b.drawBlocks(image, Scalar(0, 0, 0), 1); + } + + cvtColor(rgb, result, COLOR_RGB2BGRA); + +/* vector vertices = capture.GetQRVertices4(image); + + for (size_t i = 0; i < vertices.size(); i++) + { + circle(image, vertices[i], 2, CV_RGB(0, 0, 255), -1); + } + + int w = 330; + int h = 300; + int columns = 11; + int rows = 10; + + if (vertices.size() == 4) + { + capture.ApplyHomography(image, vertices, Size(w, h)); + BhBlocks b(image, w / columns, h / rows); + b.drawBlocks(image, Scalar(0, 0, 0), 1); + }*/ + + + jsize size = env->GetArrayLength(outPixels); + + env->ReleaseByteArrayElements(NV21FrameData, pNV21FrameData, 0); + env->ReleaseIntArrayElements(outPixels, poutPixels, 0); + env->ReleaseIntArrayElements(wrapedOutPixels, pwrapedPixels, 0); + } + catch (Exception ex) + { + env->ThrowNew(env->FindClass("java/lang/NullPointerException"), ex.what()); + } + return has_result; +} \ No newline at end of file diff --git a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/dagger/ApplicationComponent.java b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/dagger/ApplicationComponent.java index 1173c8751..b3a790039 100644 --- a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/dagger/ApplicationComponent.java +++ b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/dagger/ApplicationComponent.java @@ -1,5 +1,6 @@ package com.twine.colorcapture.dagger; +import com.twine.colorcapture.views.capture.CaptureFragment; import com.twine.colorcapture.views.home.HomeFragment; import com.twine.colorcapture.views.loading.LoadingFragment; import com.twine.colorcapture.views.main.MainActivity; @@ -23,6 +24,8 @@ public interface ApplicationComponent void inject(LoadingFragment view); void inject(HomeFragment view); + + void inject(CaptureFragment view); MainActivityVM provideMainActivityVM(); } diff --git a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/dagger/ViewModelsModule.java b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/dagger/ViewModelsModule.java index 41786b2a5..ff2e83a61 100644 --- a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/dagger/ViewModelsModule.java +++ b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/dagger/ViewModelsModule.java @@ -3,6 +3,7 @@ package com.twine.colorcapture.dagger; import com.squareup.otto.Bus; import com.twine.colorcapture.navigation.INavigationProvider; import com.twine.colorcapture.notification.INotificationProvider; +import com.twine.colorcapture.views.capture.CaptureFragmentVM; import com.twine.colorcapture.views.home.HomeFragmentVM; import com.twine.colorcapture.views.loading.LoadingFragmentVM; import com.twine.colorcapture.views.main.MainActivityVM; @@ -38,6 +39,13 @@ public class ViewModelsModule @Singleton public HomeFragmentVM provideHomeFragmentVM(Bus eventBus, INotificationProvider notificationProvider, INavigationProvider navigationProvider) { - return new HomeFragmentVM(); + return new HomeFragmentVM(navigationProvider); + } + + @Provides + @Singleton + public CaptureFragmentVM provideCaptureFragmentVM(Bus eventBus, INotificationProvider notificationProvider, INavigationProvider navigationProvider) + { + return new CaptureFragmentVM(); } } diff --git a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/mvvm/FragmentBase.java b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/mvvm/FragmentBase.java index 850dc57db..d9cb58725 100644 --- a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/mvvm/FragmentBase.java +++ b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/mvvm/FragmentBase.java @@ -4,6 +4,7 @@ import android.app.Fragment; import android.databinding.DataBindingUtil; import android.databinding.ViewDataBinding; import android.os.Bundle; +import android.os.Handler; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -68,6 +69,14 @@ public abstract class FragmentBase + { + + onCreated(); + + },100); + return binding.getRoot(); } catch (Exception e) { @@ -148,4 +157,9 @@ public abstract class FragmentBase implements ICaptureFragment, SurfaceHolder.Callback, Camera.PreviewCallback +{ + private Camera camera = null; + private ImageView imagePreview = null; + private ImageView imagewrappedPreview = null; + private Bitmap bitmap = null; + private Bitmap wrappedBitmap = null; + private int[] pixels = null; + private int[] wrappedPixels = null; + private byte[] frameData = null; + private int imageFormat; + private boolean bProcessing = false; + private int cameraId; + private int previewWidth; + private int previewHeight; + private ImageProcessor processor; + private Handler mHandler; + private SurfaceView surfaceView; + + public CaptureFragment() + { + // Required empty public constructor + mHandler = new Handler(Looper.getMainLooper()); + processor = new ImageProcessor(); + } + + @Override + protected void onCreated() + { + super.onCreated(); + + imagePreview = getView().findViewById(R.id.imagePreview); + imagewrappedPreview = getView().findViewById(R.id.imagePreviewWrapped); + + surfaceView = new SurfaceView(this.getActivity()); + + SurfaceHolder camHolder = surfaceView.getHolder(); + camHolder.addCallback(this); + camHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); + + FrameLayout surfraceFrame = (FrameLayout) getView().findViewById(R.id.surfaceViewFrame); + surfraceFrame.addView(surfaceView, new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); + } + + @Override + protected int getLayoutId() + { + return R.layout.fragment_capture; + } + + @Override + protected void inject() + { + App.getComponent().inject(this); + } + + @Override + public String getTitle() + { + return "Capture"; + } + + @Override + public void onPreviewFrame(byte[] data, Camera camera) + { + if (imageFormat == ImageFormat.NV21) + { + //We only accept the NV21(YUV420) format. + if (!bProcessing) + { + frameData = data; + mHandler.post(DoImageProcessing); + } + } + } + + @Override + public void surfaceCreated(SurfaceHolder surfaceHolder) + { + int numberOfCameras = Camera.getNumberOfCameras(); + for (int i = 0; i < numberOfCameras; i++) + { + CameraInfo info = new CameraInfo(); + Camera.getCameraInfo(i, info); + if (info.facing == CameraInfo.CAMERA_FACING_BACK) + { + cameraId = i; + break; + } + } + + camera = Camera.open(cameraId); + + try + { + camera.setPreviewDisplay(surfaceHolder); + camera.setPreviewCallback(this); + } + catch (IOException e) + { + camera.release(); + camera = null; + } + } + + @Override + public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) + { + Camera.Parameters parameters; + + setCameraDisplayOrientation(); + + parameters = camera.getParameters(); + + List sizes = parameters.getSupportedPreviewSizes(); + + for (Camera.Size size : parameters.getSupportedPreviewSizes()) + { + if (size.width >= 1200 & size.width <= 1280) + { + parameters.setPreviewSize(1280, 720); + parameters.setPictureSize(1280, 720); + break; + } + } + + int width = parameters.getPreviewSize().width; + int height = parameters.getPreviewSize().height; + + imageFormat = parameters.getPreviewFormat(); + + parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); + + camera.setParameters(parameters); + + parameters = camera.getParameters(); + + previewWidth = parameters.getPreviewSize().width; + previewHeight = parameters.getPreviewSize().height; + + bitmap = Bitmap.createBitmap(previewHeight, previewWidth, Bitmap.Config.ARGB_8888); + wrappedBitmap = Bitmap.createBitmap(300, 330, Bitmap.Config.ARGB_8888); + + pixels = new int[previewWidth * previewHeight]; + wrappedPixels = new int[330 * 300]; + + camera.startPreview(); + } + + @Override + public void surfaceDestroyed(SurfaceHolder surfaceHolder) + { + camera.setPreviewCallback(null); + camera.stopPreview(); + camera.release(); + camera = null; + } + + private void setCameraDisplayOrientation() + { + android.hardware.Camera.CameraInfo info = + new android.hardware.Camera.CameraInfo(); + android.hardware.Camera.getCameraInfo(cameraId, info); + int rotation = this.getActivity().getWindowManager().getDefaultDisplay().getRotation(); + int degrees = 0; + switch (rotation) + { + case Surface.ROTATION_0: + degrees = 0; + break; + case Surface.ROTATION_90: + degrees = 90; + break; + case Surface.ROTATION_180: + degrees = 180; + break; + case Surface.ROTATION_270: + degrees = 270; + break; + } + + int result; + if (info.facing == CameraInfo.CAMERA_FACING_FRONT) + { + result = (info.orientation + degrees) % 360; + result = (360 - result) % 360; // compensate the mirror + } + else + { // back-facing + result = (info.orientation - degrees + 360) % 360; + } + camera.setDisplayOrientation(result); + + } + + private Runnable DoImageProcessing = new Runnable() + { + public void run() + { + bProcessing = true; + processor.ProcessImage(previewWidth, previewHeight, frameData, pixels, wrappedPixels); + + bitmap.setPixels(pixels, 0, previewHeight, 0, 0, previewHeight, previewWidth); + imagePreview.setImageBitmap(bitmap); + + wrappedBitmap.setPixels(wrappedPixels, 0, 300, 0, 0, 300, 330); + imagewrappedPreview.setImageBitmap(wrappedBitmap); + + bProcessing = false; + } + }; +} \ No newline at end of file diff --git a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/capture/CaptureFragmentVM.java b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/capture/CaptureFragmentVM.java new file mode 100644 index 000000000..6be978036 --- /dev/null +++ b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/capture/CaptureFragmentVM.java @@ -0,0 +1,8 @@ +package com.twine.colorcapture.views.capture; + +import com.twine.colorcapture.mvvm.ViewModelBase; + +public class CaptureFragmentVM extends ViewModelBase +{ + +} diff --git a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/capture/ICaptureFragment.java b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/capture/ICaptureFragment.java new file mode 100644 index 000000000..c88d632b6 --- /dev/null +++ b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/capture/ICaptureFragment.java @@ -0,0 +1,7 @@ +package com.twine.colorcapture.views.capture; + +import com.twine.colorcapture.mvvm.IView; + +public interface ICaptureFragment extends IView +{ +} diff --git a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/home/HomeFragment.java b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/home/HomeFragment.java index d0294533e..76bdfe20f 100644 --- a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/home/HomeFragment.java +++ b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/home/HomeFragment.java @@ -1,11 +1,20 @@ package com.twine.colorcapture.views.home; +import android.Manifest; +import android.content.pm.PackageManager; +import android.os.Build; +import android.support.annotation.NonNull; +import android.support.v4.app.ActivityCompat; +import android.support.v4.content.ContextCompat; + import com.twine.colorcapture.App; import com.twine.colorcapture.R; +import com.twine.colorcapture.core.IAction1; import com.twine.colorcapture.databinding.FragmentHomeBinding; import com.twine.colorcapture.mvvm.FragmentBase; public class HomeFragment extends FragmentBase implements IHomeFragment { + private IAction1 cameraAccessAction; public HomeFragment() { @@ -29,4 +38,38 @@ public class HomeFragment extends FragmentBase action) + { + cameraAccessAction = action; + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { + if (ContextCompat.checkSelfPermission(this.getActivity(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { + ActivityCompat.requestPermissions(this.getActivity(), + new String[]{Manifest.permission.CAMERA}, + 1); + } + else + { + cameraAccessAction.invoke(true); + } + } + } + + @Override + public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + + switch (requestCode) { + case 1: { + if (grantResults.length > 0 + && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + cameraAccessAction.invoke(true); + } else { + cameraAccessAction.invoke(false); + } + } + } + } } diff --git a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/home/HomeFragmentVM.java b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/home/HomeFragmentVM.java index 048ea5265..d7b8e3ba7 100644 --- a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/home/HomeFragmentVM.java +++ b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/home/HomeFragmentVM.java @@ -1,15 +1,31 @@ package com.twine.colorcapture.views.home; +import com.twine.colorcapture.mvvm.RelayCommand; import com.twine.colorcapture.mvvm.ViewModelBase; +import com.twine.colorcapture.navigation.INavigationProvider; +import com.twine.colorcapture.navigation.NavigationView; import javax.inject.Inject; public class HomeFragmentVM extends ViewModelBase { + private INavigationProvider navigationProvider; + public RelayCommand startCaptureCommand; @Inject - public HomeFragmentVM() + public HomeFragmentVM(INavigationProvider navigationProvider) { + this.navigationProvider = navigationProvider; + startCaptureCommand = new RelayCommand(() -> + { + view.requestCameraAccess((granted) -> + { + if (granted) + { + this.navigationProvider.navigateTo(NavigationView.Capture, true); + } + }); + }); } } diff --git a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/home/IHomeFragment.java b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/home/IHomeFragment.java index e4f94c04b..17f94c7db 100644 --- a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/home/IHomeFragment.java +++ b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/home/IHomeFragment.java @@ -1,8 +1,10 @@ package com.twine.colorcapture.views.home; +import com.twine.colorcapture.core.IAction; +import com.twine.colorcapture.core.IAction1; import com.twine.colorcapture.mvvm.IView; public interface IHomeFragment extends IView { - + void requestCameraAccess(IAction1 action); } diff --git a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/main/MainActivity.java b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/main/MainActivity.java index 9cebd1526..6d8e4d5ca 100644 --- a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/main/MainActivity.java +++ b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/main/MainActivity.java @@ -1,7 +1,7 @@ package com.twine.colorcapture.views.main; +import android.app.FragmentTransaction; import android.graphics.Color; -import android.support.v4.app.FragmentTransaction; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; @@ -12,6 +12,8 @@ import com.twine.colorcapture.databinding.ActivityMainBinding; import com.twine.colorcapture.mvvm.ActivityBase; import com.twine.colorcapture.navigation.INavigationProvider; import com.twine.colorcapture.navigation.NavigationView; +import com.twine.onboarding.PaperOnboardingFragment; +import com.twine.onboarding.PaperOnboardingPage; import java.util.ArrayList; @@ -25,6 +27,7 @@ public class MainActivity extends ActivityBase elements = new ArrayList<>(); elements.add(scr1); elements.add(scr2); elements.add(scr3); + + PaperOnboardingFragment onboardingFragment = PaperOnboardingFragment.newInstance(elements); + + onboardingFragment.setOnRightOutListener(() -> + { - PaperOnboardingFragment onboardingFragment = PaperOnboardingFragment.newInstance(elements);*/ - -/* FragmentTransaction fragmentTransaction = this.getFragmentManager().beginTransaction(); + navigationProvider.navigateTo(NavigationView.Loading, false); + + }); + + FragmentTransaction fragmentTransaction = this.getFragmentManager().beginTransaction(); fragmentTransaction.add(R.id.fragment_container, onboardingFragment); - fragmentTransaction.commit();*/ + fragmentTransaction.commit(); navigationProvider.registerNavigationActivity(this, R.id.fragment_container, "com.twine.colorcapture.views"); - - navigationProvider.navigateTo(NavigationView.Loading, false); } @Override diff --git a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/main/MainActivityVM.java b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/main/MainActivityVM.java index e5af8ccb6..dc08f701c 100644 --- a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/main/MainActivityVM.java +++ b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/main/MainActivityVM.java @@ -1,17 +1,22 @@ package com.twine.colorcapture.views.main; import com.squareup.otto.Bus; +import com.twine.colorcapture.mvvm.DependencyProperty; +import com.twine.colorcapture.mvvm.RelayCommand; import com.twine.colorcapture.mvvm.ViewModelBase; import com.twine.colorcapture.navigation.INavigationProvider; +import com.twine.colorcapture.navigation.NavigationView; import com.twine.colorcapture.notification.INotificationProvider; import javax.inject.Inject; public class MainActivityVM extends ViewModelBase { + private INavigationProvider navigationProvider; + @Inject public MainActivityVM(Bus eventBus, INotificationProvider notificationProvider, INavigationProvider navigationProvider) { - + this.navigationProvider = navigationProvider; } } diff --git a/Software/Android_Studio/ColorCapture/app/src/main/res/drawable/application_logs.png b/Software/Android_Studio/ColorCapture/app/src/main/res/drawable/application_logs.png new file mode 100644 index 000000000..584379dc8 Binary files /dev/null and b/Software/Android_Studio/ColorCapture/app/src/main/res/drawable/application_logs.png differ diff --git a/Software/Android_Studio/ColorCapture/app/src/main/res/drawable/hand_fabric.png b/Software/Android_Studio/ColorCapture/app/src/main/res/drawable/hand_fabric.png new file mode 100644 index 000000000..798e5c668 Binary files /dev/null and b/Software/Android_Studio/ColorCapture/app/src/main/res/drawable/hand_fabric.png differ diff --git a/Software/Android_Studio/ColorCapture/app/src/main/res/drawable/hand_phone.png b/Software/Android_Studio/ColorCapture/app/src/main/res/drawable/hand_phone.png new file mode 100644 index 000000000..1e85c4e9d Binary files /dev/null and b/Software/Android_Studio/ColorCapture/app/src/main/res/drawable/hand_phone.png differ diff --git a/Software/Android_Studio/ColorCapture/app/src/main/res/drawable/loading_background.png b/Software/Android_Studio/ColorCapture/app/src/main/res/drawable/loading_background.png new file mode 100644 index 000000000..eb5e376e4 Binary files /dev/null and b/Software/Android_Studio/ColorCapture/app/src/main/res/drawable/loading_background.png differ diff --git a/Software/Android_Studio/ColorCapture/app/src/main/res/drawable/take_picture.png b/Software/Android_Studio/ColorCapture/app/src/main/res/drawable/take_picture.png new file mode 100644 index 000000000..ef92d17dd Binary files /dev/null and b/Software/Android_Studio/ColorCapture/app/src/main/res/drawable/take_picture.png differ diff --git a/Software/Android_Studio/ColorCapture/app/src/main/res/layout/fragment_capture.xml b/Software/Android_Studio/ColorCapture/app/src/main/res/layout/fragment_capture.xml new file mode 100644 index 000000000..f8725175a --- /dev/null +++ b/Software/Android_Studio/ColorCapture/app/src/main/res/layout/fragment_capture.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Software/Android_Studio/ColorCapture/app/src/main/res/layout/fragment_home.xml b/Software/Android_Studio/ColorCapture/app/src/main/res/layout/fragment_home.xml index b16bd7ebf..f62a2f6f2 100644 --- a/Software/Android_Studio/ColorCapture/app/src/main/res/layout/fragment_home.xml +++ b/Software/Android_Studio/ColorCapture/app/src/main/res/layout/fragment_home.xml @@ -27,5 +27,16 @@ android:text="Home View" android:textSize="30sp" tools:text="Home View" /> + +