diff options
| author | Roy Ben-Shabat <Roy@Twine-s.com> | 2019-04-11 19:39:56 +0300 |
|---|---|---|
| committer | Roy Ben-Shabat <Roy@Twine-s.com> | 2019-04-11 19:39:56 +0300 |
| commit | 2aa2afca5b09d465e8bf683af232cfe366abf7d4 (patch) | |
| tree | 20749d38e1200ddb89271c0670dbb51e9b5af71f /Software/Android_Studio | |
| parent | bb2090f2156464ad5a075666e69ec27e23dad23a (diff) | |
| download | Tango-2aa2afca5b09d465e8bf683af232cfe366abf7d4.tar.gz Tango-2aa2afca5b09d465e8bf683af232cfe366abf7d4.zip | |
Working on TCC..
Diffstat (limited to 'Software/Android_Studio')
26 files changed, 476 insertions, 199 deletions
diff --git a/Software/Android_Studio/ColorCapture/app/build.gradle b/Software/Android_Studio/ColorCapture/app/build.gradle index 6f56df4f6..e9f386b96 100644 --- a/Software/Android_Studio/ColorCapture/app/build.gradle +++ b/Software/Android_Studio/ColorCapture/app/build.gradle @@ -81,5 +81,6 @@ dependencies { compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0' compile 'com.squareup.retrofit2:converter-gson:2.1.0' implementation 'com.github.yoanngoular:bitmapconverter:0.2.0' + compile 'com.github.CardinalNow:Android-CircleProgressIndicator:v0.2' } 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 188089553..0fecad4d8 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 @@ -49,13 +49,13 @@ public class ViewModelsModule @Singleton public CaptureFragmentVM provideCaptureFragmentVM(Bus eventBus, INotificationProvider notificationProvider, INavigationProvider navigationProvider, ITCCService tccService) { - return new CaptureFragmentVM(tccService, navigationProvider); + return new CaptureFragmentVM(tccService, navigationProvider, notificationProvider); } @Provides @Singleton - public WelcomeDialogVM provideWelcomeDialogVM(INotificationProvider notificationProvider) + public WelcomeDialogVM provideWelcomeDialogVM() { - return new WelcomeDialogVM(notificationProvider); + return new WelcomeDialogVM(); } } diff --git a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/dialogs/welcome/WelcomeDialogVM.java b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/dialogs/welcome/WelcomeDialogVM.java index f89ef2559..acfc08e05 100644 --- a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/dialogs/welcome/WelcomeDialogVM.java +++ b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/dialogs/welcome/WelcomeDialogVM.java @@ -2,7 +2,6 @@ package com.twine.colorcapture.dialogs.welcome; import com.twine.colorcapture.mvvm.DialogViewModelBase; import com.twine.colorcapture.mvvm.RelayCommand; -import com.twine.colorcapture.notification.INotificationProvider; import javax.inject.Inject; @@ -11,9 +10,8 @@ public class WelcomeDialogVM extends DialogViewModelBase public RelayCommand startCommand; @Inject - public WelcomeDialogVM(INotificationProvider notificationProvider) + public WelcomeDialogVM() { - super(notificationProvider); startCommand = new RelayCommand(this::close); } @@ -21,4 +19,10 @@ public class WelcomeDialogVM extends DialogViewModelBase { return "Hi Roy"; } + + @Override + protected void onBackPressed() + { + super.onBackPressed(); + } } diff --git a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/mvvm/DialogBase.java b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/mvvm/DialogBase.java index e17fb7724..8fa1e7ba1 100644 --- a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/mvvm/DialogBase.java +++ b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/mvvm/DialogBase.java @@ -2,6 +2,7 @@ package com.twine.colorcapture.mvvm; import android.app.Dialog; import android.app.DialogFragment; +import android.content.DialogInterface; import android.databinding.DataBindingUtil; import android.databinding.ViewDataBinding; import android.graphics.Color; @@ -12,18 +13,19 @@ import android.support.annotation.Nullable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; - import com.twine.colorcapture.R; - +import com.twine.colorcapture.core.IAction1; import java.lang.reflect.Method; - import javax.inject.Inject; - import butterknife.ButterKnife; public abstract class DialogBase<BindingView extends ViewDataBinding, VM extends DialogViewModelBase> extends DialogFragment { + private boolean isUserDismiss; + private IAction1<VM> onDismissListener; + + /** * The Vm. */ @@ -60,6 +62,12 @@ public abstract class DialogBase<BindingView extends ViewDataBinding, VM extends method = binding.getClass().getDeclaredMethod("setVm", vm.getClass()); method.invoke(binding, vm); + vm.setCloseAction(() -> + { + isUserDismiss = true; + dismiss(); + }); + ButterKnife.bind(this, binding.getRoot()); return binding.getRoot(); @@ -72,21 +80,29 @@ public abstract class DialogBase<BindingView extends ViewDataBinding, VM extends } @Override + public void onDismiss(DialogInterface dialog) + { + super.onDismiss(dialog); + + if (!isUserDismiss) + { + vm.notifyBackpressed(); + } + + isUserDismiss = false; + + if (onDismissListener != null) + { + onDismissListener.invoke(vm); + } + } + + @Override public void onStart() { super.onStart(); getDialog().getWindow().setBackgroundDrawable(getActivity().getDrawable(R.color.colorBlueMask)); - - -// Dialog dialog = getDialog(); -// if (dialog != null) -// { -// int width = ViewGroup.LayoutParams.WRAP_CONTENT; -// int height = ViewGroup.LayoutParams.WRAP_CONTENT; -// dialog.getWindow().setLayout(width, height); -// dialog.getWindow().setA -// } } public abstract int getLayoutId(); @@ -97,4 +113,9 @@ public abstract class DialogBase<BindingView extends ViewDataBinding, VM extends { return vm; } + + public void setOnDismissListener(IAction1<VM> onDismissListener) + { + this.onDismissListener = onDismissListener; + } } diff --git a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/mvvm/DialogViewModelBase.java b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/mvvm/DialogViewModelBase.java index 77c044178..b1fe7b8ec 100644 --- a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/mvvm/DialogViewModelBase.java +++ b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/mvvm/DialogViewModelBase.java @@ -1,18 +1,36 @@ package com.twine.colorcapture.mvvm; -import com.twine.colorcapture.notification.INotificationProvider; +import com.twine.colorcapture.core.IAction; + +import java.io.IOException; public abstract class DialogViewModelBase extends ViewModelBase { - protected INotificationProvider notificationProvider; + private IAction closeAction; - public DialogViewModelBase(INotificationProvider notificationProvider) + public void close() { - this.notificationProvider = notificationProvider; + try + { + closeAction.invoke(); + } catch (IOException e) + { + e.printStackTrace(); + } } - public void close() + public void setCloseAction(IAction action) + { + closeAction = action; + } + + public void notifyBackpressed() { - notificationProvider.closeDialog(); + onBackPressed(); + } + + protected void onBackPressed() + { + } } 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 48d970a6c..12520c28e 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 @@ -167,4 +167,9 @@ public abstract class FragmentBase<BindingView extends ViewDataBinding, VM exten { } + + public VM getVM() + { + return vm; + } } diff --git a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/mvvm/ViewModelBase.java b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/mvvm/ViewModelBase.java index 7edead907..0f426c912 100644 --- a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/mvvm/ViewModelBase.java +++ b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/mvvm/ViewModelBase.java @@ -54,4 +54,24 @@ public abstract class ViewModelBase<T extends IView> extends ExtendedObject } } } + + protected void onNavigatedTo() + { + + } + + protected void onNavigatedFrom() + { + + } + + public void notifyNavigatedTo() + { + onNavigatedTo(); + } + + public void notifyNavigatedFrom() + { + onNavigatedFrom(); + } } diff --git a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/navigation/AndroidNavigationProvider.java b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/navigation/AndroidNavigationProvider.java index 70dd04372..2518a3109 100644 --- a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/navigation/AndroidNavigationProvider.java +++ b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/navigation/AndroidNavigationProvider.java @@ -5,6 +5,7 @@ import android.app.FragmentManager; import android.app.FragmentTransaction; import android.content.Context; import android.content.Intent; +import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.util.Log; @@ -46,25 +47,25 @@ public class AndroidNavigationProvider extends ExtendedObject implements INaviga this.activity = activity; this.fragment_container = fragmentContainerId; } - + @Override public void navigateTo(NavigationFragment fragmentValue, boolean addToHistory) { - navigateTo(fragmentValue.name(),addToHistory); + navigateTo(fragmentValue.name(), addToHistory); } - + @Override public void navigateTo(NavigationFragment fragmentValue, IAction1<FragmentBase> onCreateListener, boolean addToHistory) { - navigateTo(fragmentValue.name(), onCreateListener,addToHistory); + navigateTo(fragmentValue.name(), onCreateListener, addToHistory); } @Override public void navigateTo(String fragmentName, boolean addToHistory) { - navigateTo(fragmentName, null,addToHistory); + navigateTo(fragmentName, null, addToHistory); } - + @Override public void navigateTo(String fragmentName, IAction1<FragmentBase> onCreateListener, boolean addToHistory) { @@ -84,83 +85,73 @@ public class AndroidNavigationProvider extends ExtendedObject implements INaviga int newIndex = values.indexOf(NavigationFragment.valueOf(fragmentName)); int oldIndex = values.indexOf(NavigationFragment.valueOf(currentFragmentName)); - if (oldIndex > newIndex) { + if (oldIndex > newIndex) + { reverseAnimation = true; } } String originalName = fragmentName; fragmentName = basePackagePath + "." + fragmentName.toLowerCase() + "." + fragmentName + "Fragment"; - + FragmentManager fragmentManager = activity.getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); FragmentBase fragment; - + fragment = (FragmentBase) fragmentManager.findFragmentByTag(fragmentName); - + if (fragment == null) { try { fragment = (FragmentBase) Class.forName(fragmentName).newInstance(); - } - catch (Exception ex) + } catch (Exception ex) { //logManager.log(ex,"Fragment " + fragmentName + " not found."); return; } } -// Slide enterSlide = new Slide(); -// enterSlide.setSlideEdge(Gravity.END); -// enterSlide.setDuration(300); -// -// Fade enterFade = new Fade(Fade.IN); -// enterFade.setDuration(300); -// -// TransitionSet enterGroup = new TransitionSet(); -// enterGroup.addTransition(enterSlide); -// enterGroup.addTransition(enterFade); -// -// Slide exitSlide = new Slide(); -// Fade exitFade = new Fade(Fade.OUT); -// -// exitSlide.setSlideEdge(Gravity.START); -// exitSlide.setDuration(300); -// exitFade.setDuration(300); -// -// TransitionSet exitGroup = new TransitionSet(); -// exitGroup.addTransition(exitSlide); -// exitGroup.addTransition(exitFade); -// -// fragment.setEnterTransition(enterGroup); -// fragment.setExitTransition(exitGroup); - fragment.setOnCreateListener(onCreateListener); - + if (!isFirst) { if (!reverseAnimation) { - fragmentTransaction.setCustomAnimations(R.animator.slide_out_right, R.animator.slide_in_right , R.animator.slide_in_left, R.animator.slide_out_left); + fragmentTransaction.setCustomAnimations(R.animator.slide_out_right, R.animator.slide_in_right, R.animator.slide_in_left, R.animator.slide_out_left); } else { fragmentTransaction.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_out_left, R.animator.slide_out_right, R.animator.slide_in_right); } } - + isFirst = false; - + fragmentTransaction.replace(fragment_container, fragment); - + if (addToHistory) { fragmentTransaction.addToBackStack(fragmentName); } - + fragmentTransaction.commit(); + final FragmentBase fragmentTo = fragment; + final FragmentBase fragmentFrom = currentFragment; + + new Handler().postDelayed(() -> + { + + fragmentTo.getVM().notifyNavigatedTo(); + + if (fragmentFrom != null && !fragmentTo.getClass().getSimpleName().equals(fragmentFrom.getClass().getSimpleName())) + { + fragmentFrom.getVM().notifyNavigatedFrom(); + } + + },300); + // try // { // //noinspection ConstantConditions @@ -169,8 +160,9 @@ public class AndroidNavigationProvider extends ExtendedObject implements INaviga // { // logManager.log(ex); // } - + currentFragment = fragment; + currentFragmentName = originalName; NavigationFragment f = NavigationFragment.valueOf(originalName); @@ -184,19 +176,22 @@ public class AndroidNavigationProvider extends ExtendedObject implements INaviga @Override public void navigateTo(NavigationActivity activityValue, boolean addToHistory) { - String name = activityValue.name(); + String name = activityValue.name(); String activityName = basePackagePath + "." + name.toLowerCase() + "." + name + "Activity"; - try { + try + { Class cls = Class.forName(activityName); Intent intent = new Intent(context, cls); - if (!addToHistory) { + if (!addToHistory) + { intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); } context.startActivity(intent); - } catch (ClassNotFoundException e) { + } catch (ClassNotFoundException e) + { e.printStackTrace(); } } diff --git a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/notification/AndroidNotificationProvider.java b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/notification/AndroidNotificationProvider.java index f3081754c..47bf069fc 100644 --- a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/notification/AndroidNotificationProvider.java +++ b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/notification/AndroidNotificationProvider.java @@ -8,8 +8,10 @@ import android.support.v7.app.AlertDialog; import android.widget.Toast; import com.twine.colorcapture.core.IAction; +import com.twine.colorcapture.core.IAction1; import com.twine.colorcapture.dialogs.welcome.WelcomeDialog; import com.twine.colorcapture.mvvm.DialogBase; +import com.twine.colorcapture.mvvm.DialogViewModelBase; import com.twine.colorcapture.mvvm.IView; @@ -45,8 +47,9 @@ public class AndroidNotificationProvider implements INotificationProvider Toast.makeText(context, message, Toast.LENGTH_SHORT).show(); } + @SuppressWarnings("unchecked") @Override - public void showDialog(DialogBase dialog) + public <VM extends DialogViewModelBase> void showDialog(DialogBase dialog, IAction1<VM> onDismiss) { lastDialog = dialog; FragmentTransaction ft = activity.getFragmentManager().beginTransaction(); @@ -56,6 +59,8 @@ public class AndroidNotificationProvider implements INotificationProvider } ft.addToBackStack(null); + dialog.setOnDismissListener(onDismiss); + //show the dialog. dialog.show(ft, "dialog"); } diff --git a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/notification/INotificationProvider.java b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/notification/INotificationProvider.java index 7f972f3a3..a40aeaac4 100644 --- a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/notification/INotificationProvider.java +++ b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/notification/INotificationProvider.java @@ -3,7 +3,9 @@ package com.twine.colorcapture.notification; import android.app.Activity; import com.twine.colorcapture.core.IAction; +import com.twine.colorcapture.core.IAction1; import com.twine.colorcapture.mvvm.DialogBase; +import com.twine.colorcapture.mvvm.DialogViewModelBase; import com.twine.colorcapture.mvvm.IView; @@ -24,9 +26,10 @@ public interface INotificationProvider /** * Display the specified dialog. + * * @param dialog */ - void showDialog(DialogBase dialog); + <VM extends DialogViewModelBase> void showDialog(DialogBase dialog, IAction1<VM> onDismiss); /** * Closes the last dialog. diff --git a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/capture/CaptureFragment.java b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/capture/CaptureFragment.java index f09e6448f..54af2c31a 100644 --- a/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/capture/CaptureFragment.java +++ b/Software/Android_Studio/ColorCapture/app/src/main/java/com/twine/colorcapture/views/capture/CaptureFragment.java @@ -41,58 +41,53 @@ import com.yanzhenjie.zbar.SymbolSet; import java.io.IOException; import java.util.List; +import butterknife.BindView; + @SuppressWarnings("ALL") public class CaptureFragment extends FragmentBase<FragmentCaptureBinding, CaptureFragmentVM> implements ICaptureFragment, SurfaceHolder.Callback, Camera.PreviewCallback { private Camera camera = null; - private ImageView imagePreview = null; private ImageView imagewrappedPreview = null; private int imageFormat; private int cameraId; - private Handler mHandler; private SurfaceView surfaceView; private ICaptureFragmentListener listener; private IAction1<Boolean> cameraAccessAction; + + @BindView(R.id.imageViewResultFrame) + ImageView imageViewResultFrame; + ObjectAnimator animator; View scannerLayout; View scannerBar; - + SurfaceHolder surfaceHolder; + boolean isCameraStarted; + public CaptureFragment() { // Required empty public constructor - mHandler = new Handler(Looper.getMainLooper()); } - + @Override protected void onCreated() { super.onCreated(); - requestCameraAccess((granted) -> - { - if (granted) - { - imagePreview = getView().findViewById(R.id.imagePreview); - imagewrappedPreview = getView().findViewById(R.id.imagePreviewWrapped); + imagewrappedPreview = getView().findViewById(R.id.imagePreviewWrapped); - surfaceView = new SurfaceView(this.getActivity()); + surfaceView = new SurfaceView(this.getActivity()); - SurfaceHolder camHolder = surfaceView.getHolder(); - camHolder.addCallback(this); - camHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); + SurfaceHolder camHolder = surfaceView.getHolder(); + camHolder.addCallback(this); + camHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); - FrameLayout surfraceFrame = (FrameLayout) getView().findViewById(R.id.surfaceViewFrame); + FrameLayout surfraceFrame = (FrameLayout) getView().findViewById(R.id.surfaceViewFrame); - startScanAnimation(); + startScanAnimation(); - new Handler().postDelayed(() -> - { - surfraceFrame.addView(surfaceView, new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); - }, 500); - } - }); + surfraceFrame.addView(surfaceView, new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); } - + private void startScanAnimation() { //Scanner overlay @@ -105,55 +100,55 @@ public class CaptureFragment extends FragmentBase<FragmentCaptureBinding, Captur @Override public void onGlobalLayout() { - + scannerLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) { scannerLayout.getViewTreeObserver(). removeGlobalOnLayoutListener(this); - + } else { scannerLayout.getViewTreeObserver(). removeOnGlobalLayoutListener(this); } - + float destination = (float) (scannerLayout.getY() + scannerLayout.getHeight()); - + animator = ObjectAnimator.ofFloat(scannerBar, "translationY", scannerLayout.getY(), destination); - + animator.setRepeatMode(ValueAnimator.REVERSE); animator.setRepeatCount(ValueAnimator.INFINITE); animator.setInterpolator(new AccelerateDecelerateInterpolator()); animator.setDuration(2000); animator.start(); - + } }); } - + @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) { @@ -163,82 +158,25 @@ public class CaptureFragment extends FragmentBase<FragmentCaptureBinding, Captur listener.onFrameAvailable(data); } } - + @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; - } + this.surfaceHolder = surfaceHolder; } - + @Override public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) { - Camera.Parameters parameters; - - setCameraDisplayOrientation(); - - parameters = camera.getParameters(); - - List<Size> 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; - } - } - - imageFormat = parameters.getPreviewFormat(); - - parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); - - camera.setParameters(parameters); - - parameters = camera.getParameters(); - - int width = parameters.getPreviewSize().width; - int height = parameters.getPreviewSize().height; - - listener.onPreviewSettingsAvailable(width, height); - - camera.startPreview(); + this.surfaceHolder = surfaceHolder; } - + @Override public void surfaceDestroyed(SurfaceHolder surfaceHolder) { - camera.setPreviewCallback(null); - camera.stopPreview(); - camera.release(); - camera = null; + this.surfaceHolder = surfaceHolder; } - + private void setCameraDisplayOrientation() { android.hardware.Camera.CameraInfo info = @@ -261,7 +199,7 @@ public class CaptureFragment extends FragmentBase<FragmentCaptureBinding, Captur degrees = 270; break; } - + int result; if (info.facing == CameraInfo.CAMERA_FACING_FRONT) { @@ -273,20 +211,122 @@ public class CaptureFragment extends FragmentBase<FragmentCaptureBinding, Captur result = (info.orientation - degrees + 360) % 360; } camera.setDisplayOrientation(result); - + } - + @Override public void setListener(ICaptureFragmentListener listener) { this.listener = listener; } - + @Override public void onFrameResult(Bitmap frameBitmap, Bitmap correctedBitmap, String barcode) { - imagePreview.setImageBitmap(frameBitmap); - imagewrappedPreview.setImageBitmap(correctedBitmap); + getActivity().runOnUiThread(() -> + { + imagewrappedPreview.setImageBitmap(correctedBitmap); + imageViewResultFrame.setImageBitmap(frameBitmap); + }); + } + + @Override + public void startCamera() + { + if (isCameraStarted) return; + + requestCameraAccess((granted) -> + { + if (granted) + { + new TaskBuilder().setAction(() -> + { + + try + { + 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); + + + camera.setPreviewDisplay(surfaceHolder); + camera.setPreviewCallback(this); + + Camera.Parameters parameters; + + setCameraDisplayOrientation(); + + parameters = camera.getParameters(); + + List<Size> 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; + } + } + + imageFormat = parameters.getPreviewFormat(); + + parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE); + + camera.setParameters(parameters); + + parameters = camera.getParameters(); + + int width = parameters.getPreviewSize().width; + int height = parameters.getPreviewSize().height; + + listener.onPreviewSettingsAvailable(width, height); + + camera.startPreview(); + + isCameraStarted = true; + } catch (Exception ex) + { + camera.release(); + camera = null; + } + + }).build().start(); + } + }); + } + + @Override + public void stopCamera() + { + if (isCameraStarted) + { + new TaskBuilder().setAction(() -> + { + camera.setPreviewCallback(null); + camera.stopPreview(); + camera.release(); + camera = null; + isCameraStarted = false; + }).build().start(); + } + } + + @Override + public boolean isCameraStarted() + { + return isCameraStarted; } public void requestCameraAccess(IAction1<Boolean> action) 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 index 3f173c530..e566fe159 100644 --- 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 @@ -1,16 +1,20 @@ package com.twine.colorcapture.views.capture; import android.graphics.Bitmap; +import android.media.AudioManager; +import android.media.ToneGenerator; import android.util.Log; import com.twine.colorcapture.core.Task.TaskBuilder; +import com.twine.colorcapture.dialogs.welcome.WelcomeDialog; +import com.twine.colorcapture.mvvm.DependencyProperty; import com.twine.colorcapture.mvvm.ViewModelBase; import com.twine.colorcapture.navigation.INavigationProvider; +import com.twine.colorcapture.notification.INotificationProvider; import com.twine.colorcapture.opencv.ImageProcessor; import com.twine.colorcapture.views.capture.ICaptureFragment.ICaptureFragmentListener; import com.twine.colorcapture.web.ITCCService; import com.twine.colorcapture.web.messages.DefinitionResponse; -import com.twine.colorcapture.web.messages.DetectionResponse; import com.yanzhenjie.zbar.Image; import com.yanzhenjie.zbar.ImageScanner; import com.yanzhenjie.zbar.Symbol; @@ -20,7 +24,6 @@ import java.io.IOException; public class CaptureFragmentVM extends ViewModelBase<ICaptureFragment> implements ICaptureFragmentListener { - private ImageProcessor processor; private Bitmap frameBitmap = null; private Bitmap sampleBitmap = null; @@ -34,10 +37,19 @@ public class CaptureFragmentVM extends ViewModelBase<ICaptureFragment> implement private ITCCService tccService; private DefinitionResponse definition; private INavigationProvider navigationProvider; + private INotificationProvider notificationProvider; + private boolean startDialogShown; + private boolean preventDetection; + + public DependencyProperty<Boolean> isCardDetected; + public DependencyProperty<Boolean> isDetecting; - public CaptureFragmentVM(ITCCService tccService, INavigationProvider navigationProvider) + public CaptureFragmentVM(ITCCService tccService, INavigationProvider navigationProvider, INotificationProvider notificationProvider) { + isCardDetected = new DependencyProperty<Boolean>(); + isDetecting = new DependencyProperty<Boolean>(); this.navigationProvider = navigationProvider; + this.notificationProvider = notificationProvider; this.tccService = tccService; processor = new ImageProcessor(); @@ -61,7 +73,7 @@ public class CaptureFragmentVM extends ViewModelBase<ICaptureFragment> implement @Override public void onFrameAvailable(byte[] frame) { - if (!isProcessing) + if (!isProcessing && !preventDetection) { isProcessing = true; @@ -111,15 +123,41 @@ public class CaptureFragmentVM extends ViewModelBase<ICaptureFragment> implement Log.d("BARCODE", "Barcode text is: " + text); - DetectionResponse response = tccService.detect(sampleBitmap,barcode); - DetectionResponse a = response; + ToneGenerator toneGen1 = new ToneGenerator(AudioManager.STREAM_MUSIC, 100); + toneGen1.startTone(ToneGenerator.TONE_CDMA_PIP,150); + + isCardDetected.set(true); + preventDetection = true; + view.onFrameResult(frameBitmap, sampleBitmap, barcode); + view.stopCamera(); + + try + { + Thread.sleep(2000); + } catch (InterruptedException e) + { + e.printStackTrace(); + } + + isDetecting.set(true); + + //DetectionResponse response = tccService.detect(sampleBitmap, barcode); + + try + { + Thread.sleep(5000); + } catch (InterruptedException e) + { + e.printStackTrace(); + } + + isDetecting.set(false); } } }) .setContinueWith(() -> { - view.onFrameResult(frameBitmap, sampleBitmap, barcode); isProcessing = false; }) .setError((ex) -> @@ -143,4 +181,35 @@ public class CaptureFragmentVM extends ViewModelBase<ICaptureFragment> implement framePixels = new int[previewWidth * previewHeight]; samplePixels = new int[definition.getSampleWidth() * definition.getSampleHeight()]; } + + @Override + protected void onNavigatedTo() + { + super.onNavigatedTo(); + + preventDetection = false; + + if (!startDialogShown) + { + startDialogShown = true; + + notificationProvider.showDialog(new WelcomeDialog(), (vm) -> + { + view.startCamera(); + isCardDetected.set(false); + }); + } + else + { + view.startCamera(); + isCardDetected.set(false); + } + } + + @Override + protected void onNavigatedFrom() + { + super.onNavigatedFrom(); + view.stopCamera(); + } } 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 index 434e5b10d..162de4b2e 100644 --- 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 @@ -9,6 +9,12 @@ public interface ICaptureFragment extends IView void setListener(ICaptureFragmentListener listener); void onFrameResult(Bitmap frameBitmap,Bitmap correctedBitmap,String barcode); + + void startCamera(); + + void stopCamera(); + + boolean isCameraStarted(); interface ICaptureFragmentListener { 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 f50d4a5c4..a5d82de20 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,6 +1,7 @@ package com.twine.colorcapture.views.main; import android.app.Fragment; +import android.app.FragmentManager; import android.app.FragmentTransaction; import android.graphics.drawable.Drawable; import android.os.Bundle; 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 b5ddc1c2d..fb34e7edd 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 @@ -54,7 +54,6 @@ public class MainActivityVM extends ViewModelBase<IMainActivity> protected void onViewAttached(IMainActivity view) { super.onViewAttached(view); - notificationProvider.showDialog(new WelcomeDialog()); } private void onMyColorsToggled(DependencyProperty<Boolean> booleanDependencyProperty, Boolean value) diff --git a/Software/Android_Studio/ColorCapture/app/src/main/res/drawable-hdpi/got_it.png b/Software/Android_Studio/ColorCapture/app/src/main/res/drawable-hdpi/got_it.png Binary files differnew file mode 100644 index 000000000..11b9d4644 --- /dev/null +++ b/Software/Android_Studio/ColorCapture/app/src/main/res/drawable-hdpi/got_it.png diff --git a/Software/Android_Studio/ColorCapture/app/src/main/res/drawable-mdpi/got_it.png b/Software/Android_Studio/ColorCapture/app/src/main/res/drawable-mdpi/got_it.png Binary files differnew file mode 100644 index 000000000..fbec6bf93 --- /dev/null +++ b/Software/Android_Studio/ColorCapture/app/src/main/res/drawable-mdpi/got_it.png diff --git a/Software/Android_Studio/ColorCapture/app/src/main/res/drawable-xhdpi/got_it.png b/Software/Android_Studio/ColorCapture/app/src/main/res/drawable-xhdpi/got_it.png Binary files differnew file mode 100644 index 000000000..46e9288d6 --- /dev/null +++ b/Software/Android_Studio/ColorCapture/app/src/main/res/drawable-xhdpi/got_it.png diff --git a/Software/Android_Studio/ColorCapture/app/src/main/res/drawable-xxhdpi/got_it.png b/Software/Android_Studio/ColorCapture/app/src/main/res/drawable-xxhdpi/got_it.png Binary files differnew file mode 100644 index 000000000..f3b8ea00f --- /dev/null +++ b/Software/Android_Studio/ColorCapture/app/src/main/res/drawable-xxhdpi/got_it.png diff --git a/Software/Android_Studio/ColorCapture/app/src/main/res/drawable-xxxhdpi/got_it.png b/Software/Android_Studio/ColorCapture/app/src/main/res/drawable-xxxhdpi/got_it.png Binary files differnew file mode 100644 index 000000000..a30453a41 --- /dev/null +++ b/Software/Android_Studio/ColorCapture/app/src/main/res/drawable-xxxhdpi/got_it.png diff --git a/Software/Android_Studio/ColorCapture/app/src/main/res/drawable/border_gradient.xml b/Software/Android_Studio/ColorCapture/app/src/main/res/drawable/border_gradient.xml new file mode 100644 index 000000000..90f7fb630 --- /dev/null +++ b/Software/Android_Studio/ColorCapture/app/src/main/res/drawable/border_gradient.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="utf-8"?> +<shape xmlns:android="http://schemas.android.com/apk/res/android" + android:shape="rectangle" > + + <corners android:radius="10dp" /> + <stroke android:width="8px" android:color="@color/colorGradientAccent1"/> + +</shape>
\ No newline at end of file diff --git a/Software/Android_Studio/ColorCapture/app/src/main/res/drawable/progress_ring_background.xml b/Software/Android_Studio/ColorCapture/app/src/main/res/drawable/progress_ring_background.xml new file mode 100644 index 000000000..608296a00 --- /dev/null +++ b/Software/Android_Studio/ColorCapture/app/src/main/res/drawable/progress_ring_background.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="utf-8"?> +<rotate xmlns:android="http://schemas.android.com/apk/res/android" + android:pivotX="50%" + android:pivotY="50%" + android:fromDegrees="0" + android:toDegrees="360"> + + <shape + android:shape="ring" + android:innerRadiusRatio="3" + android:thicknessRatio="20" + android:useLevel="false"> + + <size + android:width="76dip" + android:height="76dip" /> + + <gradient + android:type="sweep" + android:useLevel="false" + android:startColor="#161616" + android:centerColor="@color/colorGradientAccent1" + android:endColor="@color/colorGradientAccent2" + android:angle="0"/> + + </shape> + +</rotate>
\ No newline at end of file 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 index a175b87d2..c4b776143 100644 --- 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 @@ -5,12 +5,15 @@ <data> + <import type="android.view.View"/> + <variable name="vm" type="com.twine.colorcapture.views.capture.CaptureFragmentVM" /> </data> <FrameLayout + android:background="@color/colorPrimaryBackground" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.twine.colorcapture.views.capture.CaptureFragment"> @@ -27,11 +30,11 @@ android:layoutDirection="ltr"> <ImageView - android:id="@+id/imagePreview" + android:id="@+id/imageViewResultFrame" android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="centerCrop" - android:visibility="gone" /> + android:visibility="@{vm.isCardDetected ? View.VISIBLE : View.GONE}" /> <ImageView android:id="@+id/imagePreviewWrapped" @@ -41,7 +44,7 @@ android:layout_alignParentBottom="true" android:layout_marginEnd="22dp" android:layout_marginBottom="28dp" - app:srcCompat="@android:color/black" android:visibility="gone" /> + android:visibility="gone" /> </RelativeLayout> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" @@ -52,7 +55,7 @@ <View android:layout_width="match_parent" android:layout_height="30dp" - android:background="#9A000000" /> + android:background="@color/colorCaptureMask" /> <RelativeLayout @@ -66,7 +69,7 @@ android:layout_height="match_parent" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" - android:background="#9A000000" /> + android:background="@color/colorCaptureMask" /> <FrameLayout android:id="@+id/scannerLayout" @@ -77,7 +80,7 @@ android:layout_toLeftOf="@id/right" android:layout_toRightOf="@id/left" android:layout_toStartOf="@+id/right" - android:background="@drawable/border" + android:background="@{vm.isCardDetected ? @drawable/border_gradient : @drawable/border}" android:orientation="horizontal"> <View @@ -86,7 +89,8 @@ android:layout_marginTop="5dp" android:layout_marginBottom="5dp" android:layout_height="5dp" - android:background="@color/colorPrimary" /> + android:background="@color/colorPrimary" + android:visibility="@{vm.isCardDetected ? View.GONE : View.VISIBLE}"/> </FrameLayout> @@ -98,14 +102,14 @@ android:layout_height="match_parent" android:layout_alignParentEnd="true" android:layout_alignParentRight="true" - android:background="#9A000000" /> + android:background="@color/colorCaptureMask" /> </RelativeLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="100dp" - android:background="#9A000000" + android:background="@color/colorCaptureMask" android:paddingLeft="40dp" android:paddingRight="40dp"> @@ -115,9 +119,45 @@ android:gravity="center" android:textSize="13.4sp" android:fontFamily="@font/flexo_medium" - android:text="@string/twine_snap_message" /> + android:text="@string/twine_snap_message" + android:visibility="@{vm.isCardDetected ? View.GONE : View.VISIBLE}"/> + + <ImageView + android:layout_width="51dp" + android:layout_height="70dp" + android:layout_gravity="center" + android:src="@drawable/got_it" + android:visibility="@{vm.isCardDetected ? View.VISIBLE : View.GONE}"/> </FrameLayout> </LinearLayout> + + <RelativeLayout + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="@color/colorBlueMask" + android:visibility="@{vm.isDetecting ? View.VISIBLE : View.GONE}"> + + <ProgressBar + android:id="@+id/progress" + android:layout_centerInParent="true" + android:layout_width="80dp" + android:layout_height="80dp" + android:indeterminate="true" + android:indeterminateDrawable="@drawable/progress_ring_background"/> + + + <android.support.v7.widget.AppCompatTextView + android:layout_below="@id/progress" + android:layout_centerHorizontal="true" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginTop="20dp" + android:gravity="center" + android:textSize="13.4sp" + android:letterSpacing="0.07" + android:fontFamily="@font/flexo_medium" + android:text="@string/processing_message"/> + </RelativeLayout> </FrameLayout> </layout> diff --git a/Software/Android_Studio/ColorCapture/app/src/main/res/values/colors.xml b/Software/Android_Studio/ColorCapture/app/src/main/res/values/colors.xml index d6c70f6c7..5cb322d20 100644 --- a/Software/Android_Studio/ColorCapture/app/src/main/res/values/colors.xml +++ b/Software/Android_Studio/ColorCapture/app/src/main/res/values/colors.xml @@ -13,4 +13,16 @@ <color name="colorBlueMask">#EB09172A</color> <color name="colorWhiteMask">#B71D3150</color> + + <color name="colorGradientAccent1">#26d440</color> + <color name="colorGradientAccent2">#009fe3</color> + + <color name="colorCaptureMask">#9A091330</color> + + <dimen name="circleProgressRadius">30dp</dimen> + <dimen name="circleProgressThickness">3dp</dimen> + <color name="circleProgressCompleteStartGradient">@color/colorGradientAccent1</color> + <color name="circleProgressCompleteEndGradient">@color/colorGradientAccent2</color> + <color name="circleProgressIncompleteStartGradient">#686868</color> + <color name="circleProgressIncompleteEndGradient">#686868</color> </resources> diff --git a/Software/Android_Studio/ColorCapture/app/src/main/res/values/strings.xml b/Software/Android_Studio/ColorCapture/app/src/main/res/values/strings.xml index 841774671..d10b0fa91 100644 --- a/Software/Android_Studio/ColorCapture/app/src/main/res/values/strings.xml +++ b/Software/Android_Studio/ColorCapture/app/src/main/res/values/strings.xml @@ -11,4 +11,6 @@ </string> <string name="welcome_go_button">Let\'s start!</string> <string name="welcome_have_a_twine_card_message"><u>Don’t have a Twine TCC™ card?</u></string> + + <string name="processing_message">Our color algorithm is working on it…</string> </resources> diff --git a/Software/Android_Studio/ColorCapture/settings.gradle b/Software/Android_Studio/ColorCapture/settings.gradle index 48771db44..e7b4def49 100644 --- a/Software/Android_Studio/ColorCapture/settings.gradle +++ b/Software/Android_Studio/ColorCapture/settings.gradle @@ -1 +1 @@ -include ':app', ':onboarding' +include ':app' |
