From 132c4de1d1706d9be2665765495e0048064487d0 Mon Sep 17 00:00:00 2001 From: Vinay Manchundiya Date: Fri, 1 Mar 2019 18:31:55 -0600 Subject: [PATCH 001/113] Frist Commit Added print stack trace, added ndk_14b to gitignore, pls download and update the project structure --- .gitignore | 3 ++- .../java/com/menny/android/anysoftkeyboard/SoftKeyboard.java | 3 +++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 8d2ec513ef..d781ccbac8 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,5 @@ local.properties .project .settings/ .classpath -.vscode/ \ No newline at end of file +.vscode/ +NDK_14b/ diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/SoftKeyboard.java b/app/src/main/java/com/menny/android/anysoftkeyboard/SoftKeyboard.java index 136b623b72..3c89ac2d20 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/SoftKeyboard.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/SoftKeyboard.java @@ -17,6 +17,7 @@ package com.menny.android.anysoftkeyboard; import android.content.ComponentName; +import android.util.Log; import com.anysoftkeyboard.AnySoftKeyboard; @@ -29,6 +30,8 @@ public class SoftKeyboard extends AnySoftKeyboard { @Override protected String getSettingsInputMethodId() { + //StackTraceElement trace = new Exception().getStackTrace(); + Log.d("CS", Log.getStackTraceString(new Exception())); return new ComponentName(getApplication(), SoftKeyboard.class).flattenToShortString(); } } From 093547d917af010e077268ef099e0c9a6fd7a4b6 Mon Sep 17 00:00:00 2001 From: Vinay Manchundiya Date: Sat, 6 Apr 2019 18:10:13 -0500 Subject: [PATCH 002/113] Safe commit --- .../com/anysoftkeyboard/AnySoftKeyboard.java | 5 ++ .../ime/AnySoftKeyboardSuggestions.java | 2 + .../keyboards/views/AnyKeyboardView.java | 25 +++++++ .../keyboards/views/AnyKeyboardViewBase.java | 11 +++ .../AnyKeyboardViewWithMiniKeyboard.java | 4 +- .../keyboards/views/PointerTracker.java | 3 + .../BiAffect/BiADataProcessorInterface.java | 6 ++ .../anysoftkeyboard/BiAffect/BiAFeature.java | 8 ++ .../anysoftkeyboard/BiAffect/BiAManager.java | 59 +++++++++++++++ .../anysoftkeyboard/BiAffect/BiAPOJO.java | 60 +++++++++++++++ .../anysoftkeyboard/BiAffect/BiAWorker1.java | 74 +++++++++++++++++++ .../anysoftkeyboard/BiAffect/Pressure.java | 13 ++++ .../android/anysoftkeyboard/SoftKeyboard.java | 3 + 13 files changed, 272 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiADataProcessorInterface.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAFeature.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAPOJO.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAWorker1.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Pressure.java diff --git a/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java b/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java index ac6c692cde..4fa065b56d 100644 --- a/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java +++ b/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java @@ -66,6 +66,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import android.util.*; /** * Input method implementation for QWERTY-ish keyboard. @@ -997,6 +998,10 @@ private void sendKeyUp(InputConnection ic, int key) { public void onPress(int primaryCode) { super.onPress(primaryCode); InputConnection ic = getCurrentInputConnection(); + Long tsLong = System.currentTimeMillis()/1000; + Log.d("CS TS -> ", tsLong.toString()); + Log.d("CS From AnySoftKeyboard", Log.getStackTraceString(new Exception())); + if (primaryCode == KeyCodes.SHIFT) { mShiftKeyState.onPress(); diff --git a/app/src/main/java/com/anysoftkeyboard/ime/AnySoftKeyboardSuggestions.java b/app/src/main/java/com/anysoftkeyboard/ime/AnySoftKeyboardSuggestions.java index 7266302f62..e9b8dc6daf 100644 --- a/app/src/main/java/com/anysoftkeyboard/ime/AnySoftKeyboardSuggestions.java +++ b/app/src/main/java/com/anysoftkeyboard/ime/AnySoftKeyboardSuggestions.java @@ -10,6 +10,7 @@ import android.support.v4.content.ContextCompat; import android.support.v4.util.Pair; import android.text.TextUtils; +import android.util.Log; import android.util.SparseBooleanArray; import android.view.KeyEvent; import android.view.View; @@ -806,6 +807,7 @@ protected void abortCorrectionAndResetPredictionState(boolean disabledUntilNextI mAdditionalCharacterForReverting = false; mJustAutoAddedWord = false; if (disabledUntilNextInputStart) { + Log.d("FROM ABORT", Log.getStackTraceString(new Exception())); Logger.d(TAG, "abortCorrection will abort correct forever"); final KeyboardViewContainerView inputViewContainer = getInputViewContainer(); if (inputViewContainer != null) { diff --git a/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardView.java b/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardView.java index a97c3d9a5d..c26a5477b1 100644 --- a/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardView.java +++ b/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardView.java @@ -26,6 +26,7 @@ import android.support.annotation.NonNull; import android.support.v4.view.MotionEventCompat; import android.util.AttributeSet; +import android.util.Log; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.animation.Animation; @@ -49,6 +50,7 @@ import com.anysoftkeyboard.rx.GenericOnError; import com.anysoftkeyboard.theme.KeyboardTheme; import com.menny.android.anysoftkeyboard.AnyApplication; +import com.menny.android.anysoftkeyboard.BiAffect.BiAManager; import com.menny.android.anysoftkeyboard.R; import java.util.ArrayList; @@ -198,6 +200,27 @@ public boolean onTouchEvent(@NonNull MotionEvent me) { mGestureTypingPathShouldBeDrawn = false; return super.onTouchEvent(me); } + Long tsLong = System.currentTimeMillis(); + //Log.d("CS TS -> ", tsLong.toString()); + + //TestCode for BiAffect + Log.d("CS TS -> Pointer Count", me.getPointerCount() + " "); + Log.d("CS TS -> Cords", me.getX() + ","+ me.getY()); + Log.d("CS TS -> Action", me.getAction() + " "); + Log.d("CS TS -> Cords", me.getX(0) + ","+ me.getY(0)); + Log.d("CS TS -> Pressure", me.getPressure(0) + " "); + Log.d("CS TS -> MajorAxis", me.getTouchMajor(0) + " "); + Log.d("CS TS -> MinorAxis", me.getTouchMinor(0) + " "); + Log.d("CS TS -> Size", me.getSize(0) + " "); + Log.d("CS TS -> PointerID", me.getPointerId(0) + " "); + Log.d("CS TS -> EventTime", me.getDownTime() + " on Action " + me.getAction()); + Log.d("CS TS -> EventTimeSys", tsLong.toString() + " on Action " + me.getAction()); + + try { + BiAManager.getInstance().recordKeyPressForce(me.getDownTime(), me.getPressure(0),me.getAction()); + } catch (InterruptedException e) { + //e.printStackTrace(); + } final int action = MotionEventCompat.getActionMasked(me); @@ -276,6 +299,8 @@ public boolean onTouchEvent(@NonNull MotionEvent me) { dismissPopupKeyboard(); return true; } else { + tsLong = System.currentTimeMillis()/1000; + Log.d("CS TS -> ", tsLong.toString()); return super.onTouchEvent(me); } } diff --git a/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardViewBase.java b/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardViewBase.java index d524c71c69..9a4b7e2249 100644 --- a/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardViewBase.java +++ b/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardViewBase.java @@ -47,6 +47,7 @@ import android.text.TextPaint; import android.text.TextUtils; import android.util.AttributeSet; +import android.util.Log; import android.util.SparseArray; import android.view.Gravity; import android.view.MotionEvent; @@ -1758,6 +1759,10 @@ public boolean onTouchEvent(@NonNull MotionEvent nativeMotionEvent) { tracker.onMoveEvent((int) nativeMotionEvent.getX(i), (int) nativeMotionEvent.getY(i), eventTime); } } else { + Long tsLong = System.currentTimeMillis()/1000; + Log.d("CS TS -> ", tsLong.toString()); + float fg = nativeMotionEvent.getPressure(); + Log.d("CS TS -> ", fg + " "); PointerTracker tracker = getPointerTracker(id); sendOnXEvent(action, eventTime, x, y, tracker); } @@ -1777,6 +1782,8 @@ protected boolean isFirstDownEventInsideSpaceBar() { private void sendOnXEvent(final int action, final long eventTime, final int x, final int y, PointerTracker tracker) { //CHECKSTYLE:OFF: missingswitchdefault + Long tsLong = System.currentTimeMillis()/1000; + Log.d("CS TS -> ", tsLong.toString()); switch (action) { case MotionEvent.ACTION_DOWN: case 0x00000005:// MotionEvent.ACTION_POINTER_DOWN: @@ -1799,8 +1806,12 @@ protected void onDownEvent(PointerTracker tracker, int x, int y, // Before processing a down event of modifier key, all pointers // already being tracked // should be released. + Long tsLong = System.currentTimeMillis()/1000; + Log.d("CS TS -> ", tsLong.toString()); mPointerQueue.releaseAllPointersExcept(tracker, eventTime); } + Long tsLong = System.currentTimeMillis()/1000; + Log.d("CS TS -> ", tsLong.toString()); tracker.onDownEvent(x, y, eventTime); mPointerQueue.add(tracker); } diff --git a/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardViewWithMiniKeyboard.java b/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardViewWithMiniKeyboard.java index 2c77d57fc7..d9dfd61677 100644 --- a/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardViewWithMiniKeyboard.java +++ b/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardViewWithMiniKeyboard.java @@ -26,6 +26,7 @@ import android.support.annotation.Nullable; import android.support.v4.view.MotionEventCompat; import android.util.AttributeSet; +import android.util.Log; import android.view.Gravity; import android.view.LayoutInflater; import android.view.MotionEvent; @@ -96,7 +97,8 @@ public boolean onTouchEvent(@NonNull MotionEvent me) { translated.recycle(); return true; } - + Long tsLong = System.currentTimeMillis()/1000; + Log.d("CS TS -> ", tsLong.toString()); return super.onTouchEvent(me); } diff --git a/app/src/main/java/com/anysoftkeyboard/keyboards/views/PointerTracker.java b/app/src/main/java/com/anysoftkeyboard/keyboards/views/PointerTracker.java index 6173fefc8f..0cc9d3380d 100644 --- a/app/src/main/java/com/anysoftkeyboard/keyboards/views/PointerTracker.java +++ b/app/src/main/java/com/anysoftkeyboard/keyboards/views/PointerTracker.java @@ -18,6 +18,7 @@ import android.support.annotation.NonNull; import android.text.TextUtils; +import android.util.Log; import android.view.MotionEvent; import com.anysoftkeyboard.api.KeyCodes; @@ -252,6 +253,8 @@ void onDownEvent(int x, int y, long eventTime) { } if (codeAtIndex != 0) { + Long tsLong = System.currentTimeMillis()/1000; + Log.d("CS TS -> ", tsLong.toString()); mListener.onPress(codeAtIndex); //also notifying about first down mListener.onFirstDownKey(codeAtIndex); diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiADataProcessorInterface.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiADataProcessorInterface.java new file mode 100644 index 0000000000..9a83d03a6e --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiADataProcessorInterface.java @@ -0,0 +1,6 @@ +package com.menny.android.anysoftkeyboard.BiAffect; + +public interface BiADataProcessorInterface { + boolean recordKeyPressForce(long eventDownTime, double pressure, int action) throws InterruptedException; + +} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAFeature.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAFeature.java new file mode 100644 index 0000000000..d3a1c2dc1f --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAFeature.java @@ -0,0 +1,8 @@ +package com.menny.android.anysoftkeyboard.BiAffect; + +public abstract class BiAFeature { + String TAG; + long id; + int action; +} + diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java new file mode 100644 index 0000000000..20856d1a99 --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java @@ -0,0 +1,59 @@ +package com.menny.android.anysoftkeyboard.BiAffect; +import java.util.Hashtable; +import java.util.LinkedHashMap; +import java.util.concurrent.ArrayBlockingQueue; + +public class BiAManager implements BiADataProcessorInterface { + + private BiAWorker1 myCurrentWorker1; + + //Instead of inner static class we can also use enum + static class FeatureLookupStruct{ + final static String pressure = "PRESSURE"; + //final static String action_key_up = "Up"; + //final static String action_key_down = "Down"; + } + + private static BiAManager shared_instance = null; + ArrayBlockingQueue myTupleQueue; + LinkedHashMap processingMap; + LinkedHashMap finalPOJOMap; + + + private BiAManager(){ + //This wont contain anything as such + this.myTupleQueue = new ArrayBlockingQueue<>(10000); + this.processingMap = new LinkedHashMap<>(); + this.finalPOJOMap = new LinkedHashMap<>(); + } + + public static synchronized BiAManager getInstance() + { + if (shared_instance == null) + shared_instance = new BiAManager(); + + return shared_instance; + } + + @Override + public boolean recordKeyPressForce(long eventDownTime, double pressure, int action) throws NullPointerException, InterruptedException{ + System.out.println("BiAffect recordKeyPressForce received for "+eventDownTime+ " For action "+ action); + Pressure myPressure = new Pressure(FeatureLookupStruct.pressure, eventDownTime, pressure, action); + shared_instance.myTupleQueue.put(myPressure); + + return true; + } + + //Session specific calls + public boolean startSession(){ + myCurrentWorker1 = new BiAWorker1(); + //not sure if i can start the worker thread here + myCurrentWorker1.start(); + return true; + } + + public boolean endSession(){ + + return true; + } +} \ No newline at end of file diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAPOJO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAPOJO.java new file mode 100644 index 0000000000..975dd067bc --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAPOJO.java @@ -0,0 +1,60 @@ +package com.menny.android.anysoftkeyboard.BiAffect; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; + +public class BiAPOJO{ + public HashMap totalRecordMap; + public List pressureValues; + public double finalPressure; + + public enum FeatureSet{ + PRESSURE + } + + public BiAPOJO(){ + this.totalRecordMap = new HashMap<>(); + for(FeatureSet f : FeatureSet.values()){ + totalRecordMap.put(f,false); + } + pressureValues = new ArrayList<>(); + } + + public void addRecord(BiAFeature feature){ + //we will have switch statement for tag of the feature + System.out.println("BiAffect, I am from Pojo, something changed in me"); + switch (feature.TAG){ + case BiAManager.FeatureLookupStruct.pressure: + //this is pressure value, we need to call pressure function and let it do the rest + Pressure currentInstance = (Pressure) feature; + recordPressure(currentInstance.action, currentInstance.value); + + } + } + + public void recordPressure(int action, double value){ + pressureValues.add(value); + System.out.println("BiAffect, recorded pressure value is "+value); + if(action == 1){ + //This means this was ACTION_UP, we need to call finalize pressure + finalizePressure(); + } + } + + private void finalizePressure(){ + //We can traverse through the list and get max or min or avg or whatever required + System.out.println("BiAffect, Pressure got finalised"); + this.finalPressure = Collections.max(pressureValues); + System.out.println("BiAffect, Final pressure value is "+ this.finalPressure); + totalRecordMap.remove(FeatureSet.PRESSURE); + totalRecordMap.put(FeatureSet.PRESSURE, true); + + } + + public void printAllValues(){ + + } +} + diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAWorker1.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAWorker1.java new file mode 100644 index 0000000000..990675227e --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAWorker1.java @@ -0,0 +1,74 @@ +package com.menny.android.anysoftkeyboard.BiAffect; +import android.util.Log; +import java.util.Hashtable; +import java.util.LinkedHashMap; +import java.util.concurrent.ArrayBlockingQueue; + + +public class BiAWorker1 extends Thread{ + + private boolean sessionRunning; + + private long sessionStartTime; + + BiAWorker1(){ + super(); + System.out.println("Session Started with start time to be "+sessionStartTime); + this.sessionStartTime = System.currentTimeMillis(); + sessionRunning = true; + } + + + @Override + public void run(){ + BiAManager managerSharedInstance = BiAManager.getInstance(); + ArrayBlockingQueue myQueueReference = managerSharedInstance.myTupleQueue; + LinkedHashMap myProcessingMapReference = managerSharedInstance.processingMap; + //Hashtable myFinalPOJOMapReference = managerSharedInstance.finalPOJOMap; + + BiAPOJO referenceHolder; + + while (sessionRunning){ + Log.d("BiA Data Processing", "BiAWorker1 is running"); + try { + BiAFeature currentTuple = myQueueReference.take(); + + if(myProcessingMapReference.containsKey(currentTuple.id)){ + //already present in the map we dont need to create a new pojo instance + System.out.println("BiAffect Pojo already present in map"); + referenceHolder = myProcessingMapReference.get(currentTuple.id); + assert referenceHolder != null; + referenceHolder.addRecord(currentTuple); + }else{ + //create pojo instance + System.out.println("BiAffect Creating new pojo"); + referenceHolder = new BiAPOJO(); + referenceHolder.addRecord(currentTuple); + myProcessingMapReference.put(currentTuple.id, referenceHolder); + } + + if(!referenceHolder.totalRecordMap.containsValue(false)){ + //Now this means that this pojo is ready to be pushed into second buffer + System.out.println("BiAffect A pojo just finished"); + } + + }catch (InterruptedException e) { + //e.printStackTrace(); + } + + try { + Thread.sleep(25);//sleep for 25ms + } catch (InterruptedException e) { + //e.printStackTrace(); + } + } + + } + + public void endCurrentSession(){ + long sessionEndTime = System.currentTimeMillis(); + this.sessionRunning = false; + System.out.println("Session Ended with end time to be "+ sessionEndTime); + } +} + diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Pressure.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Pressure.java new file mode 100644 index 0000000000..1f9f0506d5 --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Pressure.java @@ -0,0 +1,13 @@ +package com.menny.android.anysoftkeyboard.BiAffect; + +public class Pressure extends BiAFeature{ + double value; + + public Pressure(String TAG, long id, double value, int action){ + this.TAG = TAG; + this.id = id; + this.value = value; + this.action = action; + } +} + diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/SoftKeyboard.java b/app/src/main/java/com/menny/android/anysoftkeyboard/SoftKeyboard.java index 3c89ac2d20..fc0fd7e4b8 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/SoftKeyboard.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/SoftKeyboard.java @@ -20,6 +20,7 @@ import android.util.Log; import com.anysoftkeyboard.AnySoftKeyboard; +import com.menny.android.anysoftkeyboard.BiAffect.BiAManager; /* * Why is this class exists? @@ -28,10 +29,12 @@ */ public class SoftKeyboard extends AnySoftKeyboard { + @Override protected String getSettingsInputMethodId() { //StackTraceElement trace = new Exception().getStackTrace(); Log.d("CS", Log.getStackTraceString(new Exception())); + BiAManager.getInstance().startSession(); return new ComponentName(getApplication(), SoftKeyboard.class).flattenToShortString(); } } From a6a76f3c001474c4e57b0abb1134484aac497d21 Mon Sep 17 00:00:00 2001 From: Vinay Manchundiya Date: Sun, 21 Apr 2019 17:50:16 -0500 Subject: [PATCH 003/113] Double Buffer implemented for touch data entry --- .../com/anysoftkeyboard/AnySoftKeyboard.java | 10 ++- .../ime/AnySoftKeyboardSuggestions.java | 1 + .../keyboards/views/AnyKeyboardView.java | 41 ++++----- .../keyboards/views/AnyKeyboardViewBase.java | 1 + .../keyboards/views/PointerTracker.java | 2 + .../keyboards/views/ProximityKeyDetector.java | 3 + .../BiAffect/BiADataProcessorInterface.java | 42 +++++++++ .../anysoftkeyboard/BiAffect/BiAManager.java | 86 ++++++++++++++++++- .../BiAffect/TouchDataPOJO.java | 55 ++++++++++++ .../BiAffect/TouchDataWorker.java | 45 ++++++++++ .../android/anysoftkeyboard/SoftKeyboard.java | 2 - 11 files changed, 262 insertions(+), 26 deletions(-) create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataPOJO.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java diff --git a/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java b/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java index 4fa065b56d..4edcb83da5 100644 --- a/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java +++ b/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java @@ -606,6 +606,8 @@ private void onNonFunctionKey(final int primaryCode, final Key key, final int mu @Override public void onKey(int primaryCode, Key key, int multiTapIndex, int[] nearByKeyCodes, boolean fromUI) { super.onKey(primaryCode, key, multiTapIndex, nearByKeyCodes, fromUI); + Long tsLong = System.currentTimeMillis(); + Log.d("CS_KD_OK", " "+ primaryCode+" "+tsLong); if (primaryCode > 0) { onNonFunctionKey(primaryCode, key, multiTapIndex, nearByKeyCodes, fromUI); @@ -998,11 +1000,11 @@ private void sendKeyUp(InputConnection ic, int key) { public void onPress(int primaryCode) { super.onPress(primaryCode); InputConnection ic = getCurrentInputConnection(); - Long tsLong = System.currentTimeMillis()/1000; + Log.d("KD", Log.getStackTraceString(new Exception())); + Long tsLong = System.currentTimeMillis(); Log.d("CS TS -> ", tsLong.toString()); Log.d("CS From AnySoftKeyboard", Log.getStackTraceString(new Exception())); - - + Log.d("CS_KD_OP", " "+ primaryCode+" "+tsLong); if (primaryCode == KeyCodes.SHIFT) { mShiftKeyState.onPress(); // Toggle case on selected characters @@ -1025,6 +1027,8 @@ public void onPress(int primaryCode) { public void onRelease(int primaryCode) { super.onRelease(primaryCode); InputConnection ic = getCurrentInputConnection(); + Long tsLong = System.currentTimeMillis(); + Log.d("CS_KD_OR", " "+ primaryCode + " "+tsLong); if (primaryCode == KeyCodes.SHIFT) { mShiftKeyState.onRelease(mMultiTapTimeout, mLongPressTimeout); handleShift(); diff --git a/app/src/main/java/com/anysoftkeyboard/ime/AnySoftKeyboardSuggestions.java b/app/src/main/java/com/anysoftkeyboard/ime/AnySoftKeyboardSuggestions.java index e9b8dc6daf..c5ff205940 100644 --- a/app/src/main/java/com/anysoftkeyboard/ime/AnySoftKeyboardSuggestions.java +++ b/app/src/main/java/com/anysoftkeyboard/ime/AnySoftKeyboardSuggestions.java @@ -495,6 +495,7 @@ protected void handleCharacter(final int primaryCode, final Keyboard.Key key, fi if (BuildConfig.DEBUG) { Logger.d(TAG, "handleCharacter: %d, isPredictionOn: %s, mPredicting: %s", primaryCode, isPredictionOn(), TextEntryState.isPredicting()); } + Log.i("KD","rchd here"+key.centerX+" "+key.centerY); mExpectingSelectionUpdateBy = SystemClock.uptimeMillis() + MAX_TIME_TO_EXPECT_SELECTION_UPDATE; if (TextEntryState.isReadyToPredict() && isAlphabet(primaryCode) && !isCursorTouchingWord()) { diff --git a/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardView.java b/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardView.java index c26a5477b1..7aa4a97b39 100644 --- a/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardView.java +++ b/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardView.java @@ -201,26 +201,29 @@ public boolean onTouchEvent(@NonNull MotionEvent me) { return super.onTouchEvent(me); } Long tsLong = System.currentTimeMillis(); - //Log.d("CS TS -> ", tsLong.toString()); + //Log.d(" -> ", tsLong.toString()); + //Log.d("CS", Log.getStackTraceString(new Exception())); + + Log.d("CS_KD_OTE", " "+ me.getAction() + " "+tsLong); //TestCode for BiAffect - Log.d("CS TS -> Pointer Count", me.getPointerCount() + " "); - Log.d("CS TS -> Cords", me.getX() + ","+ me.getY()); - Log.d("CS TS -> Action", me.getAction() + " "); - Log.d("CS TS -> Cords", me.getX(0) + ","+ me.getY(0)); - Log.d("CS TS -> Pressure", me.getPressure(0) + " "); - Log.d("CS TS -> MajorAxis", me.getTouchMajor(0) + " "); - Log.d("CS TS -> MinorAxis", me.getTouchMinor(0) + " "); - Log.d("CS TS -> Size", me.getSize(0) + " "); - Log.d("CS TS -> PointerID", me.getPointerId(0) + " "); - Log.d("CS TS -> EventTime", me.getDownTime() + " on Action " + me.getAction()); - Log.d("CS TS -> EventTimeSys", tsLong.toString() + " on Action " + me.getAction()); - - try { - BiAManager.getInstance().recordKeyPressForce(me.getDownTime(), me.getPressure(0),me.getAction()); - } catch (InterruptedException e) { - //e.printStackTrace(); - } +// Log.d("CS_TS -> Pointer Count", me.getPointerCount() + " "); +// Log.d("CS_TS -> Cords", me.getX() + ","+ me.getY()); +// Log.d("CS_TS -> RAW Cords", me.getRawX() + ","+ me.getRawY()); +// Log.d("CS_TS -> View Cords", this.getX() + ","+ this.getY()); +// Log.d("CS_TS -> Action", me.getAction() + " "); +// Log.d("CS_TS -> Cords", me.getX(0) + ","+ me.getY(0)); +// Log.d("CS_TS -> Pressure", me.getPressure(0) + " "); +// Log.d("CS_TS -> MajorAxis", me.getTouchMajor(0) + " "); +// Log.d("CS_TS -> MinorAxis", me.getTouchMinor(0) + " "); +// Log.d("CS_TS -> Size", me.getSize(0) + " "); +// Log.d("CS_TS -> PointerID", me.getPointerId(0) + " "); +// Log.d("CS_TS -> EventTime", me.getDownTime() + " on Action " + me.getAction()); +// Log.d("CS_TS -> EventTimeSys", tsLong.toString() + " on Action " + me.getAction()); +// Log.d("CS_TS", " "); + + //BiAManager.getInstance().recordKeyPressForce(me.getDownTime(), me.getPressure(0),me.getAction()); + BiAManager.getInstance().addMasterEntry(me.getDownTime(), me.getEventTime(), me.getAction(), me.getPressure(), me.getX(), me.getY(), me.getTouchMajor(), me.getTouchMinor(), me.getPointerCount()); final int action = MotionEventCompat.getActionMasked(me); @@ -299,8 +302,6 @@ public boolean onTouchEvent(@NonNull MotionEvent me) { dismissPopupKeyboard(); return true; } else { - tsLong = System.currentTimeMillis()/1000; - Log.d("CS TS -> ", tsLong.toString()); return super.onTouchEvent(me); } } diff --git a/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardViewBase.java b/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardViewBase.java index 9a4b7e2249..f94d72908b 100644 --- a/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardViewBase.java +++ b/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardViewBase.java @@ -1784,6 +1784,7 @@ private void sendOnXEvent(final int action, final long eventTime, //CHECKSTYLE:OFF: missingswitchdefault Long tsLong = System.currentTimeMillis()/1000; Log.d("CS TS -> ", tsLong.toString()); + Log.i("key detect", "Rchd here"); switch (action) { case MotionEvent.ACTION_DOWN: case 0x00000005:// MotionEvent.ACTION_POINTER_DOWN: diff --git a/app/src/main/java/com/anysoftkeyboard/keyboards/views/PointerTracker.java b/app/src/main/java/com/anysoftkeyboard/keyboards/views/PointerTracker.java index 0cc9d3380d..e8dabc243a 100644 --- a/app/src/main/java/com/anysoftkeyboard/keyboards/views/PointerTracker.java +++ b/app/src/main/java/com/anysoftkeyboard/keyboards/views/PointerTracker.java @@ -246,6 +246,8 @@ void onDownEvent(int x, int y, long eventTime) { checkMultiTap(eventTime, keyIndex); if (mListener != null && isValidKeyIndex(keyIndex)) { AnyKey key = (AnyKey) mKeys[keyIndex]; + //Key centre probe biaffect. + //print key details final int codeAtIndex = key.getCodeAtIndex(0, mKeyDetector.isKeyShifted(key)); if (!mProxy.isAtTwoFingersState() && mListener.onGestureTypingInputStart(x, y, key, eventTime)) { diff --git a/app/src/main/java/com/anysoftkeyboard/keyboards/views/ProximityKeyDetector.java b/app/src/main/java/com/anysoftkeyboard/keyboards/views/ProximityKeyDetector.java index 62cc8e8761..e2b16bfd4a 100644 --- a/app/src/main/java/com/anysoftkeyboard/keyboards/views/ProximityKeyDetector.java +++ b/app/src/main/java/com/anysoftkeyboard/keyboards/views/ProximityKeyDetector.java @@ -16,6 +16,8 @@ package com.anysoftkeyboard.keyboards.views; +import android.util.Log; + import com.anysoftkeyboard.api.KeyCodes; import com.anysoftkeyboard.keyboards.AnyKeyboard; import com.anysoftkeyboard.keyboards.Keyboard.Key; @@ -45,6 +47,7 @@ public int getKeyIndexAndNearbyCodes(int x, int y, int[] allKeys) { final Key[] keys = getKeys(); final int touchX = getTouchX(x); final int touchY = getTouchY(y); + Log.d("CS TS -> ProximityKD", touchX + ","+ touchY); int primaryIndex = AnyKeyboardViewBase.NOT_A_KEY; int closestKey = AnyKeyboardViewBase.NOT_A_KEY; int closestKeyDist = mProximityThresholdSquare + 1; diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiADataProcessorInterface.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiADataProcessorInterface.java index 9a83d03a6e..c1568fb134 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiADataProcessorInterface.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiADataProcessorInterface.java @@ -1,6 +1,48 @@ package com.menny.android.anysoftkeyboard.BiAffect; public interface BiADataProcessorInterface { + interface TouchDataProcessorInterface { + //All the calls to process the touch data will be provided over here + //EventDownTime + //EventTime + //EventAction + //Pressure of the event + //x_cordinate + //y_cordinate + //major axis + //minor axis + //Number of touches..this is being done for the purpose of testing if we are overlapping any calls or something + + //One thing i need to make sure is that that data type of the touch cordinates remain the same for the view and the touches. + + boolean addMasterEntry(long eventDownTime, long eventTime, int eventAction, float pressure, float x_cord, float y_cord, float major_axis, float minor_axis, int touches); + } + + interface KeyDataProcessorInterface { + //All the calls to process the key data will be provided over here + //1->Key press down time..this is not the onpress call time as the onpress call follows after this probe, but we are really not interested in, + //when the listener handle the call, rather the time when the touch to this call was initiated + //2->Key press release time, this is again not the time of onRelease call to the listener but the time when the user lifted his/her finger, + //motionevent action_up was recorded, again sticking with the requirements + //3->the type of the key pressed + //This call might have some issue when it comes to handling the calls from the mini keyboard, the only thing which i can be sure about that right now, + //is that there will not be an action_up in the database for the corresponding longpress key, which i have decided for now that i will leave that, + //on the discretion of the person performing analysis of the data on how to treat that entry + + + } + + interface DeviceDataProcessorInterface{ + //This interface is going to put the device specific data in the table, it will only happen once + //we need to figureout how can i achieve that + } + + interface SessionDataProcessorInterface{ + //This will contain the methods which are specific to record the session of the keyboard, + //This will not be processed by any worker thread, instead it will be pushed in to db directly and the id of the current session will be + //maintained in the BiAManager.java + } + boolean recordKeyPressForce(long eventDownTime, double pressure, int action) throws InterruptedException; } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java index 20856d1a99..4ae5236395 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java @@ -1,12 +1,24 @@ package com.menny.android.anysoftkeyboard.BiAffect; +import android.util.Log; + import java.util.Hashtable; import java.util.LinkedHashMap; import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.Semaphore; -public class BiAManager implements BiADataProcessorInterface { +public class BiAManager implements BiADataProcessorInterface.TouchDataProcessorInterface, BiADataProcessorInterface{ private BiAWorker1 myCurrentWorker1; + //Two data structures to hold the master records, + static final int TOUCH_BUFFER_SIZE = 20; + TouchDataPOJO[] t1; + TouchDataPOJO[] t2; + boolean bucket1; + int currentIndex; + Semaphore t1_Sempahore = new Semaphore(1); + Semaphore t2_Sempahore = new Semaphore(1); + //Instead of inner static class we can also use enum static class FeatureLookupStruct{ final static String pressure = "PRESSURE"; @@ -25,6 +37,15 @@ private BiAManager(){ this.myTupleQueue = new ArrayBlockingQueue<>(10000); this.processingMap = new LinkedHashMap<>(); this.finalPOJOMap = new LinkedHashMap<>(); + + //Initialising all the buffers + this.t1 = new TouchDataPOJO[TOUCH_BUFFER_SIZE]; + this.t2 = new TouchDataPOJO[TOUCH_BUFFER_SIZE]; + this.bucket1=true; + for(int i=0; i"+currentIndex); + temp[currentIndex].printYourself(); + Log.i("CS_BiAffect","---------------------------------"); + + }catch(InterruptedException e){ + Log.i("CS_BiAffect", "failed to acquire lock on semaphore"); + }finally { + temp_Semaphore.release(); + if(temp[currentIndex].used){ + if(currentIndex == temp.length-1){ + Log.i("CS_BiAffect","-----------BUFFER CHANGE-------------"+this.bucket1); + //We can kickoff a worker thread from here to take all the pojos and insert it into the database + //We will pass the number of the last buffer being used and then expect the thread to infer from that which one + //needs to be emptied + Thread t = new Thread(new TouchDataWorker(this.bucket1)); + t.start(); + //Time to change the buffer and put all the things in the second from next + this.currentIndex = 0; + if(this.bucket1){ + bucket1=false; + }else{ + bucket1=true; + } + + + }else{ + currentIndex++; + } + } + } + + return false; + } } \ No newline at end of file diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataPOJO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataPOJO.java new file mode 100644 index 0000000000..e5b42fc49e --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataPOJO.java @@ -0,0 +1,55 @@ +package com.menny.android.anysoftkeyboard.BiAffect; + +import android.util.Log; + +public class TouchDataPOJO{ + boolean used; + long eventDownTime; + long eventTime; + int eventAction; + float pressure; + float x_cord; + float y_cord; + float major_axis; + float minor_axis; + int touches; + + + public TouchDataPOJO(){ + //I really dont need to initialise anything cos everything is primitive data type + } + + public boolean markUnused(){ + this.used = false; + this.eventDownTime=0; + this.eventTime=0; + this.eventAction=-1; + this.pressure = 0.0f; + this.x_cord = 0.0f; + this.y_cord = 0.0f; + this.major_axis=0.0f; + this.minor_axis=0.0f; + this.touches=-1; + + return true; + } + + public boolean validatePOJO(){ + return (this.used && this.eventAction!=-1 && this.touches!=-1); + } + + public void printYourself(){ + + Log.i("CS_BiAffect", "eventDownTime->"+this.eventDownTime); + Log.i("CS_BiAffect", "eventTime->"+this.eventTime); + Log.i("CS_BiAffect", "eventAction->"+this.eventAction); + Log.i("CS_BiAffect", "pressure->"+this.pressure); + Log.i("CS_BiAffect", "x_cord->"+this.x_cord); + Log.i("CS_BiAffect", "y_cord->"+this.y_cord); + Log.i("CS_BiAffect", "major_axis->"+this.major_axis); + Log.i("CS_BiAffect", "minor_axis->"+this.minor_axis); + Log.i("CS_BiAffect", "touches->"+this.touches); + } + + //I think i will used event action and touches to check the validity of the pojo class +} \ No newline at end of file diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java new file mode 100644 index 0000000000..09e687005f --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java @@ -0,0 +1,45 @@ +package com.menny.android.anysoftkeyboard.BiAffect; + +import android.util.Log; + +import java.util.concurrent.Semaphore; + +public class TouchDataWorker implements Runnable { + boolean bucket1; + BiAManager sharedInstance; + TouchDataWorker(boolean bucket1){ + super(); + this.bucket1 = bucket1; + } + + @Override + public void run() { + sharedInstance = BiAManager.getInstance(); + TouchDataPOJO[] temp; + Semaphore temp_Sempaphore; + if(bucket1){ + temp = sharedInstance.t1; + temp_Sempaphore = sharedInstance.t1_Sempahore; + }else{ + temp = sharedInstance.t2; + temp_Sempaphore = sharedInstance.t2_Sempahore; + } + + try { + temp_Sempaphore.acquire(); + Log.i("CS_BiAffect","-----------BUFFER EMPTY START-------------"+this.bucket1); + for(int i=0; i Date: Sun, 21 Apr 2019 19:32:43 -0500 Subject: [PATCH 004/113] adding gradle dependencies for room --- app/build.gradle | 9 +++++++++ build.gradle | 5 +++++ 2 files changed, 14 insertions(+) diff --git a/app/build.gradle b/app/build.gradle index ea8069d3bd..0ccfaedac8 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -140,4 +140,13 @@ dependencies { testImplementation project(path: ':base-test') testImplementation 'com.github.triplet.simpleprovider:simpleprovider:1.1.0' + + // Room components + implementation "android.arch.persistence.room:runtime:$rootProject.roomVersion" + annotationProcessor "android.arch.persistence.room:compiler:$rootProject.roomVersion" + androidTestImplementation "android.arch.persistence.room:testing:$rootProject.roomVersion" + + // Lifecycle components + implementation "android.arch.lifecycle:extensions:$rootProject.archLifecycleVersion" + annotationProcessor "android.arch.lifecycle:compiler:$rootProject.archLifecycleVersion" } diff --git a/build.gradle b/build.gradle index 8c981a65d6..503e7414a5 100644 --- a/build.gradle +++ b/build.gradle @@ -30,3 +30,8 @@ allprojects { apply from: "${rootDir}/gradle/emoji_generator.gradle" apply from: "${rootDir}/gradle/root_all_projects_ext.gradle" + +ext { + roomVersion = '1.1.1' + archLifecycleVersion = '1.1.1' +} \ No newline at end of file From 35358169a3cb3987d53ed800cd37168a917b9985 Mon Sep 17 00:00:00 2001 From: Vinay Manchundiya Date: Sun, 21 Apr 2019 21:56:35 -0500 Subject: [PATCH 005/113] Accelerometer data added, not checked on real device yet --- .../keyboards/views/AnyKeyboardView.java | 2 +- .../anysoftkeyboard/BiAffect/BiAManager.java | 27 ++++++++++++++++++- .../BiAffect/TouchDataPOJO.java | 9 +++++++ 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardView.java b/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardView.java index 7aa4a97b39..432131bc64 100644 --- a/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardView.java +++ b/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardView.java @@ -56,7 +56,7 @@ import java.util.ArrayList; import java.util.List; -public class AnyKeyboardView extends AnyKeyboardViewWithExtraDraw implements InputViewBinder { +public class AnyKeyboardView extends AnyKeyboardViewWithExtraDraw implements InputViewBinder{ private static final int DELAY_BEFORE_POPPING_UP_EXTENSION_KBD = 35;// milliseconds private static final String TAG = "AnyKeyboardView"; diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java index 4ae5236395..aa8f89b6d8 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java @@ -1,4 +1,7 @@ package com.menny.android.anysoftkeyboard.BiAffect; +import android.hardware.Sensor; +import android.hardware.SensorEvent; +import android.hardware.SensorEventListener; import android.util.Log; import java.util.Hashtable; @@ -6,7 +9,7 @@ import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Semaphore; -public class BiAManager implements BiADataProcessorInterface.TouchDataProcessorInterface, BiADataProcessorInterface{ +public class BiAManager implements BiADataProcessorInterface.TouchDataProcessorInterface, BiADataProcessorInterface, SensorEventListener { private BiAWorker1 myCurrentWorker1; @@ -19,6 +22,25 @@ public class BiAManager implements BiADataProcessorInterface.TouchDataProcessorI Semaphore t1_Sempahore = new Semaphore(1); Semaphore t2_Sempahore = new Semaphore(1); + //Sensor specific data holders + float current_accelerometer_x; + float current_accelerometer_y; + float current_accelerometer_z; + + @Override + public void onSensorChanged(SensorEvent event) { + if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){ + current_accelerometer_x = event.values[0]; + current_accelerometer_y = event.values[1]; + current_accelerometer_z = event.values[2]; + } + } + + @Override + public void onAccuracyChanged(Sensor sensor, int accuracy) { + + } + //Instead of inner static class we can also use enum static class FeatureLookupStruct{ final static String pressure = "PRESSURE"; @@ -105,6 +127,9 @@ public boolean addMasterEntry(long eventDownTime, long eventTime, int eventActio temp[currentIndex].major_axis = major_axis; temp[currentIndex].minor_axis = minor_axis; temp[currentIndex].touches = touches; + temp[currentIndex].accelerometer_x = current_accelerometer_x; + temp[currentIndex].accelerometer_y = current_accelerometer_y; + temp[currentIndex].accelerometer_z = current_accelerometer_z; temp[currentIndex].used = true; Log.i("CS_BiAffect","---------------------------------"); Log.i("CS_BiAffect","Index->"+currentIndex); diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataPOJO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataPOJO.java index e5b42fc49e..a4ebf6c986 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataPOJO.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataPOJO.java @@ -12,6 +12,9 @@ public class TouchDataPOJO{ float y_cord; float major_axis; float minor_axis; + float accelerometer_x; + float accelerometer_y; + float accelerometer_z; int touches; @@ -29,6 +32,9 @@ public boolean markUnused(){ this.y_cord = 0.0f; this.major_axis=0.0f; this.minor_axis=0.0f; + this.accelerometer_x = 0.0f; + this.accelerometer_y = 0.0f; + this.accelerometer_z = 0.0f; this.touches=-1; return true; @@ -49,6 +55,9 @@ public void printYourself(){ Log.i("CS_BiAffect", "major_axis->"+this.major_axis); Log.i("CS_BiAffect", "minor_axis->"+this.minor_axis); Log.i("CS_BiAffect", "touches->"+this.touches); + Log.i("CS_BiAffect", "Acc_X->"+this.accelerometer_x); + Log.i("CS_BiAffect", "Acc_Y->"+this.accelerometer_y); + Log.i("CS_BiAffect", "Acc_Z->"+this.accelerometer_z); } //I think i will used event action and touches to check the validity of the pojo class From f2440b5e200c05ed95feef5a37b0b458a717640f Mon Sep 17 00:00:00 2001 From: sree Date: Sun, 21 Apr 2019 22:41:14 -0500 Subject: [PATCH 006/113] Adding Db Models, DAO --- app/build.gradle | 7 ++- app/src/main/java/DBModel/KeyData.java | 3 + app/src/main/java/DBModel/TouchData.java | 74 ++++++++++++++++++++++++ app/src/main/java/DB_DAO/Touch_DAO.java | 11 ++++ 4 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/DBModel/KeyData.java create mode 100644 app/src/main/java/DBModel/TouchData.java create mode 100644 app/src/main/java/DB_DAO/Touch_DAO.java diff --git a/app/build.gradle b/app/build.gradle index 0ccfaedac8..94046658dd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -20,7 +20,7 @@ apply plugin: 'net.evendanan.versiongenerator' def generators = [ new net.evendanan.versiongenerator.generators.EnvBuildVersionGenerator.CircleCi( 1650/*adding to version. Should not ever change*/, - -2575-2600 /*decrementing due to minor, every minor/major bump, this should be decremented*/), + -2575 - 2600 /*decrementing due to minor, every minor/major bump, this should be decremented*/), new net.evendanan.versiongenerator.generators.StaticVersionGenerator() ] @@ -86,6 +86,9 @@ android { matchingFallbacks = ['release', 'debug'] } } + sourceSets { + main { java.srcDirs = ['src/main/java', 'src/main/java/DBModel', 'src/main/java/DB_DAO'] } + } } play { @@ -104,7 +107,7 @@ if (playStoreWhatsNewFile.text.length() > 500) { println("Locale " + Locale.getDefault()) println("file encoding " + CharsetToolkit.defaultSystemCharset) println("File contents:") - println("***" + playStoreWhatsNewFile.text + "***") + println("***" + playStoreWhatsNewFile.text + "***") throw new IllegalStateException("whatsnew file can not be longer than 500 characters! Currently " + playStoreWhatsNewFile.text.length()) } diff --git a/app/src/main/java/DBModel/KeyData.java b/app/src/main/java/DBModel/KeyData.java new file mode 100644 index 0000000000..a83ea7976d --- /dev/null +++ b/app/src/main/java/DBModel/KeyData.java @@ -0,0 +1,3 @@ +public class KeyData +{ +} diff --git a/app/src/main/java/DBModel/TouchData.java b/app/src/main/java/DBModel/TouchData.java new file mode 100644 index 0000000000..2c8c79b344 --- /dev/null +++ b/app/src/main/java/DBModel/TouchData.java @@ -0,0 +1,74 @@ +import android.arch.persistence.room.ColumnInfo; +import android.arch.persistence.room.Entity; +import android.arch.persistence.room.ForeignKey; +import android.arch.persistence.room.PrimaryKey; +import android.support.annotation.NonNull; + +@Entity(foreignKeys = @ForeignKey(entity = KeyData.class, + parentColumns = "Key_id", + childColumns = "Key_Id", + onDelete = ForeignKey.NO_ACTION)) +public class TouchData { + + @PrimaryKey (autoGenerate = true) + @NonNull + @ColumnInfo(name = "Id") + private int id; + + @NonNull + @ColumnInfo(name = "Key_Id") + public long eventDownTime; + + @NonNull + @ColumnInfo(name = "Key_UP_time") + public long eventTime; + + @NonNull + @ColumnInfo(name = "Key_Event_Action") + public int eventAction; + + @NonNull + @ColumnInfo(name = "Force_of_Touch") + public float pressure; + + @NonNull + @ColumnInfo(name = "Key_press_X_cord") + public float x_cord; + + @NonNull + @ColumnInfo(name = "Key_press_Y_cord") + public float y_cord; + + @NonNull + @ColumnInfo(name = "Key_toucharea_Major_axis") + public float major_axis; + + @NonNull + @ColumnInfo(name = "Key_toucharea_Minor_axis") + public float minor_axis; + + @NonNull + @ColumnInfo(name = "accelerometer_x") + public float accelerometer_x; + + @NonNull + @ColumnInfo(name = "accelerometer_y") + public float accelerometer_y; + + @NonNull + @ColumnInfo(name = "accelerometer_z") + public float accelerometer_z; + + @NonNull + @ColumnInfo(name = "Number_of_touches") + public int touches; + + public TouchData(int id) { + this.id = id; + } + + public int getTouchId() { return id; } + + + } + diff --git a/app/src/main/java/DB_DAO/Touch_DAO.java b/app/src/main/java/DB_DAO/Touch_DAO.java new file mode 100644 index 0000000000..4637c61a89 --- /dev/null +++ b/app/src/main/java/DB_DAO/Touch_DAO.java @@ -0,0 +1,11 @@ +import android.arch.persistence.room.Dao; +import android.arch.persistence.room.Insert; + +@Dao +public interface Touch_DAO { + + @Insert + void insertOnlySingleMovie (TouchData single_entry); + @Insert + void insertMultipleMovies (TouchData[] touchDataList); +} From 3c56e3b305e580941ec94ac3746dff8ac186983c Mon Sep 17 00:00:00 2001 From: sree Date: Mon, 22 Apr 2019 00:33:05 -0500 Subject: [PATCH 007/113] Create DB --- app/src/main/java/BiAffectDatabase.java | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 app/src/main/java/BiAffectDatabase.java diff --git a/app/src/main/java/BiAffectDatabase.java b/app/src/main/java/BiAffectDatabase.java new file mode 100644 index 0000000000..f838113ff2 --- /dev/null +++ b/app/src/main/java/BiAffectDatabase.java @@ -0,0 +1,25 @@ +import android.arch.persistence.room.Database; +import android.arch.persistence.room.Room; +import android.arch.persistence.room.RoomDatabase; +import android.content.Context; + +@Database(entities = {TouchData.class,KeyData.class}, version = 1) +public abstract class BiAffectDatabase extends RoomDatabase { + + public abstract Touch_DAO TouchDao(); + + private static volatile BiAffectDatabase INSTANCE; + + static BiAffectDatabase getDatabase(final Context context) { + if (INSTANCE == null) { + synchronized (BiAffectDatabase.class) { + if (INSTANCE == null) { + INSTANCE = Room.databaseBuilder(context.getApplicationContext(), + BiAffectDatabase.class, "BiAffect_database") + .build(); + } + } + } + return INSTANCE; + } +} From 22a494d351bef8c17d268594c3eccf1b0be26959 Mon Sep 17 00:00:00 2001 From: sree Date: Mon, 22 Apr 2019 12:13:50 -0500 Subject: [PATCH 008/113] Room implementation --- app/build.gradle | 37 +++++++-- app/src/debug/AndroidManifest.xml | 4 +- app/src/main/AndroidManifest.xml | 5 +- app/src/main/java/DBModel/KeyData.java | 3 - app/src/main/java/DBModel/TouchData.java | 74 ----------------- app/src/main/java/DB_DAO/Touch_DAO.java | 11 --- .../BiAffect/TouchDataWorker.java | 22 +++++ .../BiAffectDB_roomDAO/Touch_DAO.java | 16 ++++ .../BiAffectDB_roomModel/KeyData.java | 22 +++++ .../BiAffectDB_roomModel/TouchData.java | 81 +++++++++++++++++++ .../anysoftkeyboard}/BiAffectDatabase.java | 8 +- 11 files changed, 184 insertions(+), 99 deletions(-) delete mode 100644 app/src/main/java/DBModel/KeyData.java delete mode 100644 app/src/main/java/DBModel/TouchData.java delete mode 100644 app/src/main/java/DB_DAO/Touch_DAO.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB_roomDAO/Touch_DAO.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB_roomModel/KeyData.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB_roomModel/TouchData.java rename app/src/main/java/{ => com/menny/android/anysoftkeyboard}/BiAffectDatabase.java (69%) diff --git a/app/build.gradle b/app/build.gradle index 94046658dd..4996ace565 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -10,6 +10,7 @@ buildscript { dependencies { classpath 'com.github.menny:GradleVersion:0.0.3' + //classpath 'com.android.tools.build:gradle:3.3.0' } } @@ -31,6 +32,7 @@ apply from: "${rootDir}/gradle/android_general.gradle" android { defaultConfig { applicationId 'com.menny.android.anysoftkeyboard' + minSdkVersion 14 versionCode versionData.versionCode versionName versionData.versionName @@ -87,7 +89,9 @@ android { } } sourceSets { - main { java.srcDirs = ['src/main/java', 'src/main/java/DBModel', 'src/main/java/DB_DAO'] } + main { + java.srcDirs = ['src/main/java', 'src/main/java/com/menny/android/anysoftkeyboard/DAO_DB'] + } } } @@ -144,12 +148,29 @@ dependencies { testImplementation project(path: ':base-test') testImplementation 'com.github.triplet.simpleprovider:simpleprovider:1.1.0' - // Room components - implementation "android.arch.persistence.room:runtime:$rootProject.roomVersion" +// // Room components + /* + * Room depends on 26.1 of support library, SupportLibrary does not promise interop between versions. + * hence code breaking? + * Trying to resolve by excluding from group + * */ + implementation("android.arch.persistence.room:runtime:$rootProject.roomVersion") { + exclude group: 'com.android.support' + } annotationProcessor "android.arch.persistence.room:compiler:$rootProject.roomVersion" - androidTestImplementation "android.arch.persistence.room:testing:$rootProject.roomVersion" - - // Lifecycle components - implementation "android.arch.lifecycle:extensions:$rootProject.archLifecycleVersion" - annotationProcessor "android.arch.lifecycle:compiler:$rootProject.archLifecycleVersion" +// } } + +// trying to resolve the android version issues +//configurations.all { +// resolutionStrategy.eachDependency { DependencyResolveDetails details -> +// def requested = details.requested +// if (requested.group == 'com.android.support') { +// if (!requested.name.startsWith("multidex")) { +// details.useVersion '28.0.0' +// } +// } +// } +// +// + diff --git a/app/src/debug/AndroidManifest.xml b/app/src/debug/AndroidManifest.xml index 189b19b15b..6f45288176 100644 --- a/app/src/debug/AndroidManifest.xml +++ b/app/src/debug/AndroidManifest.xml @@ -4,5 +4,7 @@ + tools:replace="android:name" > + + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6bf1cc5e2d..eb05ac3a36 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,6 @@ - + diff --git a/app/src/main/java/DBModel/KeyData.java b/app/src/main/java/DBModel/KeyData.java deleted file mode 100644 index a83ea7976d..0000000000 --- a/app/src/main/java/DBModel/KeyData.java +++ /dev/null @@ -1,3 +0,0 @@ -public class KeyData -{ -} diff --git a/app/src/main/java/DBModel/TouchData.java b/app/src/main/java/DBModel/TouchData.java deleted file mode 100644 index 2c8c79b344..0000000000 --- a/app/src/main/java/DBModel/TouchData.java +++ /dev/null @@ -1,74 +0,0 @@ -import android.arch.persistence.room.ColumnInfo; -import android.arch.persistence.room.Entity; -import android.arch.persistence.room.ForeignKey; -import android.arch.persistence.room.PrimaryKey; -import android.support.annotation.NonNull; - -@Entity(foreignKeys = @ForeignKey(entity = KeyData.class, - parentColumns = "Key_id", - childColumns = "Key_Id", - onDelete = ForeignKey.NO_ACTION)) -public class TouchData { - - @PrimaryKey (autoGenerate = true) - @NonNull - @ColumnInfo(name = "Id") - private int id; - - @NonNull - @ColumnInfo(name = "Key_Id") - public long eventDownTime; - - @NonNull - @ColumnInfo(name = "Key_UP_time") - public long eventTime; - - @NonNull - @ColumnInfo(name = "Key_Event_Action") - public int eventAction; - - @NonNull - @ColumnInfo(name = "Force_of_Touch") - public float pressure; - - @NonNull - @ColumnInfo(name = "Key_press_X_cord") - public float x_cord; - - @NonNull - @ColumnInfo(name = "Key_press_Y_cord") - public float y_cord; - - @NonNull - @ColumnInfo(name = "Key_toucharea_Major_axis") - public float major_axis; - - @NonNull - @ColumnInfo(name = "Key_toucharea_Minor_axis") - public float minor_axis; - - @NonNull - @ColumnInfo(name = "accelerometer_x") - public float accelerometer_x; - - @NonNull - @ColumnInfo(name = "accelerometer_y") - public float accelerometer_y; - - @NonNull - @ColumnInfo(name = "accelerometer_z") - public float accelerometer_z; - - @NonNull - @ColumnInfo(name = "Number_of_touches") - public int touches; - - public TouchData(int id) { - this.id = id; - } - - public int getTouchId() { return id; } - - - } - diff --git a/app/src/main/java/DB_DAO/Touch_DAO.java b/app/src/main/java/DB_DAO/Touch_DAO.java deleted file mode 100644 index 4637c61a89..0000000000 --- a/app/src/main/java/DB_DAO/Touch_DAO.java +++ /dev/null @@ -1,11 +0,0 @@ -import android.arch.persistence.room.Dao; -import android.arch.persistence.room.Insert; - -@Dao -public interface Touch_DAO { - - @Insert - void insertOnlySingleMovie (TouchData single_entry); - @Insert - void insertMultipleMovies (TouchData[] touchDataList); -} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java index 09e687005f..e3451fcda8 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java @@ -2,6 +2,9 @@ import android.util.Log; +import com.menny.android.anysoftkeyboard.BiAffectDB_roomModel.TouchData; +import com.menny.android.anysoftkeyboard.BiAffectDatabase; + import java.util.concurrent.Semaphore; public class TouchDataWorker implements Runnable { @@ -28,10 +31,29 @@ public void run() { try { temp_Sempaphore.acquire(); Log.i("CS_BiAffect","-----------BUFFER EMPTY START-------------"+this.bucket1); + // creating instance of TouchData entity + TouchData touchMetrics = new TouchData(); for(int i=0; i Date: Mon, 22 Apr 2019 12:14:19 -0500 Subject: [PATCH 009/113] . --- build.gradle | 1 - 1 file changed, 1 deletion(-) diff --git a/build.gradle b/build.gradle index 503e7414a5..ae8f4412bd 100644 --- a/build.gradle +++ b/build.gradle @@ -33,5 +33,4 @@ apply from: "${rootDir}/gradle/root_all_projects_ext.gradle" ext { roomVersion = '1.1.1' - archLifecycleVersion = '1.1.1' } \ No newline at end of file From 6eec0e754c3714bc51ea3644453fa631d0f7339e Mon Sep 17 00:00:00 2001 From: sree Date: Mon, 22 Apr 2019 14:34:13 -0500 Subject: [PATCH 010/113] DB end to end --- .../anysoftkeyboard/AnyApplication.java | 21 ++++ .../anysoftkeyboard/BiAffect/BiAManager.java | 6 +- .../BiAffect/TouchDataWorker.java | 114 +++++++++++++++--- .../BiAffectDB_roomDAO/Touch_DAO.java | 15 ++- .../BiAffectDB_roomModel/TouchData.java | 15 +-- .../anysoftkeyboard/BiAffectDatabase.java | 2 +- 6 files changed, 143 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/AnyApplication.java b/app/src/main/java/com/menny/android/anysoftkeyboard/AnyApplication.java index 9a010a3595..e9ef69cbdb 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/AnyApplication.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/AnyApplication.java @@ -69,6 +69,11 @@ public class AnyApplication extends Application { private static final String TAG = "ASK_APP"; + /** + * Created by Sreetama Banerjee on 4/22/2019. + * reason : to allow all components of project to get appcontext + */ + private static Context appContext; static final String PREF_KEYS_FIRST_INSTALLED_APP_VERSION = "settings_key_first_app_version_installed"; static final String PREF_KEYS_FIRST_INSTALLED_APP_TIME = "settings_key_first_time_app_installed"; @@ -170,8 +175,16 @@ public void onCreate() { mCompositeDisposable.add(NightMode.observeNightModeState(this, R.string.settings_key_night_mode_app_theme_control, R.bool.settings_default_true) .subscribe(nightMode -> AppCompatDelegate.setDefaultNightMode(nightMode ? AppCompatDelegate.MODE_NIGHT_YES : AppCompatDelegate.MODE_NIGHT_NO))); mNightModeSubject.onNext((getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK) == Configuration.UI_MODE_NIGHT_YES); + + /** + * Created by Sreetama Banerjee on 4/22/2019. + * reason : to allow all components of project to get appcontext + */ + appContext = getApplicationContext(); } + + @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); @@ -304,6 +317,14 @@ public static RxSharedPrefs prefs(Context context) { } } + /** + * Created by Sreetama Banerjee on 4/22/2019. + * reason : to allow all components of project to get appcontext + */ + public static Context getAppContext() { + return appContext; + } + public List getInitialWatermarksList() { return new ArrayList<>(); } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java index aa8f89b6d8..4973f37964 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java @@ -1,9 +1,12 @@ package com.menny.android.anysoftkeyboard.BiAffect; +import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.util.Log; +import com.menny.android.anysoftkeyboard.AnyApplication; + import java.util.Hashtable; import java.util.LinkedHashMap; import java.util.concurrent.ArrayBlockingQueue; @@ -83,7 +86,6 @@ public boolean recordKeyPressForce(long eventDownTime, double pressure, int acti System.out.println("BiAffect recordKeyPressForce received for "+eventDownTime+ " For action "+ action); Pressure myPressure = new Pressure(FeatureLookupStruct.pressure, eventDownTime, pressure, action); shared_instance.myTupleQueue.put(myPressure); - return true; } @@ -135,6 +137,7 @@ public boolean addMasterEntry(long eventDownTime, long eventTime, int eventActio Log.i("CS_BiAffect","Index->"+currentIndex); temp[currentIndex].printYourself(); Log.i("CS_BiAffect","---------------------------------"); + //Log.i("CS_BiAffect_App_context",AnyApplication.getAppContext().toString()); }catch(InterruptedException e){ Log.i("CS_BiAffect", "failed to acquire lock on semaphore"); @@ -161,6 +164,7 @@ public boolean addMasterEntry(long eventDownTime, long eventTime, int eventActio currentIndex++; } } + Log.i("CS_BiAffect_App_context",AnyApplication.getAppContext().toString()); } return false; diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java index e3451fcda8..fb5bd30f9f 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java @@ -1,7 +1,9 @@ package com.menny.android.anysoftkeyboard.BiAffect; +import android.content.Context; import android.util.Log; +import com.menny.android.anysoftkeyboard.AnyApplication; import com.menny.android.anysoftkeyboard.BiAffectDB_roomModel.TouchData; import com.menny.android.anysoftkeyboard.BiAffectDatabase; @@ -31,37 +33,111 @@ public void run() { try { temp_Sempaphore.acquire(); Log.i("CS_BiAffect","-----------BUFFER EMPTY START-------------"+this.bucket1); - // creating instance of TouchData entity + /** + * Created by Sreetama Banerjee on 4/22/2019. + * reason : to allow all components of project to get appcontext + */ + Context context = AnyApplication.getAppContext(); + + /** + * Created by Sreetama Banerjee on 4/22/2019. + * reason : getting instance of database class + */ + BiAffectDatabase INSTANCE=BiAffectDatabase.getDatabase(context); + + //database entity instances + /** + * Created by Sreetama Banerjee on 4/22/2019. + * reason : creating instance of TouchData entity + */// TouchData touchMetrics = new TouchData(); - for(int i=0; i Date: Tue, 23 Apr 2019 23:44:19 -0500 Subject: [PATCH 011/113] Safe --- .../keyboards/views/AnyKeyboardView.java | 3 +- .../keyboards/views/PointerTracker.java | 4 + .../BiAffect/BiADataProcessorInterface.java | 2 + .../anysoftkeyboard/BiAffect/BiAManager.java | 40 +++++++--- .../anysoftkeyboard/BiAffect/BiAWorker1.java | 78 ++++++++++--------- .../BiAffect/TouchDataWorker.java | 14 +++- .../android/anysoftkeyboard/SoftKeyboard.java | 2 +- 7 files changed, 87 insertions(+), 56 deletions(-) diff --git a/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardView.java b/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardView.java index 432131bc64..9def3b4e5b 100644 --- a/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardView.java +++ b/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardView.java @@ -223,8 +223,7 @@ public boolean onTouchEvent(@NonNull MotionEvent me) { // Log.d("CS_TS", " "); //BiAManager.getInstance().recordKeyPressForce(me.getDownTime(), me.getPressure(0),me.getAction()); - BiAManager.getInstance().addMasterEntry(me.getDownTime(), me.getEventTime(), me.getAction(), me.getPressure(), me.getX(), me.getY(), me.getTouchMajor(), me.getTouchMinor(), me.getPointerCount()); - + BiAManager.getInstance(this.getContext()).addMasterEntry(me.getDownTime(), me.getEventTime(), me.getAction(), me.getPressure(), me.getX(), me.getY(), me.getTouchMajor(), me.getTouchMinor(), me.getPointerCount()); final int action = MotionEventCompat.getActionMasked(me); PointerTracker pointerTracker = getPointerTracker(me); diff --git a/app/src/main/java/com/anysoftkeyboard/keyboards/views/PointerTracker.java b/app/src/main/java/com/anysoftkeyboard/keyboards/views/PointerTracker.java index e8dabc243a..7f6eaf1515 100644 --- a/app/src/main/java/com/anysoftkeyboard/keyboards/views/PointerTracker.java +++ b/app/src/main/java/com/anysoftkeyboard/keyboards/views/PointerTracker.java @@ -243,6 +243,10 @@ void onDownEvent(int x, int y, long eventTime) { mKeyAlreadyProcessed = false; mIsRepeatableKey = false; mKeyCodesInPathLength = -1; + Log.i("CS_BiAffect_K", "KeyIndex->"+getKey(keyIndex).label.toString()); + Log.i("CS_BiAffect_K", "EventTime->"+eventTime); + Log.i("CS_BiAffect_K", "X->"+x); + Log.i("CS_BiAffect_K", "Y->"+y); checkMultiTap(eventTime, keyIndex); if (mListener != null && isValidKeyIndex(keyIndex)) { AnyKey key = (AnyKey) mKeys[keyIndex]; diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiADataProcessorInterface.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiADataProcessorInterface.java index c1568fb134..65b91eab9e 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiADataProcessorInterface.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiADataProcessorInterface.java @@ -35,12 +35,14 @@ interface KeyDataProcessorInterface { interface DeviceDataProcessorInterface{ //This interface is going to put the device specific data in the table, it will only happen once //we need to figureout how can i achieve that + //We will be putting in 4 values in here for now, which are android version, pixel density, screen size and phone model } interface SessionDataProcessorInterface{ //This will contain the methods which are specific to record the session of the keyboard, //This will not be processed by any worker thread, instead it will be pushed in to db directly and the id of the current session will be //maintained in the BiAManager.java + //This will contain start session, end session and GyroScope data } boolean recordKeyPressForce(long eventDownTime, double pressure, int action) throws InterruptedException; diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java index 4973f37964..a3a5452810 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java @@ -3,6 +3,7 @@ import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; +import android.hardware.SensorManager; import android.util.Log; import com.menny.android.anysoftkeyboard.AnyApplication; @@ -16,6 +17,8 @@ public class BiAManager implements BiADataProcessorInterface.TouchDataProcessorI private BiAWorker1 myCurrentWorker1; + //Context specific holders + Context mContext; //Two data structures to hold the master records, static final int TOUCH_BUFFER_SIZE = 20; TouchDataPOJO[] t1; @@ -24,8 +27,8 @@ public class BiAManager implements BiADataProcessorInterface.TouchDataProcessorI int currentIndex; Semaphore t1_Sempahore = new Semaphore(1); Semaphore t2_Sempahore = new Semaphore(1); - //Sensor specific data holders + private SensorManager mSensorManager; float current_accelerometer_x; float current_accelerometer_y; float current_accelerometer_z; @@ -57,7 +60,8 @@ static class FeatureLookupStruct{ LinkedHashMap finalPOJOMap; - private BiAManager(){ + private BiAManager(Context context){ + this.mContext = context; //This wont contain anything as such this.myTupleQueue = new ArrayBlockingQueue<>(10000); this.processingMap = new LinkedHashMap<>(); @@ -67,17 +71,28 @@ private BiAManager(){ this.t1 = new TouchDataPOJO[TOUCH_BUFFER_SIZE]; this.t2 = new TouchDataPOJO[TOUCH_BUFFER_SIZE]; this.bucket1=true; - for(int i=0; i myQueueReference = managerSharedInstance.myTupleQueue; - LinkedHashMap myProcessingMapReference = managerSharedInstance.processingMap; - //Hashtable myFinalPOJOMapReference = managerSharedInstance.finalPOJOMap; - - BiAPOJO referenceHolder; - - while (sessionRunning){ - Log.d("BiA Data Processing", "BiAWorker1 is running"); - try { - BiAFeature currentTuple = myQueueReference.take(); - - if(myProcessingMapReference.containsKey(currentTuple.id)){ - //already present in the map we dont need to create a new pojo instance - System.out.println("BiAffect Pojo already present in map"); - referenceHolder = myProcessingMapReference.get(currentTuple.id); - assert referenceHolder != null; - referenceHolder.addRecord(currentTuple); - }else{ - //create pojo instance - System.out.println("BiAffect Creating new pojo"); - referenceHolder = new BiAPOJO(); - referenceHolder.addRecord(currentTuple); - myProcessingMapReference.put(currentTuple.id, referenceHolder); + BiAManager managerSharedInstance = BiAManager.getInstance(null); + if(managerSharedInstance != null){ + ArrayBlockingQueue myQueueReference = managerSharedInstance.myTupleQueue; + LinkedHashMap myProcessingMapReference = managerSharedInstance.processingMap; + //Hashtable myFinalPOJOMapReference = managerSharedInstance.finalPOJOMap; + + BiAPOJO referenceHolder; + + while (sessionRunning){ + Log.d("BiA Data Processing", "BiAWorker1 is running"); + try { + BiAFeature currentTuple = myQueueReference.take(); + + if(myProcessingMapReference.containsKey(currentTuple.id)){ + //already present in the map we dont need to create a new pojo instance + System.out.println("BiAffect Pojo already present in map"); + referenceHolder = myProcessingMapReference.get(currentTuple.id); + assert referenceHolder != null; + referenceHolder.addRecord(currentTuple); + }else{ + //create pojo instance + System.out.println("BiAffect Creating new pojo"); + referenceHolder = new BiAPOJO(); + referenceHolder.addRecord(currentTuple); + myProcessingMapReference.put(currentTuple.id, referenceHolder); + } + + if(!referenceHolder.totalRecordMap.containsValue(false)){ + //Now this means that this pojo is ready to be pushed into second buffer + System.out.println("BiAffect A pojo just finished"); + } + + }catch (InterruptedException e) { + //e.printStackTrace(); } - if(!referenceHolder.totalRecordMap.containsValue(false)){ - //Now this means that this pojo is ready to be pushed into second buffer - System.out.println("BiAffect A pojo just finished"); + try { + Thread.sleep(25);//sleep for 25ms + } catch (InterruptedException e) { + //e.printStackTrace(); } - - }catch (InterruptedException e) { - //e.printStackTrace(); - } - - try { - Thread.sleep(25);//sleep for 25ms - } catch (InterruptedException e) { - //e.printStackTrace(); } + } else{ + Log.i("CS_BiAffect","Shared instance was null in "+this.getClass().getName()) + ; } - } public void endCurrentSession(){ diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java index fb5bd30f9f..d21cd07f8a 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java @@ -1,5 +1,6 @@ package com.menny.android.anysoftkeyboard.BiAffect; +import android.app.Application; import android.content.Context; import android.util.Log; @@ -19,7 +20,7 @@ public class TouchDataWorker implements Runnable { @Override public void run() { - sharedInstance = BiAManager.getInstance(); + sharedInstance = BiAManager.getInstance(null); TouchDataPOJO[] temp; Semaphore temp_Sempaphore; if(bucket1){ @@ -37,7 +38,9 @@ public void run() { * Created by Sreetama Banerjee on 4/22/2019. * reason : to allow all components of project to get appcontext */ - Context context = AnyApplication.getAppContext(); + //Context context = AnyApplication.getAppContext(); + Context context = sharedInstance.mContext; + /** * Created by Sreetama Banerjee on 4/22/2019. @@ -50,22 +53,23 @@ public void run() { * Created by Sreetama Banerjee on 4/22/2019. * reason : creating instance of TouchData entity */// - TouchData touchMetrics = new TouchData(); /** * Created by Sreetama Banerjee on 4/22/2019. * reason : creating instance of TouchData entity array */// - TouchData[] touchMetricsList=new TouchData[temp.length]; + //TouchData[] touchMetricsList=new TouchData[temp.length]; /** * Created by Sreetama Banerjee on 4/22/2019. * reason : implementation of pushing single rows into DB */ + TouchData touchMetrics; for(int i=0; i Date: Wed, 24 Apr 2019 02:38:16 -0500 Subject: [PATCH 012/113] Biaffect DataBase models and DAO --- .../BiAffect/TouchDataWorker.java | 19 +++--- .../BiAffectDB/BiAffectDBManager.java | 31 ++++++++++ .../BiAffectDB_roomDAO/Accelerometer_DAO.java | 16 +++++ .../BiAffectDB_roomDAO/Device_DAO.java | 23 ++++++++ .../BiAffectDB_roomDAO/KeyData_DAO.java | 22 +++++++ .../BiAffectDB_roomDAO/Session_DAO.java | 18 ++++++ .../BiAffectDB_roomDAO/Touch_DAO.java | 12 ++-- .../AccelerometerData.java | 32 ++++++++++ .../BiAffectDB_roomModel/DeviceData.java | 34 +++++++++++ .../BiAffectDB_roomModel/KeyData.java | 42 ++++++++++++++ .../BiAffectDB_roomModel/SessionData.java | 23 ++++++++ .../BiAffectDB_roomModel/TouchData.java | 58 ++++++++++--------- .../BiAffectDB_roomModel/KeyData.java | 22 ------- .../anysoftkeyboard/BiAffectDatabase.java | 31 ---------- 14 files changed, 287 insertions(+), 96 deletions(-) create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Accelerometer_DAO.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Device_DAO.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/KeyData_DAO.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Session_DAO.java rename app/src/main/java/com/menny/android/anysoftkeyboard/{ => BiAffectDB}/BiAffectDB_roomDAO/Touch_DAO.java (50%) create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/AccelerometerData.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/DeviceData.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/KeyData.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/SessionData.java rename app/src/main/java/com/menny/android/anysoftkeyboard/{ => BiAffectDB}/BiAffectDB_roomModel/TouchData.java (60%) delete mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB_roomModel/KeyData.java delete mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDatabase.java diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java index d21cd07f8a..d603d0a6c9 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java @@ -1,12 +1,10 @@ package com.menny.android.anysoftkeyboard.BiAffect; -import android.app.Application; import android.content.Context; import android.util.Log; -import com.menny.android.anysoftkeyboard.AnyApplication; -import com.menny.android.anysoftkeyboard.BiAffectDB_roomModel.TouchData; -import com.menny.android.anysoftkeyboard.BiAffectDatabase; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDBManager; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.TouchData; import java.util.concurrent.Semaphore; @@ -46,7 +44,7 @@ public void run() { * Created by Sreetama Banerjee on 4/22/2019. * reason : getting instance of database class */ - BiAffectDatabase INSTANCE=BiAffectDatabase.getDatabase(context); + BiAffectDBManager INSTANCE= BiAffectDBManager.getDatabase(context); //database entity instances /** @@ -79,10 +77,11 @@ public void run() { touchMetrics.y_cord = temp[i].y_cord; touchMetrics.major_axis = temp[i].major_axis; touchMetrics.minor_axis = temp[i].minor_axis; - touchMetrics.accelerometer_x = temp[i].accelerometer_x; - touchMetrics.accelerometer_y = temp[i].accelerometer_y; - touchMetrics.accelerometer_z = temp[i].accelerometer_z; - touchMetrics.touches = temp[i].touches; + //accelerometer values stores seaparately +// touchMetrics.accelerometer_x = temp[i].accelerometer_x; +// touchMetrics.accelerometer_y = temp[i].accelerometer_y; +// touchMetrics.accelerometer_z = temp[i].accelerometer_z; +// touchMetrics.touches = temp[i].touches; /** * Created by Sreetama Banerjee on 4/22/2019. @@ -142,7 +141,7 @@ public void run() { Log.i("CS_BiAffect","-----------BUFFER EMPTY END-------------"+this.bucket1); // just to check if data is being stored in db - //Log.i("CS_BiAffect_DB_data",BiAffectDatabase.getDatabase(AnyApplication.getAppContext()).TouchDao().fetchTouchDataAll().toString()); + //Log.i("CS_BiAffect_DB_data",BiAffectDBManager.getDatabase(AnyApplication.getAppContext()).TouchDao().fetchTouchDataAll().toString()); } } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java new file mode 100644 index 0000000000..8833d56883 --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java @@ -0,0 +1,31 @@ +package com.menny.android.anysoftkeyboard.BiAffectDB; + +import android.arch.persistence.room.Database; +import android.arch.persistence.room.Room; +import android.arch.persistence.room.RoomDatabase; +import android.content.Context; + +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomDAO.Touch_DAO; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.KeyData; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.TouchData; + +@Database(entities = {TouchData.class, KeyData.class}, version = 1,exportSchema = false) +public abstract class BiAffectDBManager extends RoomDatabase { + + public abstract Touch_DAO TouchDao(); + + private static volatile BiAffectDBManager INSTANCE; + + public static BiAffectDBManager getDatabase(final Context context) { + if (INSTANCE == null) { + synchronized (BiAffectDBManager.class) { + if (INSTANCE == null) { + INSTANCE = Room.databaseBuilder(context.getApplicationContext(), + BiAffectDBManager.class, "BiAffect_database") + .build(); + } + } + } + return INSTANCE; + } +} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Accelerometer_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Accelerometer_DAO.java new file mode 100644 index 0000000000..4d9b77c368 --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Accelerometer_DAO.java @@ -0,0 +1,16 @@ +package com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomDAO; + +import android.arch.persistence.room.Dao; +import android.arch.persistence.room.Insert; + +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.AccelerometerData; + + +@Dao +public interface Accelerometer_DAO { + + @Insert + void insertOnlySingleAccelerometerEntry (AccelerometerData single_entry); + @Insert + void insertMultipleAccelerometerEntry (AccelerometerData[] DataList); +} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Device_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Device_DAO.java new file mode 100644 index 0000000000..88012feff4 --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Device_DAO.java @@ -0,0 +1,23 @@ +package com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomDAO; + +import android.arch.persistence.room.Dao; +import android.arch.persistence.room.Insert; +import android.arch.persistence.room.Query; +import android.arch.persistence.room.Update; + +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.DeviceData; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.TouchData; + +@Dao +public interface Device_DAO { + @Insert + void insertDeviceData (DeviceData single_entry); + + //one thing need to check - read that room throws error if no value returned. Workaround for this. + + //will be required to fetch records to coords check that duplicate data is not inserted. insert only if no records returned. + // as assuming that capturing only 1 device's entries - wrapper will be provided by Sage no need of a where clause. Any entry in table means device data stored. + @Query("SELECT id FROM DeviceData ") + public int fetchDeviceId(); + +} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/KeyData_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/KeyData_DAO.java new file mode 100644 index 0000000000..cf9e4ef26c --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/KeyData_DAO.java @@ -0,0 +1,22 @@ +package com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomDAO; + +import android.arch.persistence.room.Dao; +import android.arch.persistence.room.Insert; +import android.arch.persistence.room.Update; + +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.KeyData; + +@Dao +public interface KeyData_DAO { + + @Insert + void insertOnlySingleKeyMetrics (KeyData single_entry); + @Insert + void insertMultipleKeyMetrics (KeyData[] keyDataList); + + //for radius one way of adding to DB will be update at end of session. Creating the stub as placeholder for now + //not required but kept return type int so that Roomreturns number of rows edited. This will help in debugging + @Update + public int updateRadiusofTouch(KeyData data); + +} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Session_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Session_DAO.java new file mode 100644 index 0000000000..f1ccf3c3eb --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Session_DAO.java @@ -0,0 +1,18 @@ +package com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomDAO; + +import android.arch.persistence.room.Dao; +import android.arch.persistence.room.Insert; +import android.arch.persistence.room.Update; + +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.SessionData; + +@Dao +public interface Session_DAO { + + //while implementing we will have to add starttime as end time as end time and later update it + @Insert + void insertSessionStartTime (SessionData single_entry); + + @Update + void updateSessionEndTime(SessionData data); +} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB_roomDAO/Touch_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Touch_DAO.java similarity index 50% rename from app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB_roomDAO/Touch_DAO.java rename to app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Touch_DAO.java index 24e8119fd8..01d2c36cfe 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB_roomDAO/Touch_DAO.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Touch_DAO.java @@ -1,10 +1,10 @@ -package com.menny.android.anysoftkeyboard.BiAffectDB_roomDAO; +package com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomDAO; import android.arch.persistence.room.Dao; import android.arch.persistence.room.Insert; import android.arch.persistence.room.Query; -import com.menny.android.anysoftkeyboard.BiAffectDB_roomModel.TouchData; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.TouchData; /** * Created by Sreetama Banerjee on 4/22/2019. * reason : room DAO @@ -18,10 +18,8 @@ public interface Touch_DAO { @Insert void insertMultipleTouchMetrics (TouchData[] touchDataList); - // to test if data is being stored in DB - @Query("SELECT * FROM TouchData") - TouchData fetchTouchDataAll (); - - + //will be required to fetch X Y coords during Key data update + @Query("SELECT * FROM TouchTypeData WHERE KeyId= :keyId"+" AND Key_Event_Action= :motioneventtype") + public TouchData[] fetchTouchData(long keyId,int motioneventtype); } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/AccelerometerData.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/AccelerometerData.java new file mode 100644 index 0000000000..f879f798b3 --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/AccelerometerData.java @@ -0,0 +1,32 @@ +package com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel; + +import android.arch.persistence.room.ColumnInfo; +import android.arch.persistence.room.Entity; +import android.arch.persistence.room.PrimaryKey; +import android.support.annotation.NonNull; + +@Entity +public class AccelerometerData { + + @PrimaryKey(autoGenerate = true) + @NonNull + @ColumnInfo(name = "id") + public long id; + + @NonNull + @ColumnInfo(name = "Key_press_time") + public long eventTime; + + @NonNull + @ColumnInfo(name = "accelerometer_x") + public float accelerometer_x; + + @NonNull + @ColumnInfo(name = "accelerometer_y") + public float accelerometer_y; + + @NonNull + @ColumnInfo(name = "accelerometer_z") + public float accelerometer_z; + +} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/DeviceData.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/DeviceData.java new file mode 100644 index 0000000000..c40b66cc71 --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/DeviceData.java @@ -0,0 +1,34 @@ +package com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel; + + +import android.arch.persistence.room.ColumnInfo; +import android.arch.persistence.room.Entity; +import android.arch.persistence.room.PrimaryKey; +import android.support.annotation.NonNull; + +@Entity +public class DeviceData { + + @PrimaryKey(autoGenerate = true) + @NonNull + @ColumnInfo(name = "id") + public long id; + + @NonNull + @ColumnInfo(name = "Pixel_Density") + public float density; + + @NonNull + @ColumnInfo(name = "Screen_Size") + public float size; + + @NonNull + @ColumnInfo(name = "Phone_model") + public String modelname; + + + + + +} + diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/KeyData.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/KeyData.java new file mode 100644 index 0000000000..ed69af0632 --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/KeyData.java @@ -0,0 +1,42 @@ +package com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel; + +import android.arch.persistence.room.ColumnInfo; +import android.arch.persistence.room.Entity; +import android.arch.persistence.room.PrimaryKey; +import android.support.annotation.NonNull; + +@Entity(tableName = "KeyTypeData") +public class KeyData +{ + @PrimaryKey + @NonNull + @ColumnInfo(name = "Key_Id") + public long eventDownTime; + + @NonNull + @ColumnInfo(name = "Key_Type") + public long keyType; + + @ColumnInfo(name = "radius%_of_key_downp_ress") + public float radius_percent; + + @NonNull + @ColumnInfo(name = "Key_Center_X") + public float Key_X; + + @NonNull + @ColumnInfo(name = "Key_Center_Y") + public float Key_Y; + + @NonNull + @ColumnInfo(name = "Key_Width") + public float Key_width; + + @NonNull + @ColumnInfo(name = "Key_Height") + public float Key_height; + + // we need to capture time of key up as well cause they need duration of a key press. Need to discuss with Viru. +} + + diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/SessionData.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/SessionData.java new file mode 100644 index 0000000000..4d25ed85ab --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/SessionData.java @@ -0,0 +1,23 @@ +package com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel; + +import android.arch.persistence.room.ColumnInfo; +import android.arch.persistence.room.Entity; +import android.arch.persistence.room.PrimaryKey; +import android.support.annotation.NonNull; + +@Entity +public class SessionData { + + @PrimaryKey(autoGenerate = true) + @NonNull + @ColumnInfo(name = "id") + public long id; + + @NonNull + @ColumnInfo(name = "Session_start_time") + public long startTime; + + @NonNull + @ColumnInfo(name = "Session_end_time") + public long endTime; +} \ No newline at end of file diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB_roomModel/TouchData.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/TouchData.java similarity index 60% rename from app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB_roomModel/TouchData.java rename to app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/TouchData.java index a95ef222bc..c42a63ec86 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB_roomModel/TouchData.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/TouchData.java @@ -1,9 +1,7 @@ -package com.menny.android.anysoftkeyboard.BiAffectDB_roomModel; +package com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel; import android.arch.persistence.room.ColumnInfo; import android.arch.persistence.room.Entity; -import android.arch.persistence.room.ForeignKey; -import android.arch.persistence.room.Index; import android.arch.persistence.room.PrimaryKey; import android.support.annotation.NonNull; @@ -13,7 +11,7 @@ // onDelete = ForeignKey.NO_ACTION), // indices = {@Index("KeyId"), // @Index(value = {"KeyId"})}) -@Entity() +@Entity(tableName = "TouchTypeData") public class TouchData { //Every field that's stored in the database needs to be either public or have a "getter" method. should not make primary key public but do not want to provide getter and setters for id. @@ -22,12 +20,13 @@ public class TouchData { @ColumnInfo(name = "Id") public int Id; + //keydownpress rename @NonNull @ColumnInfo(name = "KeyId") public long eventDownTime; @NonNull - @ColumnInfo(name = "Key_UP_time") + @ColumnInfo(name = "Key_press_time") public long eventTime; @NonNull @@ -54,27 +53,34 @@ public class TouchData { @ColumnInfo(name = "Key_toucharea_Minor_axis") public float minor_axis; - @NonNull - @ColumnInfo(name = "accelerometer_x") - public float accelerometer_x; - - @NonNull - @ColumnInfo(name = "accelerometer_y") - public float accelerometer_y; - - @NonNull - @ColumnInfo(name = "accelerometer_z") - public float accelerometer_z; - - @NonNull - @ColumnInfo(name = "Number_of_touches") - public int touches; - - // no setter method or initialising in constructor as primary key is autogenarated - public TouchData() { - } - - // public int getId() { return Id; } +/* +* Commenting because in the new design, accelerometer data will sit in an independent table +* */ +// @NonNull +// @ColumnInfo(name = "accelerometer_x") +// public float accelerometer_x; +// +// @NonNull +// @ColumnInfo(name = "accelerometer_y") +// public float accelerometer_y; +// +// @NonNull +// @ColumnInfo(name = "accelerometer_z") +// public float accelerometer_z; +// +// // needs to be taken out +// @NonNull +// @ColumnInfo(name = "Number_of_touches") +// public int touches; + + public TouchData() { + // default constructor + // no setter method or initialising in constructor required as primary key is autogenarated + + } + + // to get the PK value + public int getId() { return Id; } } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB_roomModel/KeyData.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB_roomModel/KeyData.java deleted file mode 100644 index 2fda5f41af..0000000000 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB_roomModel/KeyData.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.menny.android.anysoftkeyboard.BiAffectDB_roomModel; - -import android.arch.persistence.room.ColumnInfo; -import android.arch.persistence.room.Entity; -import android.arch.persistence.room.PrimaryKey; -import android.support.annotation.NonNull; - -@Entity -public class KeyData -{ - @PrimaryKey - @NonNull - @ColumnInfo(name = "Key_Id") - public long eventDownTime; - - @NonNull - @ColumnInfo(name = "Key_Type") - public long keyType; - -} - - diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDatabase.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDatabase.java deleted file mode 100644 index 9eab53ad15..0000000000 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDatabase.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.menny.android.anysoftkeyboard; - -import android.arch.persistence.room.Database; -import android.arch.persistence.room.Room; -import android.arch.persistence.room.RoomDatabase; -import android.content.Context; - -import com.menny.android.anysoftkeyboard.BiAffectDB_roomDAO.Touch_DAO; -import com.menny.android.anysoftkeyboard.BiAffectDB_roomModel.KeyData; -import com.menny.android.anysoftkeyboard.BiAffectDB_roomModel.TouchData; - -@Database(entities = {TouchData.class, KeyData.class}, version = 1,exportSchema = false) -public abstract class BiAffectDatabase extends RoomDatabase { - - public abstract Touch_DAO TouchDao(); - - private static volatile BiAffectDatabase INSTANCE; - - public static BiAffectDatabase getDatabase(final Context context) { - if (INSTANCE == null) { - synchronized (BiAffectDatabase.class) { - if (INSTANCE == null) { - INSTANCE = Room.databaseBuilder(context.getApplicationContext(), - BiAffectDatabase.class, "BiAffect_database") - .build(); - } - } - } - return INSTANCE; - } -} From 99348250a10a62a8a2e3c86360370dab082db2c2 Mon Sep 17 00:00:00 2001 From: sree Date: Thu, 25 Apr 2019 20:38:17 -0500 Subject: [PATCH 013/113] end to end for touchdata --- .../anysoftkeyboard/BiAffect/BiAManager.java | 23 ++++++++- .../BiAffect/TouchDataWorker.java | 18 +++---- .../BiAffectDB/BiAffectDB.java | 31 ++++++++++++ .../BiAffectDB/BiAffectDBInterface.java | 15 ++++++ .../BiAffectDB/BiAffectDBManager.java | 50 ++++++++++++------- 5 files changed, 107 insertions(+), 30 deletions(-) create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBInterface.java diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java index a3a5452810..295c8ebebe 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java @@ -7,8 +7,9 @@ import android.util.Log; import com.menny.android.anysoftkeyboard.AnyApplication; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDBManager; -import java.util.Hashtable; import java.util.LinkedHashMap; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Semaphore; @@ -33,6 +34,19 @@ public class BiAManager implements BiADataProcessorInterface.TouchDataProcessorI float current_accelerometer_y; float current_accelerometer_z; + /** + * Created by Sreetama Banerjee on 4/22/2019. + * reason : to allow all components of project to get appcontext + */ + Context contextdb = AnyApplication.getAppContext(); + + /** + * Created by Sreetama Banerjee on 4/22/2019. + * reason : getting instance of database manager class + */ + private static BiAffectDBManager DBMngrINSTANCE; + + @Override public void onSensorChanged(SensorEvent event) { if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){ @@ -83,6 +97,7 @@ private BiAManager(Context context){ //This should be done when the session starts and undone when the session ends mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 10); + DBMngrINSTANCE=BiAffectDBManager.getInstance(); } public static synchronized BiAManager getInstance(Context mContext) @@ -185,4 +200,10 @@ public boolean addMasterEntry(long eventDownTime, long eventTime, int eventActio return false; } + + //to get DB Manager instance + public static BiAffectDBManager getDBMngrInstance() + { + return DBMngrINSTANCE; + } } \ No newline at end of file diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java index d603d0a6c9..1c73f94b1a 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java @@ -3,6 +3,7 @@ import android.content.Context; import android.util.Log; +import com.menny.android.anysoftkeyboard.AnyApplication; import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDBManager; import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.TouchData; @@ -36,15 +37,15 @@ public void run() { * Created by Sreetama Banerjee on 4/22/2019. * reason : to allow all components of project to get appcontext */ - //Context context = AnyApplication.getAppContext(); - Context context = sharedInstance.mContext; + Context context = AnyApplication.getAppContext(); + //Context context = sharedInstance.mContext; /** * Created by Sreetama Banerjee on 4/22/2019. - * reason : getting instance of database class + * reason : getting instance of database manager class */ - BiAffectDBManager INSTANCE= BiAffectDBManager.getDatabase(context); + BiAffectDBManager INSTANCE= BiAManager.getDBMngrInstance(); //database entity instances /** @@ -87,10 +88,7 @@ public void run() { * Created by Sreetama Banerjee on 4/22/2019. * reason : getting DAO instance and calling insert query */ - INSTANCE.TouchDao().insertOnlySingleTouchMetrics(touchMetrics); - Log.i("CS_BiAffect","TempData"+touchMetrics.toString()); - - Log.i("CS_BiAffect","TouchData"+touchMetrics.toString()); + INSTANCE.insertTouchTypeEntry(touchMetrics); temp[i].markUnused(); } @@ -131,7 +129,7 @@ public void run() { // * Created by Sreetama Banerjee on 4/22/2019. // * reason : getting DAO instance and calling insert query (multiple batch insert) // */ -// INSTANCE.TouchDao().insertMultipleTouchMetrics(touchMetricsList); +// INSTANCE.insertTouchTypeEntryBatch(touchMetricsList); }catch (InterruptedException e){ @@ -141,7 +139,7 @@ public void run() { Log.i("CS_BiAffect","-----------BUFFER EMPTY END-------------"+this.bucket1); // just to check if data is being stored in db - //Log.i("CS_BiAffect_DB_data",BiAffectDBManager.getDatabase(AnyApplication.getAppContext()).TouchDao().fetchTouchDataAll().toString()); + //Log.i("CS_BiAffect_DB_data",BiAffectDB.getDatabase(AnyApplication.getAppContext()).TouchDao().fetchTouchDataAll().toString()); } } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB.java new file mode 100644 index 0000000000..1240c314e4 --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB.java @@ -0,0 +1,31 @@ +package com.menny.android.anysoftkeyboard.BiAffectDB; + +import android.arch.persistence.room.Database; +import android.arch.persistence.room.Room; +import android.arch.persistence.room.RoomDatabase; +import android.content.Context; + +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomDAO.Touch_DAO; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.KeyData; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.TouchData; + +@Database(entities = {TouchData.class, KeyData.class}, version = 1,exportSchema = false) +public abstract class BiAffectDB extends RoomDatabase { + + public abstract Touch_DAO TouchDao(); + + private static volatile BiAffectDB INSTANCE; + + public static BiAffectDB getDatabase(final Context context) { + if (INSTANCE == null) { + synchronized (BiAffectDB.class) { + if (INSTANCE == null) { + INSTANCE = Room.databaseBuilder(context.getApplicationContext(), + BiAffectDB.class, "BiAffect_database") + .build(); + } + } + } + return INSTANCE; + } +} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBInterface.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBInterface.java new file mode 100644 index 0000000000..80da2d35e3 --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBInterface.java @@ -0,0 +1,15 @@ +package com.menny.android.anysoftkeyboard.BiAffectDB; + +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.TouchData; + +public interface BiAffectDBInterface { + interface TouchDataInterface { + //All the calls to DAO for Touch entity will be processed. + + void insertTouchTypeEntry(TouchData single_entry); + void insertTouchTypeEntryBatch(TouchData[] multi_entry); + TouchData[] fetchTouchDataRows(long keyId,int motioneventtype); + + } + +} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java index 8833d56883..b9151530d2 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java @@ -1,31 +1,43 @@ package com.menny.android.anysoftkeyboard.BiAffectDB; -import android.arch.persistence.room.Database; -import android.arch.persistence.room.Room; -import android.arch.persistence.room.RoomDatabase; import android.content.Context; -import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomDAO.Touch_DAO; -import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.KeyData; +import com.menny.android.anysoftkeyboard.AnyApplication; import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.TouchData; -@Database(entities = {TouchData.class, KeyData.class}, version = 1,exportSchema = false) -public abstract class BiAffectDBManager extends RoomDatabase { +public class BiAffectDBManager implements BiAffectDBInterface.TouchDataInterface{ + /** + * Created by Sreetama Banerjee on 4/22/2019. + * reason : to allow all components of project to get appcontext + */ + Context mcontext = AnyApplication.getAppContext(); - public abstract Touch_DAO TouchDao(); + private BiAffectDB DBINSTANCE; - private static volatile BiAffectDBManager INSTANCE; + private static BiAffectDBManager MngrInstance = null; - public static BiAffectDBManager getDatabase(final Context context) { - if (INSTANCE == null) { - synchronized (BiAffectDBManager.class) { - if (INSTANCE == null) { - INSTANCE = Room.databaseBuilder(context.getApplicationContext(), - BiAffectDBManager.class, "BiAffect_database") - .build(); - } - } + public static synchronized BiAffectDBManager getInstance() { + if (MngrInstance == null) + MngrInstance = new BiAffectDBManager(); + return MngrInstance; } - return INSTANCE; + + //can put static if need be + private BiAffectDBManager() { + DBINSTANCE=BiAffectDB.getDatabase(mcontext); + + } + + @Override + public void insertTouchTypeEntry(TouchData single_entry){ + DBINSTANCE.TouchDao().insertOnlySingleTouchMetrics(single_entry); + } + @Override + public void insertTouchTypeEntryBatch(TouchData[] multi_entry){ + DBINSTANCE.TouchDao().insertMultipleTouchMetrics(multi_entry); + } + @Override + public TouchData[] fetchTouchDataRows(long keyId,int motioneventtype){ + return DBINSTANCE.TouchDao().fetchTouchData(keyId,motioneventtype); } } From 5414945e4ee053808c1e76d7c93a7fa02e8af399 Mon Sep 17 00:00:00 2001 From: sree Date: Thu, 25 Apr 2019 23:31:31 -0500 Subject: [PATCH 014/113] . --- .../android/anysoftkeyboard/BiAffect/TouchDataWorker.java | 6 ------ .../anysoftkeyboard/BiAffectDB/BiAffectDBInterface.java | 8 ++++++++ .../BiAffectDB/BiAffectDB_roomModel/SessionData.java | 5 +---- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java index 1c73f94b1a..e80d1e04b7 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java @@ -33,12 +33,6 @@ public void run() { try { temp_Sempaphore.acquire(); Log.i("CS_BiAffect","-----------BUFFER EMPTY START-------------"+this.bucket1); - /** - * Created by Sreetama Banerjee on 4/22/2019. - * reason : to allow all components of project to get appcontext - */ - Context context = AnyApplication.getAppContext(); - //Context context = sharedInstance.mContext; /** diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBInterface.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBInterface.java index 80da2d35e3..7b8b8c591b 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBInterface.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBInterface.java @@ -1,5 +1,7 @@ package com.menny.android.anysoftkeyboard.BiAffectDB; + +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.SessionData; import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.TouchData; public interface BiAffectDBInterface { @@ -12,4 +14,10 @@ interface TouchDataInterface { } + interface SessionDataInterface { + + void insertSessionStartTime (SessionData single_entry); + void updateSessionEndTime(SessionData data); + } + } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/SessionData.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/SessionData.java index 4d25ed85ab..cc4f4f9889 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/SessionData.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/SessionData.java @@ -8,11 +8,8 @@ @Entity public class SessionData { - @PrimaryKey(autoGenerate = true) - @NonNull - @ColumnInfo(name = "id") public long id; - + @PrimaryKey @NonNull @ColumnInfo(name = "Session_start_time") public long startTime; From f7a891d6c2df54cc74c32a248e145874afa7c9eb Mon Sep 17 00:00:00 2001 From: sree Date: Thu, 25 Apr 2019 23:52:42 -0500 Subject: [PATCH 015/113] DB MAnager and interface complete set of APIs --- .../BiAffectDB/BiAffectDB.java | 10 +++- .../BiAffectDB/BiAffectDBInterface.java | 28 ++++++++++ .../BiAffectDB/BiAffectDBManager.java | 56 +++++++++++++++++-- 3 files changed, 89 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB.java index 1240c314e4..8637af5be5 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB.java @@ -5,6 +5,10 @@ import android.arch.persistence.room.RoomDatabase; import android.content.Context; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomDAO.Accelerometer_DAO; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomDAO.Device_DAO; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomDAO.KeyData_DAO; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomDAO.Session_DAO; import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomDAO.Touch_DAO; import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.KeyData; import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.TouchData; @@ -12,7 +16,11 @@ @Database(entities = {TouchData.class, KeyData.class}, version = 1,exportSchema = false) public abstract class BiAffectDB extends RoomDatabase { - public abstract Touch_DAO TouchDao(); + public abstract Touch_DAO TouchDataDao(); + public abstract Session_DAO SessionDataDao(); + public abstract KeyData_DAO KeyDataDAO(); + public abstract Accelerometer_DAO AccelDataDAO(); + public abstract Device_DAO DeviceDataDAO(); private static volatile BiAffectDB INSTANCE; diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBInterface.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBInterface.java index 7b8b8c591b..4a34c4978e 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBInterface.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBInterface.java @@ -1,6 +1,9 @@ package com.menny.android.anysoftkeyboard.BiAffectDB; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.AccelerometerData; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.DeviceData; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.KeyData; import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.SessionData; import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.TouchData; @@ -20,4 +23,29 @@ interface SessionDataInterface { void updateSessionEndTime(SessionData data); } + interface KeyTypeDataInterface { + void insertOnlySingleKeyMetrics (KeyData single_entry); + + void insertMultipleKeyMetrics (KeyData[] keyDataList); + + //for radius one way of adding to DB will be update at end of session. Also time of key up. Creating the stub as placeholder for now + //not required but kept return type int so that Roomreturns number of rows edited. This will help in debugging + + int updateRadiusofTouch(KeyData data); + + } + + interface DeviceDataInterface { + void insertDeviceData (DeviceData single_entry); + + int fetchDeviceId(); + + } + + interface AccelerometerDataInterface { + void insertOnlySingleAccelerometerEntry (AccelerometerData single_entry); + + void insertMultipleAccelerometerEntry (AccelerometerData[] DataList); + } + } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java index b9151530d2..732885daa1 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java @@ -3,9 +3,13 @@ import android.content.Context; import com.menny.android.anysoftkeyboard.AnyApplication; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.AccelerometerData; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.DeviceData; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.KeyData; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.SessionData; import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.TouchData; -public class BiAffectDBManager implements BiAffectDBInterface.TouchDataInterface{ +public class BiAffectDBManager implements BiAffectDBInterface.TouchDataInterface, BiAffectDBInterface.SessionDataInterface, BiAffectDBInterface.KeyTypeDataInterface,BiAffectDBInterface.DeviceDataInterface, BiAffectDBInterface.AccelerometerDataInterface{ /** * Created by Sreetama Banerjee on 4/22/2019. * reason : to allow all components of project to get appcontext @@ -30,14 +34,58 @@ private BiAffectDBManager() { @Override public void insertTouchTypeEntry(TouchData single_entry){ - DBINSTANCE.TouchDao().insertOnlySingleTouchMetrics(single_entry); + DBINSTANCE.TouchDataDao().insertOnlySingleTouchMetrics(single_entry); } @Override public void insertTouchTypeEntryBatch(TouchData[] multi_entry){ - DBINSTANCE.TouchDao().insertMultipleTouchMetrics(multi_entry); + DBINSTANCE.TouchDataDao().insertMultipleTouchMetrics(multi_entry); } @Override public TouchData[] fetchTouchDataRows(long keyId,int motioneventtype){ - return DBINSTANCE.TouchDao().fetchTouchData(keyId,motioneventtype); + return DBINSTANCE.TouchDataDao().fetchTouchData(keyId,motioneventtype); + } + @Override + public void insertSessionStartTime (SessionData single_entry){ + DBINSTANCE.SessionDataDao().insertSessionStartTime(single_entry); + } + + @Override + public void updateSessionEndTime(SessionData data){ + DBINSTANCE.SessionDataDao().insertSessionStartTime(data); + } + + @Override + public void insertOnlySingleKeyMetrics (KeyData single_entry){ + DBINSTANCE.KeyDataDAO().insertOnlySingleKeyMetrics(single_entry); + } + + @Override + public void insertMultipleKeyMetrics (KeyData[] keyDataList){ + DBINSTANCE.KeyDataDAO().insertMultipleKeyMetrics(keyDataList); + } + + @Override + public int updateRadiusofTouch(KeyData data){ + return DBINSTANCE.KeyDataDAO().updateRadiusofTouch(data); + } + + @Override + public void insertDeviceData (DeviceData single_entry){ + DBINSTANCE.DeviceDataDAO().insertDeviceData(single_entry); + } + + @Override + public int fetchDeviceId(){ + return DBINSTANCE.DeviceDataDAO().fetchDeviceId(); + } + + @Override + public void insertOnlySingleAccelerometerEntry (AccelerometerData single_entry){ + DBINSTANCE.AccelDataDAO().insertOnlySingleAccelerometerEntry(single_entry); + } + + @Override + public void insertMultipleAccelerometerEntry (AccelerometerData[] DataList){ + DBINSTANCE.AccelDataDAO().insertMultipleAccelerometerEntry(DataList); } } From 2ab9521af39e8fa0fc0e321698f90dc26f88109c Mon Sep 17 00:00:00 2001 From: sree Date: Fri, 26 Apr 2019 00:23:37 -0500 Subject: [PATCH 016/113] session function added to biamanager --- .../anysoftkeyboard/BiAffect/BiAManager.java | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java index 295c8ebebe..fe5603c149 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java @@ -9,6 +9,7 @@ import com.menny.android.anysoftkeyboard.AnyApplication; import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB; import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDBManager; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.SessionData; import java.util.LinkedHashMap; import java.util.concurrent.ArrayBlockingQueue; @@ -34,6 +35,8 @@ public class BiAManager implements BiADataProcessorInterface.TouchDataProcessorI float current_accelerometer_y; float current_accelerometer_z; + + // DB related variables /** * Created by Sreetama Banerjee on 4/22/2019. * reason : to allow all components of project to get appcontext @@ -45,7 +48,7 @@ public class BiAManager implements BiADataProcessorInterface.TouchDataProcessorI * reason : getting instance of database manager class */ private static BiAffectDBManager DBMngrINSTANCE; - + SessionData sessdata; @Override public void onSensorChanged(SensorEvent event) { @@ -120,15 +123,25 @@ public boolean recordKeyPressForce(long eventDownTime, double pressure, int acti } //Session specific calls - public boolean startSession(){ - //Entry into session table for start sesison - //Initialise db object + public boolean startSession(long sessionstarttime){ + /*Entry into session table for start sesison + creating Session object and adding values + initially adding end time= start time as end time is non null. will be later updated*/ + + sessdata.startTime=sessionstarttime; + sessdata.endTime=sessionstarttime; + DBMngrINSTANCE.insertSessionStartTime(sessdata); + //Keep the starttime of the cuurent session in a local variable so that it can be used in endsession query + return true; } - public boolean endSession(){ + public boolean endSession(long sessionendtime){ //Entry into session table, for end session time + sessdata.endTime=sessionendtime; + DBMngrINSTANCE.updateSessionEndTime(sessdata); + //Check for both the buffers if there are any used objects in the buffer, if yes, put them into db return true; } From 5f20e01f4b2519b9579aaf80cb19bdd75964725d Mon Sep 17 00:00:00 2001 From: Vinay Manchundiya Date: Fri, 26 Apr 2019 14:14:03 -0500 Subject: [PATCH 017/113] Safe --- .../BiAffect/BiADataProcessorInterface.java | 6 ++ .../anysoftkeyboard/BiAffect/BiAManager.java | 88 ++++++++++++++++++- .../anysoftkeyboard/BiAffect/KeyDataPOJO.java | 47 ++++++++++ .../BiAffect/KeyDataWorker.java | 61 +++++++++++++ 4 files changed, 201 insertions(+), 1 deletion(-) create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/KeyDataPOJO.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/KeyDataWorker.java diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiADataProcessorInterface.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiADataProcessorInterface.java index 65b91eab9e..81664c7ec4 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiADataProcessorInterface.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiADataProcessorInterface.java @@ -29,6 +29,12 @@ interface KeyDataProcessorInterface { //is that there will not be an action_up in the database for the corresponding longpress key, which i have decided for now that i will leave that, //on the discretion of the person performing analysis of the data on how to treat that entry + //One api will be to add a call to record the keyDownTime and the associated key code along with all values + //Second will be to update uptime in the db and also other values + + boolean addKeyDataOnlyUpTime(long eventDownTime, int key_id, float keyCentre_X, float keyCentre_Y, float keyWidth, float keyHeight); + boolean updateUpTimeFor(long eventDownTime, long eventUpTime); + } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java index fe5603c149..fca9466469 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java @@ -9,13 +9,14 @@ import com.menny.android.anysoftkeyboard.AnyApplication; import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB; import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDBManager; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.KeyData; import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.SessionData; import java.util.LinkedHashMap; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Semaphore; -public class BiAManager implements BiADataProcessorInterface.TouchDataProcessorInterface, BiADataProcessorInterface, SensorEventListener { +public class BiAManager implements BiADataProcessorInterface.TouchDataProcessorInterface, BiADataProcessorInterface, SensorEventListener, BiADataProcessorInterface.KeyDataProcessorInterface { private BiAWorker1 myCurrentWorker1; @@ -34,6 +35,14 @@ public class BiAManager implements BiADataProcessorInterface.TouchDataProcessorI float current_accelerometer_x; float current_accelerometer_y; float current_accelerometer_z; + //Key Data specific data holders + static final int KEY_BUFFER_SIZE = 20; + KeyDataPOJO[] k1; + KeyDataPOJO[] k2; + boolean bucketk1; + int currentIndexKey; + Semaphore k1_Semaphore = new Semaphore(1); + Semaphore k2_Semaphore = new Semaphore(1); // DB related variables @@ -93,6 +102,15 @@ private BiAManager(Context context){ this.t2[i] = new TouchDataPOJO(); } + //Initialising keyDataBuffers + this.k1 = new KeyDataPOJO[KEY_BUFFER_SIZE]; + this.k2 = new KeyDataPOJO[KEY_BUFFER_SIZE]; + this.bucketk1=true; + for (int i=0; i"+currentIndexKey); + temp[currentIndexKey].printYourself(); + Log.i("CS_BiAffect_K","---------------------------------"); + + }catch (InterruptedException e){ + Log.i("CS_BiAffect_K", "failed to acquire lock on semaphore"); + }finally { + temp_Semaphore.release(); + if(temp[currentIndexKey].used){ + if(currentIndexKey == KEY_BUFFER_SIZE-1){ + //Time to switch the key buffer + Log.i("CS_BiAffect_K","-----------KEY BUFFER CHANGE-------------"+this.bucketk1); + //We can kickoff a worker thread from here to take all the pojos and insert it into the database + //We will pass the number of the last buffer being used and then expect the thread to infer from that which one + //needs to be emptied + Thread t = new Thread(new KeyDataWorker(this.bucketk1)); + t.start(); + //Time to change the buffer and put all the things in the second from next + this.currentIndexKey = 0; + if(this.bucketk1){ + bucketk1=false; + }else{ + bucketk1=true; + } + }else{ + currentIndexKey++; + } + } + + } + //insert data into unsed pojo + //unlock semaphore + //deduce if it needs to kickoff another thread + //leave + return false; + } + + @Override + public boolean updateUpTimeFor(long eventDownTime, long eventUpTime) { + return false; + } + //to get DB Manager instance public static BiAffectDBManager getDBMngrInstance() { diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/KeyDataPOJO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/KeyDataPOJO.java new file mode 100644 index 0000000000..9b9aaffa41 --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/KeyDataPOJO.java @@ -0,0 +1,47 @@ +package com.menny.android.anysoftkeyboard.BiAffect; + +import android.util.Log; + +public class KeyDataPOJO { + + boolean used; + long eventDownTime; + long eventUpTime; + int keyId; + float keyCentre_X; + float keyCentre_Y; + float keyWidth; + float keyHeight; + + public KeyDataPOJO(){ + + } + + public boolean markUnused(){ + this.used = false; + this.eventDownTime=-1; + this.eventUpTime=-1; + this.keyId=Integer.MIN_VALUE; + this.keyCentre_X=-1; + this.keyCentre_Y=-1; + this.keyWidth=-1; + this.keyHeight=-1; + + return true; + } + + public boolean validatePOJO(){ + return (this.used && this.eventDownTime!=-1); + } + + public void printYourself(){ + Log.i("CS_BiAffect_K", "eventDownTime->"+this.eventDownTime); + Log.i("CS_BiAffect_K", "eventUpTime->"+this.eventUpTime); + Log.i("CS_BiAffect_K", "keyId->"+this.keyId); + Log.i("CS_BiAffect_K", "keyCentre_X->"+this.keyCentre_X); + Log.i("CS_BiAffect_K", "keyCentre_Y->"+this.keyCentre_Y); + Log.i("CS_BiAffect_K", "keyWidth->"+this.keyWidth); + Log.i("CS_BiAffect_K", "keyHeight->"+this.keyHeight); + } + +} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/KeyDataWorker.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/KeyDataWorker.java new file mode 100644 index 0000000000..734c71ac6e --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/KeyDataWorker.java @@ -0,0 +1,61 @@ +package com.menny.android.anysoftkeyboard.BiAffect; + +import android.util.Log; + +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDBManager; + +import java.util.concurrent.Semaphore; + +public class KeyDataWorker implements Runnable { + + boolean bucketk1; + BiAManager sharedInstance; + BiAffectDBManager dbManagerSharedInstance; + + public KeyDataWorker(boolean bucketk1){ + super(); + this.bucketk1=bucketk1; + } + + @Override + public void run() { + sharedInstance = BiAManager.getInstance(null); + dbManagerSharedInstance = BiAManager.getDBMngrInstance(); + KeyDataPOJO[] temp; + Semaphore temp_Semaphore; + if(this.bucketk1){ + //Need to lock the first bucket + temp = sharedInstance.k1; + temp_Semaphore = sharedInstance.k1_Semaphore; + }else{ + //lock second bucket + temp = sharedInstance.k2; + temp_Semaphore = sharedInstance.k2_Semaphore; + } + + //The rest will proceed as it is + try { + temp_Semaphore.acquire(); + Log.i("CS_BiAffect_K","---------KEY BUFFER EMPTY START-----------"+this.bucketk1); + for(KeyDataPOJO k:temp){ + if(k.used && k.validatePOJO()){ + //Place a call to DB manager instance to insert this into the database + // + + k.markUnused(); + + } + } + + + }catch (InterruptedException e){ + + }finally { + temp_Semaphore.release(); + Log.i("CS_BiAffect_K","---------KEY BUFFER EMPTY END-----------"+this.bucketk1); + + } + + + } +} From 175622ce0fb54cd85f16650cb295dc8e73db1588 Mon Sep 17 00:00:00 2001 From: Vinay Manchundiya Date: Fri, 26 Apr 2019 14:25:26 -0500 Subject: [PATCH 018/113] .error fixes --- .../anysoftkeyboard/BiAffect/BiAManager.java | 13 ++++--------- .../anysoftkeyboard/BiAffectDB/BiAffectDB.java | 5 ++++- .../BiAffectDB/BiAffectDBManager.java | 2 +- .../BiAffectDB/BiAffectDB_roomModel/DeviceData.java | 2 +- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java index fca9466469..5245930a5f 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java @@ -141,24 +141,19 @@ public boolean recordKeyPressForce(long eventDownTime, double pressure, int acti } //Session specific calls - public boolean startSession(long sessionstarttime){ + public boolean startSession(){ /*Entry into session table for start sesison creating Session object and adding values initially adding end time= start time as end time is non null. will be later updated*/ - - sessdata.startTime=sessionstarttime; - sessdata.endTime=sessionstarttime; - DBMngrINSTANCE.insertSessionStartTime(sessdata); - +// +// //Keep the starttime of the cuurent session in a local variable so that it can be used in endsession query return true; } - public boolean endSession(long sessionendtime){ + public boolean endSession(){ //Entry into session table, for end session time - sessdata.endTime=sessionendtime; - DBMngrINSTANCE.updateSessionEndTime(sessdata); //Check for both the buffers if there are any used objects in the buffer, if yes, put them into db return true; diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB.java index 8637af5be5..8104897cce 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB.java @@ -10,10 +10,13 @@ import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomDAO.KeyData_DAO; import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomDAO.Session_DAO; import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomDAO.Touch_DAO; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.AccelerometerData; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.DeviceData; import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.KeyData; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.SessionData; import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.TouchData; -@Database(entities = {TouchData.class, KeyData.class}, version = 1,exportSchema = false) +@Database(entities = {TouchData.class, KeyData.class, SessionData.class, AccelerometerData.class, DeviceData.class}, version = 1,exportSchema = false) public abstract class BiAffectDB extends RoomDatabase { public abstract Touch_DAO TouchDataDao(); diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java index 732885daa1..91edc7814a 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java @@ -27,7 +27,7 @@ public static synchronized BiAffectDBManager getInstance() { } //can put static if need be - private BiAffectDBManager() { + private BiAffectDBManager() { DBINSTANCE=BiAffectDB.getDatabase(mcontext); } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/DeviceData.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/DeviceData.java index c40b66cc71..ea4687e284 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/DeviceData.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/DeviceData.java @@ -6,7 +6,7 @@ import android.arch.persistence.room.PrimaryKey; import android.support.annotation.NonNull; -@Entity +@Entity(tableName = "DeviceData") public class DeviceData { @PrimaryKey(autoGenerate = true) From 9065b34d80662bfaf0b3e713d61bfd17a3327213 Mon Sep 17 00:00:00 2001 From: Vinay Manchundiya Date: Fri, 26 Apr 2019 14:46:50 -0500 Subject: [PATCH 019/113] Safe --- .../anysoftkeyboard/BiAffect/BiAManager.java | 11 +-- .../BiAffect/TouchDataWorker.java | 91 +------------------ 2 files changed, 7 insertions(+), 95 deletions(-) diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java index 5245930a5f..949f04b6a8 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java @@ -88,6 +88,8 @@ static class FeatureLookupStruct{ private BiAManager(Context context){ this.mContext = context; + //This will initialise the dbManager when the constructor of BiAManager is called... + BiAffectDBManager.getInstance(); //This wont contain anything as such this.myTupleQueue = new ArrayBlockingQueue<>(10000); this.processingMap = new LinkedHashMap<>(); @@ -117,8 +119,6 @@ private BiAManager(Context context){ //This should be done when the session starts and undone when the session ends mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 10); - - DBMngrINSTANCE=BiAffectDBManager.getInstance(); } public static synchronized BiAManager getInstance(Context mContext) @@ -146,7 +146,7 @@ public boolean startSession(){ creating Session object and adding values initially adding end time= start time as end time is non null. will be later updated*/ // -// +// //Keep the starttime of the cuurent session in a local variable so that it can be used in endsession query return true; @@ -215,16 +215,13 @@ public boolean addMasterEntry(long eventDownTime, long eventTime, int eventActio }else{ bucket1=true; } - - }else{ currentIndex++; } } //Log.i("CS_BiAffect_App_context",AnyApplication.getAppContext().toString()); } - - return false; + return true; } //Key data specific calls diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java index e80d1e04b7..386beb5a3d 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java @@ -33,99 +33,14 @@ public void run() { try { temp_Sempaphore.acquire(); Log.i("CS_BiAffect","-----------BUFFER EMPTY START-------------"+this.bucket1); - - - /** - * Created by Sreetama Banerjee on 4/22/2019. - * reason : getting instance of database manager class - */ - BiAffectDBManager INSTANCE= BiAManager.getDBMngrInstance(); - - //database entity instances - /** - * Created by Sreetama Banerjee on 4/22/2019. - * reason : creating instance of TouchData entity - */// - /** - * Created by Sreetama Banerjee on 4/22/2019. - * reason : creating instance of TouchData entity array - */// - //TouchData[] touchMetricsList=new TouchData[temp.length]; - - - /** - * Created by Sreetama Banerjee on 4/22/2019. - * reason : implementation of pushing single rows into DB - */ - TouchData touchMetrics; for(int i=0; i Date: Fri, 26 Apr 2019 14:47:26 -0500 Subject: [PATCH 020/113] updated Db classes for touch --- .../BiAffectDB/BiAffectDBInterface.java | 6 ++---- .../BiAffectDB/BiAffectDBManager.java | 13 +++++++------ 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBInterface.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBInterface.java index 4a34c4978e..7ee1bd86f7 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBInterface.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBInterface.java @@ -9,10 +9,8 @@ public interface BiAffectDBInterface { interface TouchDataInterface { - //All the calls to DAO for Touch entity will be processed. - - void insertTouchTypeEntry(TouchData single_entry); - void insertTouchTypeEntryBatch(TouchData[] multi_entry); + void insertTouchTypeData(long eventDowntime,long eventTime,int eventAction,float pressure,float x, float y,float major_Axis,float minor_axis); + //void insertTouchTypeEntryBatch(TouchData[] multi_entry); TouchData[] fetchTouchDataRows(long keyId,int motioneventtype); } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java index 91edc7814a..c56b0e1bf6 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java @@ -33,13 +33,14 @@ private BiAffectDBManager() { } @Override - public void insertTouchTypeEntry(TouchData single_entry){ - DBINSTANCE.TouchDataDao().insertOnlySingleTouchMetrics(single_entry); - } - @Override - public void insertTouchTypeEntryBatch(TouchData[] multi_entry){ - DBINSTANCE.TouchDataDao().insertMultipleTouchMetrics(multi_entry); + public void insertTouchTypeData(long eventDowntime,long eventTime,int eventAction,float pressure,float x, float y,float major_Axis,float minor_axisy){ + //DBINSTANCE.TouchDataDao().insertOnlySingleTouchMetrics(single_entry); } +// @Override +// public void insertTouchTypeEntryBatch(TouchData[] multi_entry){ +// DBINSTANCE.TouchDataDao().insertMultipleTouchMetrics(multi_entry); +// } + @Override public TouchData[] fetchTouchDataRows(long keyId,int motioneventtype){ return DBINSTANCE.TouchDataDao().fetchTouchData(keyId,motioneventtype); From 979e4b100d34005c7031b744450769d8e577885e Mon Sep 17 00:00:00 2001 From: Vinay Manchundiya Date: Fri, 26 Apr 2019 14:47:41 -0500 Subject: [PATCH 021/113] safe --- .../android/anysoftkeyboard/BiAffect/TouchDataWorker.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java index 386beb5a3d..96d49e0472 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java @@ -29,7 +29,6 @@ public void run() { temp = sharedInstance.t2; temp_Sempaphore = sharedInstance.t2_Sempahore; } - try { temp_Sempaphore.acquire(); Log.i("CS_BiAffect","-----------BUFFER EMPTY START-------------"+this.bucket1); @@ -46,10 +45,6 @@ public void run() { }finally { temp_Sempaphore.release(); Log.i("CS_BiAffect","-----------BUFFER EMPTY END-------------"+this.bucket1); - - // just to check if data is being stored in db - //Log.i("CS_BiAffect_DB_data",BiAffectDB.getDatabase(AnyApplication.getAppContext()).TouchDao().fetchTouchDataAll().toString()); - } } } From 825c35f95c3114bb3b584e69fcbe12f8aaeafff7 Mon Sep 17 00:00:00 2001 From: Vinay Manchundiya Date: Fri, 26 Apr 2019 14:58:27 -0500 Subject: [PATCH 022/113] safe --- .../BiAffect/BiADataProcessorInterface.java | 5 +---- .../anysoftkeyboard/BiAffect/BiAManager.java | 20 ++----------------- .../anysoftkeyboard/BiAffect/KeyDataPOJO.java | 6 +++--- .../BiAffect/KeyDataWorker.java | 5 ++--- 4 files changed, 8 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiADataProcessorInterface.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiADataProcessorInterface.java index 81664c7ec4..a742af062a 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiADataProcessorInterface.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiADataProcessorInterface.java @@ -30,11 +30,8 @@ interface KeyDataProcessorInterface { //on the discretion of the person performing analysis of the data on how to treat that entry //One api will be to add a call to record the keyDownTime and the associated key code along with all values - //Second will be to update uptime in the db and also other values - - boolean addKeyDataOnlyUpTime(long eventDownTime, int key_id, float keyCentre_X, float keyCentre_Y, float keyWidth, float keyHeight); - boolean updateUpTimeFor(long eventDownTime, long eventUpTime); + boolean addKeyDataOnlyDownTime(long eventDownTime, int key_id, float keyCentre_X, float keyCentre_Y, float keyWidth, float keyHeight); } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java index 949f04b6a8..b9dc49d0fc 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java @@ -219,14 +219,13 @@ public boolean addMasterEntry(long eventDownTime, long eventTime, int eventActio currentIndex++; } } - //Log.i("CS_BiAffect_App_context",AnyApplication.getAppContext().toString()); } return true; } //Key data specific calls @Override - public boolean addKeyDataOnlyUpTime(long eventDownTime, int key_id, float keyCentre_X, float keyCentre_Y, float keyWidth, float keyHeight) { + public boolean addKeyDataOnlyDownTime(long eventDownTime, int keyType, float keyCentre_X, float keyCentre_Y, float keyWidth, float keyHeight) { KeyDataPOJO[] temp; Semaphore temp_Semaphore; //assigning correct buffer; @@ -243,7 +242,7 @@ public boolean addKeyDataOnlyUpTime(long eventDownTime, int key_id, float keyCen temp_Semaphore.acquire(); temp[currentIndexKey].eventDownTime = eventDownTime; temp[currentIndexKey].eventUpTime = 0; - temp[currentIndexKey].keyId = key_id; + temp[currentIndexKey].keyType = keyType; temp[currentIndexKey].keyCentre_X = keyCentre_X; temp[currentIndexKey].keyCentre_Y = keyCentre_Y; temp[currentIndexKey].keyWidth = keyWidth; @@ -280,21 +279,6 @@ public boolean addKeyDataOnlyUpTime(long eventDownTime, int key_id, float keyCen } } - //insert data into unsed pojo - //unlock semaphore - //deduce if it needs to kickoff another thread - //leave - return false; - } - - @Override - public boolean updateUpTimeFor(long eventDownTime, long eventUpTime) { return false; } - - //to get DB Manager instance - public static BiAffectDBManager getDBMngrInstance() - { - return DBMngrINSTANCE; - } } \ No newline at end of file diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/KeyDataPOJO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/KeyDataPOJO.java index 9b9aaffa41..636ea3e69a 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/KeyDataPOJO.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/KeyDataPOJO.java @@ -7,7 +7,7 @@ public class KeyDataPOJO { boolean used; long eventDownTime; long eventUpTime; - int keyId; + int keyType; float keyCentre_X; float keyCentre_Y; float keyWidth; @@ -21,7 +21,7 @@ public boolean markUnused(){ this.used = false; this.eventDownTime=-1; this.eventUpTime=-1; - this.keyId=Integer.MIN_VALUE; + this.keyType=Integer.MIN_VALUE; this.keyCentre_X=-1; this.keyCentre_Y=-1; this.keyWidth=-1; @@ -37,7 +37,7 @@ public boolean validatePOJO(){ public void printYourself(){ Log.i("CS_BiAffect_K", "eventDownTime->"+this.eventDownTime); Log.i("CS_BiAffect_K", "eventUpTime->"+this.eventUpTime); - Log.i("CS_BiAffect_K", "keyId->"+this.keyId); + Log.i("CS_BiAffect_K", "keyId->"+this.keyType); Log.i("CS_BiAffect_K", "keyCentre_X->"+this.keyCentre_X); Log.i("CS_BiAffect_K", "keyCentre_Y->"+this.keyCentre_Y); Log.i("CS_BiAffect_K", "keyWidth->"+this.keyWidth); diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/KeyDataWorker.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/KeyDataWorker.java index 734c71ac6e..9dcc3da38a 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/KeyDataWorker.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/KeyDataWorker.java @@ -20,7 +20,6 @@ public KeyDataWorker(boolean bucketk1){ @Override public void run() { sharedInstance = BiAManager.getInstance(null); - dbManagerSharedInstance = BiAManager.getDBMngrInstance(); KeyDataPOJO[] temp; Semaphore temp_Semaphore; if(this.bucketk1){ @@ -39,8 +38,8 @@ public void run() { Log.i("CS_BiAffect_K","---------KEY BUFFER EMPTY START-----------"+this.bucketk1); for(KeyDataPOJO k:temp){ if(k.used && k.validatePOJO()){ - //Place a call to DB manager instance to insert this into the database - // + BiAffectDBManager sharedDbManager = BiAffectDBManager.getInstance(); + sharedDbManager.insertKeyTypeData(k.eventDownTime, k.keyType, k.keyCentre_X, k.keyCentre_Y, k.keyWidth, k.keyHeight); k.markUnused(); From 14b8d8ba398e5b2a5ea47eaa93f7d8781df42290 Mon Sep 17 00:00:00 2001 From: sree Date: Fri, 26 Apr 2019 14:58:57 -0500 Subject: [PATCH 023/113] dB code for key --- .../BiAffectDB/BiAffectDBInterface.java | 4 ++-- .../BiAffectDB/BiAffectDBManager.java | 14 +++++++------- .../BiAffectDB/BiAffectDB_roomModel/KeyData.java | 3 ++- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBInterface.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBInterface.java index 7ee1bd86f7..8b5bb32557 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBInterface.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBInterface.java @@ -22,9 +22,9 @@ interface SessionDataInterface { } interface KeyTypeDataInterface { - void insertOnlySingleKeyMetrics (KeyData single_entry); + void insertKeyTypeData (long keyId,int keytypecode,float x,float y, float width, float height); - void insertMultipleKeyMetrics (KeyData[] keyDataList); + //void insertMultipleKeyMetrics (KeyData[] keyDataList); //for radius one way of adding to DB will be update at end of session. Also time of key up. Creating the stub as placeholder for now //not required but kept return type int so that Roomreturns number of rows edited. This will help in debugging diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java index c56b0e1bf6..32a65d1dcf 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java @@ -40,7 +40,7 @@ public void insertTouchTypeData(long eventDowntime,long eventTime,int eventActio // public void insertTouchTypeEntryBatch(TouchData[] multi_entry){ // DBINSTANCE.TouchDataDao().insertMultipleTouchMetrics(multi_entry); // } - + @Override public TouchData[] fetchTouchDataRows(long keyId,int motioneventtype){ return DBINSTANCE.TouchDataDao().fetchTouchData(keyId,motioneventtype); @@ -56,14 +56,14 @@ public void updateSessionEndTime(SessionData data){ } @Override - public void insertOnlySingleKeyMetrics (KeyData single_entry){ - DBINSTANCE.KeyDataDAO().insertOnlySingleKeyMetrics(single_entry); + public void insertKeyTypeData (long keyId,int keytypecode,float x,float y, float width, float height){ + //DBINSTANCE.KeyDataDAO().insertOnlySingleKeyMetrics(single_entry); } - @Override - public void insertMultipleKeyMetrics (KeyData[] keyDataList){ - DBINSTANCE.KeyDataDAO().insertMultipleKeyMetrics(keyDataList); - } +// @Override +// public void insertMultipleKeyMetrics (KeyData[] keyDataList){ +// DBINSTANCE.KeyDataDAO().insertMultipleKeyMetrics(keyDataList); +// } @Override public int updateRadiusofTouch(KeyData data){ diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/KeyData.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/KeyData.java index ed69af0632..738a74dff7 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/KeyData.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/KeyData.java @@ -13,9 +13,10 @@ public class KeyData @ColumnInfo(name = "Key_Id") public long eventDownTime; + //will later need to add some mapping functionality key - type @NonNull @ColumnInfo(name = "Key_Type") - public long keyType; + public int keyType; @ColumnInfo(name = "radius%_of_key_downp_ress") public float radius_percent; From cfd5c60850ca093e26ba23d0bf8fbfaa6a84ec16 Mon Sep 17 00:00:00 2001 From: Vinay Manchundiya Date: Fri, 26 Apr 2019 15:23:58 -0500 Subject: [PATCH 024/113] safe --- .../anysoftkeyboard/BiAffect/BiAManager.java | 85 +++++++++++++++++-- .../BiAffect/KeyDataWorker.java | 4 - 2 files changed, 76 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java index b9dc49d0fc..173590573e 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java @@ -11,6 +11,7 @@ import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDBManager; import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.KeyData; import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.SessionData; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.TouchData; import java.util.LinkedHashMap; import java.util.concurrent.ArrayBlockingQueue; @@ -44,6 +45,9 @@ public class BiAManager implements BiADataProcessorInterface.TouchDataProcessorI Semaphore k1_Semaphore = new Semaphore(1); Semaphore k2_Semaphore = new Semaphore(1); + //Session specific data + long currentRunningSession; + // DB related variables /** @@ -142,20 +146,83 @@ public boolean recordKeyPressForce(long eventDownTime, double pressure, int acti //Session specific calls public boolean startSession(){ - /*Entry into session table for start sesison - creating Session object and adding values - initially adding end time= start time as end time is non null. will be later updated*/ -// -// - //Keep the starttime of the cuurent session in a local variable so that it can be used in endsession query - + this.currentRunningSession = System.currentTimeMillis(); + BiAffectDBManager.getInstance().insertSessionStartTime(this.currentRunningSession); return true; } public boolean endSession(){ - //Entry into session table, for end session time + //going through each buffer + //T1 Buffer + try { + t1_Sempahore.acquire(); + for(TouchDataPOJO tP : t1){ + if(tP.used){ + //This is supposed to be inserted into the database + BiAffectDBManager.getInstance().insertTouchTypeData(tP.eventDownTime, tP.eventTime, tP.eventAction, tP.pressure, tP.x_cord, tP.y_cord, tP.major_axis, tP.minor_axis); + tP.markUnused(); + } + } + }catch (InterruptedException e){ + + }finally { + t1_Sempahore.release(); + } + + //T2 Buffer + try { + t2_Sempahore.acquire(); + for(TouchDataPOJO tP : t2){ + if(tP.used){ + //This is supposed to be inserted into the database + BiAffectDBManager.getInstance().insertTouchTypeData(tP.eventDownTime, tP.eventTime, tP.eventAction, tP.pressure, tP.x_cord, tP.y_cord, tP.major_axis, tP.minor_axis); + tP.markUnused(); + } + } + }catch (InterruptedException e){ + + }finally { + t2_Sempahore.release(); + } + + //K1 Buffer + try { + k1_Semaphore.acquire(); + for(KeyDataPOJO kP:k1){ + if(kP.used){ + //This is supposed to be inserted into the database + BiAffectDBManager.getInstance().insertKeyTypeData(kP.eventDownTime, kP.keyType, kP.keyCentre_X, kP.keyCentre_Y, kP.keyWidth, kP.keyHeight); + kP.markUnused(); + } + } + }catch (InterruptedException e){ + + }finally { + k1_Semaphore.release(); + } + + //K2 Buffer + try { + k2_Semaphore.acquire(); + for(KeyDataPOJO kP:k2){ + if(kP.used){ + //This is supposed to be inserted into the database + BiAffectDBManager.getInstance().insertKeyTypeData(kP.eventDownTime, kP.keyType, kP.keyCentre_X, kP.keyCentre_Y, kP.keyWidth, kP.keyHeight); + kP.markUnused(); + } + } + }catch (InterruptedException e){ + + }finally { + k2_Semaphore.release(); + } + + //Stop the accelerometer and other sensor threads + + //Register sesison end time in the database + long sessionEndTime = System.currentTimeMillis(); + BiAffectDBManager.getInstance().updateSessionEndTime(this.currentRunningSession,sessionEndTime); - //Check for both the buffers if there are any used objects in the buffer, if yes, put them into db return true; } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/KeyDataWorker.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/KeyDataWorker.java index 9dcc3da38a..adfaf1dc06 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/KeyDataWorker.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/KeyDataWorker.java @@ -45,8 +45,6 @@ public void run() { } } - - }catch (InterruptedException e){ }finally { @@ -54,7 +52,5 @@ public void run() { Log.i("CS_BiAffect_K","---------KEY BUFFER EMPTY END-----------"+this.bucketk1); } - - } } From 8e6641efbd7b95cb1404bd9e3b17bbea37d2fd7c Mon Sep 17 00:00:00 2001 From: sree Date: Fri, 26 Apr 2019 15:25:01 -0500 Subject: [PATCH 025/113] session end to end --- .../BiAffectDB/BiAffectDBInterface.java | 4 ++-- .../BiAffectDB/BiAffectDBManager.java | 22 ++++++++++++++----- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBInterface.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBInterface.java index 8b5bb32557..69d0444750 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBInterface.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBInterface.java @@ -17,8 +17,8 @@ interface TouchDataInterface { interface SessionDataInterface { - void insertSessionStartTime (SessionData single_entry); - void updateSessionEndTime(SessionData data); + void insertSessionStartTime (long startTime); + void updateSessionEndTime(long startTime,long endTime); } interface KeyTypeDataInterface { diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java index 32a65d1dcf..9fa1594e2a 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java @@ -33,8 +33,17 @@ private BiAffectDBManager() { } @Override - public void insertTouchTypeData(long eventDowntime,long eventTime,int eventAction,float pressure,float x, float y,float major_Axis,float minor_axisy){ - //DBINSTANCE.TouchDataDao().insertOnlySingleTouchMetrics(single_entry); + public void insertTouchTypeData(long eventDowntime,long eventTime,int eventAction,float pressure,float x, float y,float major_Axis,float minor_axis){ + TouchData TouchDataObj =new TouchData(); + TouchDataObj.eventDownTime=eventDowntime; + TouchDataObj.eventAction=eventAction; + TouchDataObj.pressure=pressure; + TouchDataObj.x_cord=x; + TouchDataObj.y_cord=y; + TouchDataObj.major_axis=major_Axis; + TouchDataObj.major_axis=minor_axis; + + DBINSTANCE.TouchDataDao().insertOnlySingleTouchMetrics(TouchDataObj); } // @Override // public void insertTouchTypeEntryBatch(TouchData[] multi_entry){ @@ -46,13 +55,14 @@ public TouchData[] fetchTouchDataRows(long keyId,int motioneventtype){ return DBINSTANCE.TouchDataDao().fetchTouchData(keyId,motioneventtype); } @Override - public void insertSessionStartTime (SessionData single_entry){ - DBINSTANCE.SessionDataDao().insertSessionStartTime(single_entry); + public void insertSessionStartTime (long startTime){ + SessionData sessionDataObj =new SessionData(); + // DBINSTANCE.SessionDataDao().insertSessionStartTime(time); } @Override - public void updateSessionEndTime(SessionData data){ - DBINSTANCE.SessionDataDao().insertSessionStartTime(data); + public void updateSessionEndTime(long startTime,long endTime){ + //DBINSTANCE.SessionDataDao().insertSessionStartTime(data); } @Override From 0cfb600735508c10402b43c4909253574ad41738 Mon Sep 17 00:00:00 2001 From: sree Date: Fri, 26 Apr 2019 15:32:09 -0500 Subject: [PATCH 026/113] back end implementation for touch,key,session --- .../BiAffectDB/BiAffectDBManager.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java index 9fa1594e2a..507286dc9e 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java @@ -57,17 +57,29 @@ public TouchData[] fetchTouchDataRows(long keyId,int motioneventtype){ @Override public void insertSessionStartTime (long startTime){ SessionData sessionDataObj =new SessionData(); - // DBINSTANCE.SessionDataDao().insertSessionStartTime(time); + sessionDataObj.startTime=startTime; + sessionDataObj.endTime=startTime; + DBINSTANCE.SessionDataDao().insertSessionStartTime(sessionDataObj); } @Override public void updateSessionEndTime(long startTime,long endTime){ - //DBINSTANCE.SessionDataDao().insertSessionStartTime(data); + SessionData sessionDataObj =new SessionData(); + sessionDataObj.startTime=startTime; + sessionDataObj.endTime=endTime; + DBINSTANCE.SessionDataDao().insertSessionStartTime(sessionDataObj); } @Override public void insertKeyTypeData (long keyId,int keytypecode,float x,float y, float width, float height){ - //DBINSTANCE.KeyDataDAO().insertOnlySingleKeyMetrics(single_entry); + KeyData keyDataObj =new KeyData(); + keyDataObj.eventDownTime=keyId; + keyDataObj.keyType=keytypecode; + keyDataObj.Key_X=x; + keyDataObj.Key_X=y; + keyDataObj.Key_width=width; + keyDataObj.Key_height=height; + DBINSTANCE.KeyDataDAO().insertOnlySingleKeyMetrics(keyDataObj); } // @Override From acd7795308df093272ca2943b9bf1c9c77bb9996 Mon Sep 17 00:00:00 2001 From: sree Date: Fri, 26 Apr 2019 15:43:46 -0500 Subject: [PATCH 027/113] . --- .../android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java index 507286dc9e..77fda73187 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java @@ -16,7 +16,7 @@ public class BiAffectDBManager implements BiAffectDBInterface.TouchDataInterface */ Context mcontext = AnyApplication.getAppContext(); - private BiAffectDB DBINSTANCE; + private static BiAffectDB DBINSTANCE; private static BiAffectDBManager MngrInstance = null; From 0ca9318578202fd44b8dec8fb4c504e025029b8f Mon Sep 17 00:00:00 2001 From: Vinay Manchundiya Date: Fri, 26 Apr 2019 15:44:07 -0500 Subject: [PATCH 028/113] safe --- .../menny/android/anysoftkeyboard/BiAffect/BiAManager.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java index 173590573e..158dc11b36 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java @@ -147,7 +147,12 @@ public boolean recordKeyPressForce(long eventDownTime, double pressure, int acti //Session specific calls public boolean startSession(){ this.currentRunningSession = System.currentTimeMillis(); - BiAffectDBManager.getInstance().insertSessionStartTime(this.currentRunningSession); + Thread temp = new Thread(new Runnable() { + @Override + public void run() { + BiAffectDBManager.getInstance().insertSessionStartTime(currentRunningSession); + } + }); return true; } From 41efc2f1dec47ea73f6269c04f55d92f3120f380 Mon Sep 17 00:00:00 2001 From: Vinay Manchundiya Date: Fri, 26 Apr 2019 15:45:27 -0500 Subject: [PATCH 029/113] safe --- .../android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java index 77fda73187..4e4eb4d75d 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java @@ -36,12 +36,13 @@ private BiAffectDBManager() { public void insertTouchTypeData(long eventDowntime,long eventTime,int eventAction,float pressure,float x, float y,float major_Axis,float minor_axis){ TouchData TouchDataObj =new TouchData(); TouchDataObj.eventDownTime=eventDowntime; + TouchDataObj.eventTime = eventTime; TouchDataObj.eventAction=eventAction; TouchDataObj.pressure=pressure; TouchDataObj.x_cord=x; TouchDataObj.y_cord=y; TouchDataObj.major_axis=major_Axis; - TouchDataObj.major_axis=minor_axis; + TouchDataObj.minor_axis=minor_axis; DBINSTANCE.TouchDataDao().insertOnlySingleTouchMetrics(TouchDataObj); } From 9735e3e02c300fa7191befac48a15ce0f558ff8e Mon Sep 17 00:00:00 2001 From: Vinay Manchundiya Date: Fri, 26 Apr 2019 16:08:36 -0500 Subject: [PATCH 030/113] . --- .../com/anysoftkeyboard/AnySoftKeyboard.java | 2 + .../ime/AnySoftKeyboardBase.java | 2 + .../anysoftkeyboard/BiAffect/BiAManager.java | 65 +++++++++++++++---- .../BiAffectDB_roomModel/SessionData.java | 1 - .../android/anysoftkeyboard/SoftKeyboard.java | 3 - 5 files changed, 56 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java b/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java index 4edcb83da5..73f22c97ce 100644 --- a/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java +++ b/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java @@ -60,6 +60,7 @@ import com.anysoftkeyboard.utils.IMEUtil; import com.google.android.voiceime.VoiceRecognitionTrigger; import com.menny.android.anysoftkeyboard.AnyApplication; +import com.menny.android.anysoftkeyboard.BiAffect.BiAManager; import com.menny.android.anysoftkeyboard.BuildConfig; import com.menny.android.anysoftkeyboard.R; @@ -232,6 +233,7 @@ public void onStartInputView(final EditorInfo attribute, final boolean restartin getInputView().setKeyboardActionType(attribute.imeOptions); updateShiftStateNow(); + BiAManager.getInstance(getApplicationContext()).startSession(); } @Override diff --git a/app/src/main/java/com/anysoftkeyboard/ime/AnySoftKeyboardBase.java b/app/src/main/java/com/anysoftkeyboard/ime/AnySoftKeyboardBase.java index 56766594b4..20b6202af5 100644 --- a/app/src/main/java/com/anysoftkeyboard/ime/AnySoftKeyboardBase.java +++ b/app/src/main/java/com/anysoftkeyboard/ime/AnySoftKeyboardBase.java @@ -43,6 +43,7 @@ import com.anysoftkeyboard.ui.dev.DeveloperUtils; import com.anysoftkeyboard.utils.ModifierKeyState; import com.menny.android.anysoftkeyboard.AnyApplication; +import com.menny.android.anysoftkeyboard.BiAffect.BiAManager; import com.menny.android.anysoftkeyboard.BuildConfig; import com.menny.android.anysoftkeyboard.R; @@ -317,6 +318,7 @@ public void hideWindow() { while (handleCloseRequest()) { Logger.i(TAG, "Still have stuff to close. Trying handleCloseRequest again."); } + BiAManager.getInstance(getApplicationContext()).endSession(); super.hideWindow(); } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java index 158dc11b36..bc06d9f1e8 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java @@ -157,15 +157,25 @@ public void run() { } public boolean endSession(){ + Log.i("CS_BiAffect","-----------END SESSION START-------------"); //going through each buffer //T1 Buffer try { t1_Sempahore.acquire(); + Log.i("CS_BiAffect","-----------TP1 START-------------"); for(TouchDataPOJO tP : t1){ if(tP.used){ - //This is supposed to be inserted into the database - BiAffectDBManager.getInstance().insertTouchTypeData(tP.eventDownTime, tP.eventTime, tP.eventAction, tP.pressure, tP.x_cord, tP.y_cord, tP.major_axis, tP.minor_axis); - tP.markUnused(); + Thread temp = new Thread(new Runnable() { + @Override + public void run() { + //This is supposed to be inserted into the database + BiAffectDBManager.getInstance().insertTouchTypeData(tP.eventDownTime, tP.eventTime, tP.eventAction, tP.pressure, tP.x_cord, tP.y_cord, tP.major_axis, tP.minor_axis); + tP.markUnused(); + + } + }); + temp.start(); + } } }catch (InterruptedException e){ @@ -177,11 +187,19 @@ public boolean endSession(){ //T2 Buffer try { t2_Sempahore.acquire(); + Log.i("CS_BiAffect","-----------TP2 START-------------"); for(TouchDataPOJO tP : t2){ if(tP.used){ - //This is supposed to be inserted into the database - BiAffectDBManager.getInstance().insertTouchTypeData(tP.eventDownTime, tP.eventTime, tP.eventAction, tP.pressure, tP.x_cord, tP.y_cord, tP.major_axis, tP.minor_axis); - tP.markUnused(); + Thread temp = new Thread(new Runnable() { + @Override + public void run() { + //This is supposed to be inserted into the database + BiAffectDBManager.getInstance().insertTouchTypeData(tP.eventDownTime, tP.eventTime, tP.eventAction, tP.pressure, tP.x_cord, tP.y_cord, tP.major_axis, tP.minor_axis); + tP.markUnused(); + + } + }); + temp.start(); } } }catch (InterruptedException e){ @@ -193,11 +211,18 @@ public boolean endSession(){ //K1 Buffer try { k1_Semaphore.acquire(); + Log.i("CS_BiAffect","-----------KP1 START-------------"); for(KeyDataPOJO kP:k1){ if(kP.used){ - //This is supposed to be inserted into the database - BiAffectDBManager.getInstance().insertKeyTypeData(kP.eventDownTime, kP.keyType, kP.keyCentre_X, kP.keyCentre_Y, kP.keyWidth, kP.keyHeight); - kP.markUnused(); + Thread temp = new Thread(new Runnable() { + @Override + public void run() { + //This is supposed to be inserted into the database + BiAffectDBManager.getInstance().insertKeyTypeData(kP.eventDownTime, kP.keyType, kP.keyCentre_X, kP.keyCentre_Y, kP.keyWidth, kP.keyHeight); + kP.markUnused(); + } + }); + temp.start(); } } }catch (InterruptedException e){ @@ -209,11 +234,18 @@ public boolean endSession(){ //K2 Buffer try { k2_Semaphore.acquire(); + Log.i("CS_BiAffect","-----------KP2 START-------------"); for(KeyDataPOJO kP:k2){ if(kP.used){ - //This is supposed to be inserted into the database - BiAffectDBManager.getInstance().insertKeyTypeData(kP.eventDownTime, kP.keyType, kP.keyCentre_X, kP.keyCentre_Y, kP.keyWidth, kP.keyHeight); - kP.markUnused(); + Thread temp = new Thread(new Runnable() { + @Override + public void run() { + //This is supposed to be inserted into the database + BiAffectDBManager.getInstance().insertKeyTypeData(kP.eventDownTime, kP.keyType, kP.keyCentre_X, kP.keyCentre_Y, kP.keyWidth, kP.keyHeight); + kP.markUnused(); + } + }); + temp.start(); } } }catch (InterruptedException e){ @@ -226,7 +258,14 @@ public boolean endSession(){ //Register sesison end time in the database long sessionEndTime = System.currentTimeMillis(); - BiAffectDBManager.getInstance().updateSessionEndTime(this.currentRunningSession,sessionEndTime); + Thread temp = new Thread(new Runnable() { + @Override + public void run() { + //This is supposed to be inserted into the database + BiAffectDBManager.getInstance().updateSessionEndTime(currentRunningSession,sessionEndTime); + } + }); + temp.start(); return true; } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/SessionData.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/SessionData.java index cc4f4f9889..f8104bf9e2 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/SessionData.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/SessionData.java @@ -8,7 +8,6 @@ @Entity public class SessionData { - public long id; @PrimaryKey @NonNull @ColumnInfo(name = "Session_start_time") diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/SoftKeyboard.java b/app/src/main/java/com/menny/android/anysoftkeyboard/SoftKeyboard.java index ebe3ab7e7f..5f441347cb 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/SoftKeyboard.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/SoftKeyboard.java @@ -30,9 +30,6 @@ public class SoftKeyboard extends AnySoftKeyboard { @Override protected String getSettingsInputMethodId() { - //StackTraceElement trace = new Exception().getStackTrace(); - Log.d("CS", Log.getStackTraceString(new Exception())); - BiAManager.getInstance(getApplicationContext()).startSession(); return new ComponentName(getApplication(), SoftKeyboard.class).flattenToShortString(); } } From 5b171234367bf0c522fbaa445c80d90f58a5a603 Mon Sep 17 00:00:00 2001 From: Vinay Manchundiya Date: Fri, 26 Apr 2019 18:30:52 -0500 Subject: [PATCH 031/113] safe --- .../com/anysoftkeyboard/AnySoftKeyboard.java | 4 +- .../anysoftkeyboard/BiAffect/BiAManager.java | 119 ++---------------- .../anysoftkeyboard/BiAffect/Finaliser.java | 83 ++++++++++++ .../BiAffectDB/BiAffectDBManager.java | 15 ++- .../BiAffectDB_roomDAO/Touch_DAO.java | 2 +- .../BiAffectDB_roomModel/TouchData.java | 23 +--- 6 files changed, 111 insertions(+), 135 deletions(-) create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Finaliser.java diff --git a/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java b/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java index 73f22c97ce..0db70983d0 100644 --- a/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java +++ b/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java @@ -220,7 +220,7 @@ public void onStartInputView(final EditorInfo attribute, final boolean restartin attribute.imeOptions, attribute.inputType, restarting); super.onStartInputView(attribute, restarting); - + BiAManager.getInstance(getApplicationContext()).startSession(); if (mVoiceRecognitionTrigger != null) { mVoiceRecognitionTrigger.onStartInputView(); } @@ -233,7 +233,7 @@ public void onStartInputView(final EditorInfo attribute, final boolean restartin getInputView().setKeyboardActionType(attribute.imeOptions); updateShiftStateNow(); - BiAManager.getInstance(getApplicationContext()).startSession(); + } @Override diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java index bc06d9f1e8..b9a105dee9 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java @@ -47,6 +47,7 @@ public class BiAManager implements BiADataProcessorInterface.TouchDataProcessorI //Session specific data long currentRunningSession; + boolean sessionRunning; // DB related variables @@ -146,127 +147,29 @@ public boolean recordKeyPressForce(long eventDownTime, double pressure, int acti //Session specific calls public boolean startSession(){ + //check once.. I dont think the event time is stored as milli sec + Log.i("CS_BiAffect_S","-----------Start SESSION START-------------"); + this.sessionRunning = true; this.currentRunningSession = System.currentTimeMillis(); + Log.i("CS_BiAffect_S","startTime -> "+currentRunningSession); Thread temp = new Thread(new Runnable() { @Override public void run() { BiAffectDBManager.getInstance().insertSessionStartTime(currentRunningSession); } }); + Log.i("CS_BiAffect_S","-----------Start SESSION End-------------"); return true; } public boolean endSession(){ - Log.i("CS_BiAffect","-----------END SESSION START-------------"); - //going through each buffer - //T1 Buffer - try { - t1_Sempahore.acquire(); - Log.i("CS_BiAffect","-----------TP1 START-------------"); - for(TouchDataPOJO tP : t1){ - if(tP.used){ - Thread temp = new Thread(new Runnable() { - @Override - public void run() { - //This is supposed to be inserted into the database - BiAffectDBManager.getInstance().insertTouchTypeData(tP.eventDownTime, tP.eventTime, tP.eventAction, tP.pressure, tP.x_cord, tP.y_cord, tP.major_axis, tP.minor_axis); - tP.markUnused(); - - } - }); - temp.start(); - - } - } - }catch (InterruptedException e){ - - }finally { - t1_Sempahore.release(); - } - - //T2 Buffer - try { - t2_Sempahore.acquire(); - Log.i("CS_BiAffect","-----------TP2 START-------------"); - for(TouchDataPOJO tP : t2){ - if(tP.used){ - Thread temp = new Thread(new Runnable() { - @Override - public void run() { - //This is supposed to be inserted into the database - BiAffectDBManager.getInstance().insertTouchTypeData(tP.eventDownTime, tP.eventTime, tP.eventAction, tP.pressure, tP.x_cord, tP.y_cord, tP.major_axis, tP.minor_axis); - tP.markUnused(); - - } - }); - temp.start(); - } - } - }catch (InterruptedException e){ - - }finally { - t2_Sempahore.release(); - } - - //K1 Buffer - try { - k1_Semaphore.acquire(); - Log.i("CS_BiAffect","-----------KP1 START-------------"); - for(KeyDataPOJO kP:k1){ - if(kP.used){ - Thread temp = new Thread(new Runnable() { - @Override - public void run() { - //This is supposed to be inserted into the database - BiAffectDBManager.getInstance().insertKeyTypeData(kP.eventDownTime, kP.keyType, kP.keyCentre_X, kP.keyCentre_Y, kP.keyWidth, kP.keyHeight); - kP.markUnused(); - } - }); - temp.start(); - } - } - }catch (InterruptedException e){ - - }finally { - k1_Semaphore.release(); - } - - //K2 Buffer - try { - k2_Semaphore.acquire(); - Log.i("CS_BiAffect","-----------KP2 START-------------"); - for(KeyDataPOJO kP:k2){ - if(kP.used){ - Thread temp = new Thread(new Runnable() { - @Override - public void run() { - //This is supposed to be inserted into the database - BiAffectDBManager.getInstance().insertKeyTypeData(kP.eventDownTime, kP.keyType, kP.keyCentre_X, kP.keyCentre_Y, kP.keyWidth, kP.keyHeight); - kP.markUnused(); - } - }); - temp.start(); - } - } - }catch (InterruptedException e){ - - }finally { - k2_Semaphore.release(); - } - - //Stop the accelerometer and other sensor threads - - //Register sesison end time in the database + if(!this.sessionRunning) return false; + Log.i("CS_BiAffect_E","-----------END SESSION START-------------"); + this.sessionRunning = false; long sessionEndTime = System.currentTimeMillis(); - Thread temp = new Thread(new Runnable() { - @Override - public void run() { - //This is supposed to be inserted into the database - BiAffectDBManager.getInstance().updateSessionEndTime(currentRunningSession,sessionEndTime); - } - }); + Thread temp = new Thread(new Finaliser(this.currentRunningSession, sessionEndTime)); temp.start(); - + Log.i("CS_BiAffect_E","-----------END SESSION END-------------"); return true; } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Finaliser.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Finaliser.java new file mode 100644 index 0000000000..f33a99ebd2 --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Finaliser.java @@ -0,0 +1,83 @@ +package com.menny.android.anysoftkeyboard.BiAffect; + +import android.util.Log; + +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDBManager; + +public class Finaliser implements Runnable { + + long startTime; + long endTime; + BiAManager sharedInstance; + int count=0; + + public Finaliser(long startTime, long endTime){ + super(); + this.startTime = startTime; + this.endTime = endTime; + this.sharedInstance = BiAManager.getInstance(null); + } + + @Override + public void run() { + Log.i("CS_BiAffect_E_T","-----------FINALISER START-------------"); + try { + //This acquires all the semaphores first + sharedInstance.k1_Semaphore.acquire(); + sharedInstance.k2_Semaphore.acquire(); + sharedInstance.t1_Sempahore.acquire(); + sharedInstance.t2_Sempahore.acquire(); + + int max = sharedInstance.KEY_BUFFER_SIZE > sharedInstance.TOUCH_BUFFER_SIZE?sharedInstance.KEY_BUFFER_SIZE:sharedInstance.TOUCH_BUFFER_SIZE; + + for(int i=0; i"+count); + Log.i("CS_BiAffect_E_T","-----------FINALISER END-------------"); + + } + } +} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java index 4e4eb4d75d..1019cba9e2 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java @@ -1,8 +1,12 @@ package com.menny.android.anysoftkeyboard.BiAffectDB; import android.content.Context; +import android.text.method.Touch; +import android.util.Log; import com.menny.android.anysoftkeyboard.AnyApplication; +import com.menny.android.anysoftkeyboard.BiAffect.TouchDataWorker; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomDAO.Touch_DAO; import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.AccelerometerData; import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.DeviceData; import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.KeyData; @@ -17,6 +21,7 @@ public class BiAffectDBManager implements BiAffectDBInterface.TouchDataInterface Context mcontext = AnyApplication.getAppContext(); private static BiAffectDB DBINSTANCE; + private final Touch_DAO mtouchDataDao; private static BiAffectDBManager MngrInstance = null; @@ -29,11 +34,13 @@ public static synchronized BiAffectDBManager getInstance() { //can put static if need be private BiAffectDBManager() { DBINSTANCE=BiAffectDB.getDatabase(mcontext); - + mtouchDataDao = DBINSTANCE.TouchDataDao(); } @Override public void insertTouchTypeData(long eventDowntime,long eventTime,int eventAction,float pressure,float x, float y,float major_Axis,float minor_axis){ + Log.i("CS_BiA_TP_T","Start"); + Log.i("CS_BiA_TP_T","downTime -> "+eventDowntime); TouchData TouchDataObj =new TouchData(); TouchDataObj.eventDownTime=eventDowntime; TouchDataObj.eventTime = eventTime; @@ -43,8 +50,8 @@ public void insertTouchTypeData(long eventDowntime,long eventTime,int eventActio TouchDataObj.y_cord=y; TouchDataObj.major_axis=major_Axis; TouchDataObj.minor_axis=minor_axis; - - DBINSTANCE.TouchDataDao().insertOnlySingleTouchMetrics(TouchDataObj); + mtouchDataDao.insertOnlySingleTouchMetrics(TouchDataObj); + Log.i("CS_BiA_TP_T","End"); } // @Override // public void insertTouchTypeEntryBatch(TouchData[] multi_entry){ @@ -57,10 +64,12 @@ public TouchData[] fetchTouchDataRows(long keyId,int motioneventtype){ } @Override public void insertSessionStartTime (long startTime){ + Log.i("CS_BiAffect_S_T","startTime -> "+startTime); SessionData sessionDataObj =new SessionData(); sessionDataObj.startTime=startTime; sessionDataObj.endTime=startTime; DBINSTANCE.SessionDataDao().insertSessionStartTime(sessionDataObj); + Log.i("CS_BiAffect_S_T","Inserted in db"); } @Override diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Touch_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Touch_DAO.java index 01d2c36cfe..cd8040f168 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Touch_DAO.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Touch_DAO.java @@ -19,7 +19,7 @@ public interface Touch_DAO { void insertMultipleTouchMetrics (TouchData[] touchDataList); //will be required to fetch X Y coords during Key data update - @Query("SELECT * FROM TouchTypeData WHERE KeyId= :keyId"+" AND Key_Event_Action= :motioneventtype") + @Query("SELECT * FROM TouchTypeData WHERE Key_down_time= :keyId"+" AND Key_Event_Action= :motioneventtype") public TouchData[] fetchTouchData(long keyId,int motioneventtype); } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/TouchData.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/TouchData.java index c42a63ec86..dc7fa7b88e 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/TouchData.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/TouchData.java @@ -22,11 +22,11 @@ public class TouchData { //keydownpress rename @NonNull - @ColumnInfo(name = "KeyId") + @ColumnInfo(name = "Key_down_time") public long eventDownTime; @NonNull - @ColumnInfo(name = "Key_press_time") + @ColumnInfo(name = "Key_current_time") public long eventTime; @NonNull @@ -53,25 +53,6 @@ public class TouchData { @ColumnInfo(name = "Key_toucharea_Minor_axis") public float minor_axis; -/* -* Commenting because in the new design, accelerometer data will sit in an independent table -* */ -// @NonNull -// @ColumnInfo(name = "accelerometer_x") -// public float accelerometer_x; -// -// @NonNull -// @ColumnInfo(name = "accelerometer_y") -// public float accelerometer_y; -// -// @NonNull -// @ColumnInfo(name = "accelerometer_z") -// public float accelerometer_z; -// -// // needs to be taken out -// @NonNull -// @ColumnInfo(name = "Number_of_touches") -// public int touches; public TouchData() { // default constructor From 996771f3f0f9731858c1c5014237b04dc234e1af Mon Sep 17 00:00:00 2001 From: Vinay Manchundiya Date: Fri, 26 Apr 2019 20:43:55 -0500 Subject: [PATCH 032/113] safe --- .../menny/android/anysoftkeyboard/BiAffect/Finaliser.java | 8 ++++++++ .../android/anysoftkeyboard/BiAffectDB/BiAffectDB.java | 3 ++- .../anysoftkeyboard/BiAffectDB/BiAffectDBManager.java | 6 +++++- 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Finaliser.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Finaliser.java index f33a99ebd2..665d971899 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Finaliser.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Finaliser.java @@ -1,7 +1,9 @@ package com.menny.android.anysoftkeyboard.BiAffect; +import android.arch.persistence.room.Room; import android.util.Log; +import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB; import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDBManager; public class Finaliser implements Runnable { @@ -66,6 +68,12 @@ public void run() { } } + BiAffectDB inst = Room.databaseBuilder(sharedInstance.mContext, + BiAffectDB.class, "BiAffect_database.db") + .fallbackToDestructiveMigration() + .build(); + inst.close(); + }catch (InterruptedException e){ }finally { diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB.java index 8104897cce..8167c3ce4b 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB.java @@ -32,7 +32,8 @@ public static BiAffectDB getDatabase(final Context context) { synchronized (BiAffectDB.class) { if (INSTANCE == null) { INSTANCE = Room.databaseBuilder(context.getApplicationContext(), - BiAffectDB.class, "BiAffect_database") + BiAffectDB.class, "BiAffect_database.db") + .fallbackToDestructiveMigration() .build(); } } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java index 1019cba9e2..cf50a2949a 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java @@ -1,5 +1,6 @@ package com.menny.android.anysoftkeyboard.BiAffectDB; +import android.arch.persistence.room.Room; import android.content.Context; import android.text.method.Touch; import android.util.Log; @@ -33,7 +34,10 @@ public static synchronized BiAffectDBManager getInstance() { //can put static if need be private BiAffectDBManager() { - DBINSTANCE=BiAffectDB.getDatabase(mcontext); + DBINSTANCE= Room.databaseBuilder(mcontext, + BiAffectDB.class, "BiAffect_database.db") + .fallbackToDestructiveMigration() + .build(); mtouchDataDao = DBINSTANCE.TouchDataDao(); } From ec82b1b59d61cb3d986e59d11f6977f18f1b009c Mon Sep 17 00:00:00 2001 From: Vinay Manchundiya Date: Sat, 27 Apr 2019 00:12:03 -0500 Subject: [PATCH 033/113] Final Working Commit --- .../com/anysoftkeyboard/AnySoftKeyboard.java | 2 +- .../ime/AnySoftKeyboardBase.java | 2 +- .../keyboards/views/AnyKeyboardView.java | 2 +- .../keyboards/views/PointerTracker.java | 4 + .../BiAffect/AccelerometerDataWorker.java | 31 +++++ .../anysoftkeyboard/BiAffect/BiAManager.java | 60 ++++---- .../BiAffect/Database/BiADatabaseManager.java | 125 +++++++++++++++++ .../BiAffect/Database/BiAffect_Database.java | 23 ++++ .../Database/DAO/Accelerometer_DAO.java | 12 ++ .../BiAffect/Database/DAO/Device_DAO.java | 15 ++ .../BiAffect/Database/DAO/Key_DAO.java | 12 ++ .../BiAffect/Database/DAO/Session_DAO.java | 17 +++ .../BiAffect/Database/DAO/Touch_DAO.java | 12 ++ .../Database/Models/AccelerometerData.java | 29 ++++ .../BiAffect/Database/Models/DeviceData.java | 37 +++++ .../BiAffect/Database/Models/KeyTypeData.java | 28 ++++ .../BiAffect/Database/Models/SessionData.java | 18 +++ .../Database/Models/TouchTypeData.java | 46 +++++++ .../anysoftkeyboard/BiAffect/Finaliser.java | 46 +++---- .../BiAffect/KeyDataWorker.java | 13 +- .../BiAffect/TouchDataWorker.java | 18 ++- .../BiAffectDB/BiAffectDB.java | 43 ------ .../BiAffectDB/BiAffectDBInterface.java | 49 ------- .../BiAffectDB/BiAffectDBManager.java | 128 ------------------ .../BiAffectDB_roomDAO/Accelerometer_DAO.java | 16 --- .../BiAffectDB_roomDAO/Device_DAO.java | 23 ---- .../BiAffectDB_roomDAO/KeyData_DAO.java | 22 --- .../BiAffectDB_roomDAO/Session_DAO.java | 18 --- .../BiAffectDB_roomDAO/Touch_DAO.java | 25 ---- .../AccelerometerData.java | 32 ----- .../BiAffectDB_roomModel/DeviceData.java | 34 ----- .../BiAffectDB_roomModel/KeyData.java | 43 ------ .../BiAffectDB_roomModel/SessionData.java | 19 --- .../BiAffectDB_roomModel/TouchData.java | 69 ---------- 34 files changed, 479 insertions(+), 594 deletions(-) create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/AccelerometerDataWorker.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiADatabaseManager.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiAffect_Database.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Accelerometer_DAO.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Device_DAO.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Key_DAO.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Session_DAO.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Touch_DAO.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/AccelerometerData.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/DeviceData.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/KeyTypeData.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/SessionData.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/TouchTypeData.java delete mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB.java delete mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBInterface.java delete mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDBManager.java delete mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Accelerometer_DAO.java delete mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Device_DAO.java delete mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/KeyData_DAO.java delete mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Session_DAO.java delete mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Touch_DAO.java delete mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/AccelerometerData.java delete mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/DeviceData.java delete mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/KeyData.java delete mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/SessionData.java delete mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/TouchData.java diff --git a/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java b/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java index 0db70983d0..b5795d0a50 100644 --- a/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java +++ b/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java @@ -220,7 +220,7 @@ public void onStartInputView(final EditorInfo attribute, final boolean restartin attribute.imeOptions, attribute.inputType, restarting); super.onStartInputView(attribute, restarting); - BiAManager.getInstance(getApplicationContext()).startSession(); + BiAManager.getInstance(AnyApplication.getAppContext()).startSession(); if (mVoiceRecognitionTrigger != null) { mVoiceRecognitionTrigger.onStartInputView(); } diff --git a/app/src/main/java/com/anysoftkeyboard/ime/AnySoftKeyboardBase.java b/app/src/main/java/com/anysoftkeyboard/ime/AnySoftKeyboardBase.java index 20b6202af5..ead9812ae0 100644 --- a/app/src/main/java/com/anysoftkeyboard/ime/AnySoftKeyboardBase.java +++ b/app/src/main/java/com/anysoftkeyboard/ime/AnySoftKeyboardBase.java @@ -318,7 +318,7 @@ public void hideWindow() { while (handleCloseRequest()) { Logger.i(TAG, "Still have stuff to close. Trying handleCloseRequest again."); } - BiAManager.getInstance(getApplicationContext()).endSession(); + BiAManager.getInstance(AnyApplication.getAppContext()).endSession(); super.hideWindow(); } diff --git a/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardView.java b/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardView.java index 9def3b4e5b..b58ec8aeb0 100644 --- a/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardView.java +++ b/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardView.java @@ -223,7 +223,7 @@ public boolean onTouchEvent(@NonNull MotionEvent me) { // Log.d("CS_TS", " "); //BiAManager.getInstance().recordKeyPressForce(me.getDownTime(), me.getPressure(0),me.getAction()); - BiAManager.getInstance(this.getContext()).addMasterEntry(me.getDownTime(), me.getEventTime(), me.getAction(), me.getPressure(), me.getX(), me.getY(), me.getTouchMajor(), me.getTouchMinor(), me.getPointerCount()); + BiAManager.getInstance(AnyApplication.getAppContext()).addMasterEntry(me.getDownTime(), me.getEventTime(), me.getAction(), me.getPressure(), me.getX(), me.getY(), me.getTouchMajor(), me.getTouchMinor(), me.getPointerCount()); final int action = MotionEventCompat.getActionMasked(me); PointerTracker pointerTracker = getPointerTracker(me); diff --git a/app/src/main/java/com/anysoftkeyboard/keyboards/views/PointerTracker.java b/app/src/main/java/com/anysoftkeyboard/keyboards/views/PointerTracker.java index 7f6eaf1515..c2f00d0e1a 100644 --- a/app/src/main/java/com/anysoftkeyboard/keyboards/views/PointerTracker.java +++ b/app/src/main/java/com/anysoftkeyboard/keyboards/views/PointerTracker.java @@ -25,6 +25,8 @@ import com.anysoftkeyboard.keyboards.AnyKeyboard.AnyKey; import com.anysoftkeyboard.keyboards.Keyboard.Key; import com.anysoftkeyboard.keyboards.views.AnyKeyboardViewBase.KeyPressTimingHandler; +import com.menny.android.anysoftkeyboard.AnyApplication; +import com.menny.android.anysoftkeyboard.BiAffect.BiAManager; import java.util.Locale; @@ -247,6 +249,8 @@ void onDownEvent(int x, int y, long eventTime) { Log.i("CS_BiAffect_K", "EventTime->"+eventTime); Log.i("CS_BiAffect_K", "X->"+x); Log.i("CS_BiAffect_K", "Y->"+y); + Key temp = getKey(keyIndex); + BiAManager.getInstance(AnyApplication.getAppContext()).addKeyDataOnlyDownTime(eventTime, temp.getPrimaryCode(), temp.centerX, temp.centerY, temp.width, temp.height); checkMultiTap(eventTime, keyIndex); if (mListener != null && isValidKeyIndex(keyIndex)) { AnyKey key = (AnyKey) mKeys[keyIndex]; diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/AccelerometerDataWorker.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/AccelerometerDataWorker.java new file mode 100644 index 0000000000..315819e0cc --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/AccelerometerDataWorker.java @@ -0,0 +1,31 @@ +package com.menny.android.anysoftkeyboard.BiAffect; + +import android.util.Log; + +import com.menny.android.anysoftkeyboard.BiAffect.Database.BiADatabaseManager; + +public class AccelerometerDataWorker implements Runnable { + BiAManager sharedInstance; + BiADatabaseManager mBiADatabaseManager; + final int FREQUENCY = 10; + final int oneSecondMillis = 1000; + public AccelerometerDataWorker(BiADatabaseManager databaseManager){ + super(); + sharedInstance = BiAManager.getInstance(null); + mBiADatabaseManager = databaseManager; + } + + @Override + public void run() { + while(sharedInstance.sessionRunning){ + long currentTime = System.currentTimeMillis(); + mBiADatabaseManager.insertAccelerometerData(currentTime, sharedInstance.current_accelerometer_x, sharedInstance.current_accelerometer_y, sharedInstance.current_accelerometer_z); + Log.i("ACC", "PUSHED"); + try { + Thread.sleep(oneSecondMillis/FREQUENCY); + }catch (InterruptedException e){ + //Do nothing + } + } + } +} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java index b9a105dee9..ff03f5e06d 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java @@ -1,17 +1,17 @@ package com.menny.android.anysoftkeyboard.BiAffect; +import android.arch.persistence.room.Room; import android.content.Context; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; +import android.os.Build; +import android.util.DisplayMetrics; import android.util.Log; -import com.menny.android.anysoftkeyboard.AnyApplication; -import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB; -import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDBManager; -import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.KeyData; -import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.SessionData; -import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.TouchData; +import com.menny.android.anysoftkeyboard.BiAffect.Database.BiADatabaseManager; +import com.menny.android.anysoftkeyboard.BiAffect.Database.BiAffect_Database; +import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.SessionData; import java.util.LinkedHashMap; import java.util.concurrent.ArrayBlockingQueue; @@ -49,20 +49,8 @@ public class BiAManager implements BiADataProcessorInterface.TouchDataProcessorI long currentRunningSession; boolean sessionRunning; - - // DB related variables - /** - * Created by Sreetama Banerjee on 4/22/2019. - * reason : to allow all components of project to get appcontext - */ - Context contextdb = AnyApplication.getAppContext(); - - /** - * Created by Sreetama Banerjee on 4/22/2019. - * reason : getting instance of database manager class - */ - private static BiAffectDBManager DBMngrINSTANCE; - SessionData sessdata; + //Database + BiADatabaseManager mBiADatabaseManager; @Override public void onSensorChanged(SensorEvent event) { @@ -94,8 +82,8 @@ static class FeatureLookupStruct{ private BiAManager(Context context){ this.mContext = context; //This will initialise the dbManager when the constructor of BiAManager is called... - BiAffectDBManager.getInstance(); //This wont contain anything as such + this.myTupleQueue = new ArrayBlockingQueue<>(10000); this.processingMap = new LinkedHashMap<>(); this.finalPOJOMap = new LinkedHashMap<>(); @@ -124,6 +112,23 @@ private BiAManager(Context context){ //This should be done when the session starts and undone when the session ends mSensorManager.registerListener(this, mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 10); + + //DB + mBiADatabaseManager = BiADatabaseManager.getInstance(mContext); + + //call to send the device data to db + sendDeviceData(); + } + + public void sendDeviceData(){ + Log.i("DEVICEDATA", "CALLING"); + Thread temp = new Thread(new Runnable() { + @Override + public void run() { + mBiADatabaseManager.insertDeviceData(mContext); + } + }); + temp.start(); } public static synchronized BiAManager getInstance(Context mContext) @@ -152,12 +157,17 @@ public boolean startSession(){ this.sessionRunning = true; this.currentRunningSession = System.currentTimeMillis(); Log.i("CS_BiAffect_S","startTime -> "+currentRunningSession); + + Thread accelerometerDataCollector = new Thread(new AccelerometerDataWorker(mBiADatabaseManager)); + accelerometerDataCollector.start(); + Thread temp = new Thread(new Runnable() { @Override public void run() { - BiAffectDBManager.getInstance().insertSessionStartTime(currentRunningSession); + mBiADatabaseManager.insertSessionData(currentRunningSession); } }); + temp.start(); Log.i("CS_BiAffect_S","-----------Start SESSION End-------------"); return true; } @@ -167,7 +177,7 @@ public boolean endSession(){ Log.i("CS_BiAffect_E","-----------END SESSION START-------------"); this.sessionRunning = false; long sessionEndTime = System.currentTimeMillis(); - Thread temp = new Thread(new Finaliser(this.currentRunningSession, sessionEndTime)); + Thread temp = new Thread(new Finaliser(this.currentRunningSession, sessionEndTime, mBiADatabaseManager)); temp.start(); Log.i("CS_BiAffect_E","-----------END SESSION END-------------"); return true; @@ -220,7 +230,7 @@ public boolean addMasterEntry(long eventDownTime, long eventTime, int eventActio //We can kickoff a worker thread from here to take all the pojos and insert it into the database //We will pass the number of the last buffer being used and then expect the thread to infer from that which one //needs to be emptied - Thread t = new Thread(new TouchDataWorker(this.bucket1)); + Thread t = new Thread(new TouchDataWorker(this.bucket1, mBiADatabaseManager)); t.start(); //Time to change the buffer and put all the things in the second from next this.currentIndex = 0; @@ -278,7 +288,7 @@ public boolean addKeyDataOnlyDownTime(long eventDownTime, int keyType, float key //We can kickoff a worker thread from here to take all the pojos and insert it into the database //We will pass the number of the last buffer being used and then expect the thread to infer from that which one //needs to be emptied - Thread t = new Thread(new KeyDataWorker(this.bucketk1)); + Thread t = new Thread(new KeyDataWorker(this.bucketk1, mBiADatabaseManager)); t.start(); //Time to change the buffer and put all the things in the second from next this.currentIndexKey = 0; diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiADatabaseManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiADatabaseManager.java new file mode 100644 index 0000000000..451945559d --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiADatabaseManager.java @@ -0,0 +1,125 @@ +package com.menny.android.anysoftkeyboard.BiAffect.Database; + +import android.arch.persistence.room.Room; +import android.content.Context; +import android.os.Build; +import android.util.DisplayMetrics; +import android.util.Log; + +import com.menny.android.anysoftkeyboard.BiAffect.Database.DAO.Device_DAO; +import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.AccelerometerData; +import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.DeviceData; +import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.KeyTypeData; +import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.SessionData; +import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.TouchTypeData; + +public class BiADatabaseManager { + + private static BiADatabaseManager sharedInstance; + private static BiAffect_Database mDatabaseInstance; + + public static synchronized BiADatabaseManager getInstance(Context appContext) { + if(sharedInstance==null){ + sharedInstance = new BiADatabaseManager(appContext); + } + return sharedInstance; + } + + private BiADatabaseManager(Context appContext) { + mDatabaseInstance = Room.databaseBuilder(appContext, BiAffect_Database.class, "BiAffect_Database.db") + .fallbackToDestructiveMigration() + .build(); + + } + + //exposed API for Session + public void insertSessionData(long sessionStartTime){ + SessionData currentSessionData = new SessionData(); + currentSessionData.sessionStartTime = sessionStartTime; + mDatabaseInstance.mSession_dao().insertSessionStartTime(currentSessionData); + } + + public void updateSessionData(long sessionStartTime, long sessionEndTime){ + SessionData currentSessionData = new SessionData(); + currentSessionData.sessionStartTime = sessionStartTime; + currentSessionData.sessionEndTime = sessionEndTime; + mDatabaseInstance.mSession_dao().updateSessionEndTime(currentSessionData); + } + + //exposed Api for touch data + public void insertTouchData(long eventDownTime, long eventTime, int eventAction, float pressure, float x_cord, float y_cord, float majorAxis, float minorAxis){ + TouchTypeData data = new TouchTypeData(); + data.eventDownTime = eventDownTime; + data.eventActionTime = eventTime; + data.eventAction = eventAction; + data.force = pressure; + data.touch_xcord = x_cord; + data.touch_ycord = y_cord; + data.touch_majorAxis = majorAxis; + data.touch_minorAxis = minorAxis; + mDatabaseInstance.mTouch_dao().insertSingleTouchDataEntry(data); + } + + //exposed api for keydata + public void insertKeyData(long keyDownTime, int keyCode, float centre_X, float centre_Y, float width, float height){ + KeyTypeData data = new KeyTypeData(); + data.keyDownTime_id = keyDownTime; + data.keyTypeCode = keyCode; + data.keyCentre_X = centre_X; + data.keyCentre_Y = centre_Y; + data.key_Width = width; + data.key_Height = height; + + mDatabaseInstance.mKey_dao().insertSingleKeyData(data); + } + + //accelerometer exposed apis + public void insertAccelerometerData(long time, float x, float y, float z){ + AccelerometerData data = new AccelerometerData(); + data.time = time; + data.Acc_X = x; + data.Acc_Y = y; + data.Acc_Z = z; + mDatabaseInstance.mAccelerometer_dao().insertAccelerometerData(data); + } + + //api exposed for Device Data + public void insertDeviceData(Context c){ + int size=-1; + try { + size = mDatabaseInstance.mDevice_dao().getAllIds().length; + Log.i("DEVICEDATA", " "+size); + }catch (Exception e){ + Log.i("DEVICEDATA", "EXCEPTION"+e.getLocalizedMessage()); + } + + if(size==0){ + //insert the data into db + String release = Build.VERSION.RELEASE; + int sdkVersion = Build.VERSION.SDK_INT; + String FINALVERSION = "Android SDK: " + sdkVersion + " (" + release +")"; + + DisplayMetrics metrics = c.getResources().getDisplayMetrics(); + int densityDPI = metrics.densityDpi; + float densityLogical = metrics.density; + int widthPixels = metrics.widthPixels; + int heightPixels = metrics.heightPixels; + String manufacturer = Build.MANUFACTURER; + String model = Build.MODEL; + + DeviceData data = new DeviceData(); + data.androidVersion = FINALVERSION; + data.pixelDensityDpi = densityDPI; + data.pixelDensityLogical = densityLogical; + data.deviceWidthPixel = widthPixels; + data.deviceHeightPixel = heightPixels; + data.manufacturer = manufacturer; + data.phoneModel = model; + + mDatabaseInstance.mDevice_dao().insertDeviceData(data); + + + + } + } +} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiAffect_Database.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiAffect_Database.java new file mode 100644 index 0000000000..15a55edbe9 --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiAffect_Database.java @@ -0,0 +1,23 @@ +package com.menny.android.anysoftkeyboard.BiAffect.Database; + +import android.arch.persistence.room.*; + +import com.menny.android.anysoftkeyboard.BiAffect.Database.DAO.Accelerometer_DAO; +import com.menny.android.anysoftkeyboard.BiAffect.Database.DAO.Device_DAO; +import com.menny.android.anysoftkeyboard.BiAffect.Database.DAO.Key_DAO; +import com.menny.android.anysoftkeyboard.BiAffect.Database.DAO.Session_DAO; +import com.menny.android.anysoftkeyboard.BiAffect.Database.DAO.Touch_DAO; +import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.AccelerometerData; +import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.DeviceData; +import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.KeyTypeData; +import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.SessionData; +import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.TouchTypeData; + +@Database(entities = {SessionData.class, TouchTypeData.class, KeyTypeData.class, AccelerometerData.class, DeviceData.class}, version = 1, exportSchema = false) +public abstract class BiAffect_Database extends RoomDatabase { + public abstract Session_DAO mSession_dao(); + public abstract Touch_DAO mTouch_dao(); + public abstract Key_DAO mKey_dao(); + public abstract Accelerometer_DAO mAccelerometer_dao(); + public abstract Device_DAO mDevice_dao(); +} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Accelerometer_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Accelerometer_DAO.java new file mode 100644 index 0000000000..257e8668fc --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Accelerometer_DAO.java @@ -0,0 +1,12 @@ +package com.menny.android.anysoftkeyboard.BiAffect.Database.DAO; + +import android.arch.persistence.room.Dao; +import android.arch.persistence.room.Insert; + +import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.AccelerometerData; + +@Dao +public interface Accelerometer_DAO { + @Insert + void insertAccelerometerData(AccelerometerData data); +} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Device_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Device_DAO.java new file mode 100644 index 0000000000..13c106c5a5 --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Device_DAO.java @@ -0,0 +1,15 @@ +package com.menny.android.anysoftkeyboard.BiAffect.Database.DAO; + +import android.arch.persistence.room.Dao; +import android.arch.persistence.room.Insert; +import android.arch.persistence.room.Query; + +import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.DeviceData; + +@Dao +public interface Device_DAO { + @Insert + void insertDeviceData(DeviceData data); + @Query("SELECT id FROM DeviceData") + int[] getAllIds(); +} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Key_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Key_DAO.java new file mode 100644 index 0000000000..ae6993a99f --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Key_DAO.java @@ -0,0 +1,12 @@ +package com.menny.android.anysoftkeyboard.BiAffect.Database.DAO; + +import android.arch.persistence.room.Dao; +import android.arch.persistence.room.Insert; + +import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.KeyTypeData; + +@Dao +public interface Key_DAO { + @Insert + void insertSingleKeyData(KeyTypeData data); +} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Session_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Session_DAO.java new file mode 100644 index 0000000000..cf0ecd34a0 --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Session_DAO.java @@ -0,0 +1,17 @@ +package com.menny.android.anysoftkeyboard.BiAffect.Database.DAO; + +import android.arch.persistence.room.*; + +import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.SessionData; + +@Dao +public interface Session_DAO { + @Insert + void insertSessionStartTime(SessionData currentSessionData); + @Update + int updateSessionEndTime(SessionData currentSessionData); + @Query("SELECT * FROM SESSIONDATA") + SessionData[] getAll(); + + +} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Touch_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Touch_DAO.java new file mode 100644 index 0000000000..0a7369d574 --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Touch_DAO.java @@ -0,0 +1,12 @@ +package com.menny.android.anysoftkeyboard.BiAffect.Database.DAO; + +import android.arch.persistence.room.Dao; +import android.arch.persistence.room.Insert; + +import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.TouchTypeData; + +@Dao +public interface Touch_DAO { + @Insert + void insertSingleTouchDataEntry(TouchTypeData data); +} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/AccelerometerData.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/AccelerometerData.java new file mode 100644 index 0000000000..68919a741b --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/AccelerometerData.java @@ -0,0 +1,29 @@ +package com.menny.android.anysoftkeyboard.BiAffect.Database.Models; + +import android.arch.persistence.room.Entity; +import android.arch.persistence.room.PrimaryKey; + +import io.reactivex.annotations.NonNull; + +@Entity +public class AccelerometerData { + @PrimaryKey(autoGenerate = true) + @NonNull + public int id; + + @NonNull + public long time; + + @NonNull + public float Acc_X; + + @NonNull + public float Acc_Y; + + @NonNull + public float Acc_Z; + + public AccelerometerData(){ + + } +} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/DeviceData.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/DeviceData.java new file mode 100644 index 0000000000..d3655bbef5 --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/DeviceData.java @@ -0,0 +1,37 @@ +package com.menny.android.anysoftkeyboard.BiAffect.Database.Models; + +import android.arch.persistence.room.Entity; +import android.arch.persistence.room.PrimaryKey; + +import io.reactivex.annotations.NonNull; + +@Entity +public class DeviceData { + @PrimaryKey(autoGenerate = true) + public int Id; + + @NonNull + public String androidVersion; + + @NonNull + public float pixelDensityLogical; + + @NonNull + public int pixelDensityDpi; + + @NonNull + public int deviceWidthPixel; + + @NonNull + public int deviceHeightPixel; + + @NonNull + public String manufacturer; + + @NonNull + public String phoneModel; + + public DeviceData(){ + + } +} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/KeyTypeData.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/KeyTypeData.java new file mode 100644 index 0000000000..1c443b51ef --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/KeyTypeData.java @@ -0,0 +1,28 @@ +package com.menny.android.anysoftkeyboard.BiAffect.Database.Models; + +import android.arch.persistence.room.Entity; +import android.arch.persistence.room.PrimaryKey; + +import io.reactivex.annotations.NonNull; + +@Entity +public class KeyTypeData { + @PrimaryKey + @NonNull + public long keyDownTime_id; + + @NonNull + public int keyTypeCode; + + @NonNull + public float keyCentre_X; + + @NonNull + public float keyCentre_Y; + + @NonNull + public float key_Width; + + @NonNull + public float key_Height; +} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/SessionData.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/SessionData.java new file mode 100644 index 0000000000..ef1528023d --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/SessionData.java @@ -0,0 +1,18 @@ +package com.menny.android.anysoftkeyboard.BiAffect.Database.Models; + +import android.arch.persistence.room.*; + +import io.reactivex.annotations.NonNull; + +@Entity +public class SessionData { + @PrimaryKey + @NonNull + public long sessionStartTime; + public long sessionEndTime; + + public SessionData(){ + + } + +} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/TouchTypeData.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/TouchTypeData.java new file mode 100644 index 0000000000..3f2050b440 --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/TouchTypeData.java @@ -0,0 +1,46 @@ +package com.menny.android.anysoftkeyboard.BiAffect.Database.Models; + +import android.arch.persistence.room.ColumnInfo; +import android.arch.persistence.room.Entity; +import android.arch.persistence.room.PrimaryKey; + +import com.menny.android.anysoftkeyboard.BiAffect.TouchDataPOJO; + +import io.reactivex.annotations.NonNull; + +@Entity +public class TouchTypeData { + + @PrimaryKey(autoGenerate = true) + @NonNull + public int id; + + @NonNull + public long eventDownTime; + + @NonNull + public long eventActionTime; + + @NonNull + public int eventAction; + + @NonNull + public float force; + + @NonNull + public float touch_xcord; + + @NonNull + public float touch_ycord; + + @NonNull + public float touch_majorAxis; + + @NonNull + public float touch_minorAxis; + + public TouchTypeData(){ + //Default constructor + } + +} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Finaliser.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Finaliser.java index 665d971899..0116d75b36 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Finaliser.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Finaliser.java @@ -1,10 +1,10 @@ package com.menny.android.anysoftkeyboard.BiAffect; -import android.arch.persistence.room.Room; import android.util.Log; -import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB; -import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDBManager; +import com.menny.android.anysoftkeyboard.BiAffect.Database.BiADatabaseManager; +import com.menny.android.anysoftkeyboard.BiAffect.Database.BiAffect_Database; +import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.SessionData; public class Finaliser implements Runnable { @@ -12,12 +12,14 @@ public class Finaliser implements Runnable { long endTime; BiAManager sharedInstance; int count=0; + BiADatabaseManager mBiADatabaseManager; - public Finaliser(long startTime, long endTime){ + public Finaliser(long startTime, long endTime, BiADatabaseManager databaseManager){ super(); this.startTime = startTime; this.endTime = endTime; this.sharedInstance = BiAManager.getInstance(null); + mBiADatabaseManager = databaseManager; } @Override @@ -35,44 +37,35 @@ public void run() { for(int i=0; i"+count); Log.i("CS_BiAffect_E_T","-----------FINALISER END-------------"); diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/KeyDataWorker.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/KeyDataWorker.java index adfaf1dc06..0b0011686d 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/KeyDataWorker.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/KeyDataWorker.java @@ -2,7 +2,7 @@ import android.util.Log; -import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDBManager; +import com.menny.android.anysoftkeyboard.BiAffect.Database.BiADatabaseManager; import java.util.concurrent.Semaphore; @@ -10,11 +10,11 @@ public class KeyDataWorker implements Runnable { boolean bucketk1; BiAManager sharedInstance; - BiAffectDBManager dbManagerSharedInstance; - - public KeyDataWorker(boolean bucketk1){ + BiADatabaseManager mBiADatabaseManager; + public KeyDataWorker(boolean bucketk1, BiADatabaseManager databaseManager){ super(); this.bucketk1=bucketk1; + mBiADatabaseManager = databaseManager; } @Override @@ -38,11 +38,8 @@ public void run() { Log.i("CS_BiAffect_K","---------KEY BUFFER EMPTY START-----------"+this.bucketk1); for(KeyDataPOJO k:temp){ if(k.used && k.validatePOJO()){ - BiAffectDBManager sharedDbManager = BiAffectDBManager.getInstance(); - sharedDbManager.insertKeyTypeData(k.eventDownTime, k.keyType, k.keyCentre_X, k.keyCentre_Y, k.keyWidth, k.keyHeight); - + mBiADatabaseManager.insertKeyData(k.eventDownTime, k.keyType, k.keyCentre_X, k.keyCentre_Y, k.keyWidth, k.keyHeight); k.markUnused(); - } } }catch (InterruptedException e){ diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java index 96d49e0472..50e6461c68 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/TouchDataWorker.java @@ -1,20 +1,19 @@ package com.menny.android.anysoftkeyboard.BiAffect; -import android.content.Context; import android.util.Log; -import com.menny.android.anysoftkeyboard.AnyApplication; -import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDBManager; -import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.TouchData; +import com.menny.android.anysoftkeyboard.BiAffect.Database.BiADatabaseManager; import java.util.concurrent.Semaphore; public class TouchDataWorker implements Runnable { boolean bucket1; BiAManager sharedInstance; - TouchDataWorker(boolean bucket1){ + BiADatabaseManager mBiADatabaseManager; + TouchDataWorker(boolean bucket1, BiADatabaseManager databaseManager){ super(); this.bucket1 = bucket1; + mBiADatabaseManager = databaseManager; } @Override @@ -32,12 +31,11 @@ public void run() { try { temp_Sempaphore.acquire(); Log.i("CS_BiAffect","-----------BUFFER EMPTY START-------------"+this.bucket1); - for(int i=0; i "+eventDowntime); - TouchData TouchDataObj =new TouchData(); - TouchDataObj.eventDownTime=eventDowntime; - TouchDataObj.eventTime = eventTime; - TouchDataObj.eventAction=eventAction; - TouchDataObj.pressure=pressure; - TouchDataObj.x_cord=x; - TouchDataObj.y_cord=y; - TouchDataObj.major_axis=major_Axis; - TouchDataObj.minor_axis=minor_axis; - mtouchDataDao.insertOnlySingleTouchMetrics(TouchDataObj); - Log.i("CS_BiA_TP_T","End"); - } -// @Override -// public void insertTouchTypeEntryBatch(TouchData[] multi_entry){ -// DBINSTANCE.TouchDataDao().insertMultipleTouchMetrics(multi_entry); -// } - - @Override - public TouchData[] fetchTouchDataRows(long keyId,int motioneventtype){ - return DBINSTANCE.TouchDataDao().fetchTouchData(keyId,motioneventtype); - } - @Override - public void insertSessionStartTime (long startTime){ - Log.i("CS_BiAffect_S_T","startTime -> "+startTime); - SessionData sessionDataObj =new SessionData(); - sessionDataObj.startTime=startTime; - sessionDataObj.endTime=startTime; - DBINSTANCE.SessionDataDao().insertSessionStartTime(sessionDataObj); - Log.i("CS_BiAffect_S_T","Inserted in db"); - } - - @Override - public void updateSessionEndTime(long startTime,long endTime){ - SessionData sessionDataObj =new SessionData(); - sessionDataObj.startTime=startTime; - sessionDataObj.endTime=endTime; - DBINSTANCE.SessionDataDao().insertSessionStartTime(sessionDataObj); - } - - @Override - public void insertKeyTypeData (long keyId,int keytypecode,float x,float y, float width, float height){ - KeyData keyDataObj =new KeyData(); - keyDataObj.eventDownTime=keyId; - keyDataObj.keyType=keytypecode; - keyDataObj.Key_X=x; - keyDataObj.Key_X=y; - keyDataObj.Key_width=width; - keyDataObj.Key_height=height; - DBINSTANCE.KeyDataDAO().insertOnlySingleKeyMetrics(keyDataObj); - } - -// @Override -// public void insertMultipleKeyMetrics (KeyData[] keyDataList){ -// DBINSTANCE.KeyDataDAO().insertMultipleKeyMetrics(keyDataList); -// } - - @Override - public int updateRadiusofTouch(KeyData data){ - return DBINSTANCE.KeyDataDAO().updateRadiusofTouch(data); - } - - @Override - public void insertDeviceData (DeviceData single_entry){ - DBINSTANCE.DeviceDataDAO().insertDeviceData(single_entry); - } - - @Override - public int fetchDeviceId(){ - return DBINSTANCE.DeviceDataDAO().fetchDeviceId(); - } - - @Override - public void insertOnlySingleAccelerometerEntry (AccelerometerData single_entry){ - DBINSTANCE.AccelDataDAO().insertOnlySingleAccelerometerEntry(single_entry); - } - - @Override - public void insertMultipleAccelerometerEntry (AccelerometerData[] DataList){ - DBINSTANCE.AccelDataDAO().insertMultipleAccelerometerEntry(DataList); - } -} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Accelerometer_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Accelerometer_DAO.java deleted file mode 100644 index 4d9b77c368..0000000000 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Accelerometer_DAO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomDAO; - -import android.arch.persistence.room.Dao; -import android.arch.persistence.room.Insert; - -import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.AccelerometerData; - - -@Dao -public interface Accelerometer_DAO { - - @Insert - void insertOnlySingleAccelerometerEntry (AccelerometerData single_entry); - @Insert - void insertMultipleAccelerometerEntry (AccelerometerData[] DataList); -} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Device_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Device_DAO.java deleted file mode 100644 index 88012feff4..0000000000 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Device_DAO.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomDAO; - -import android.arch.persistence.room.Dao; -import android.arch.persistence.room.Insert; -import android.arch.persistence.room.Query; -import android.arch.persistence.room.Update; - -import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.DeviceData; -import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.TouchData; - -@Dao -public interface Device_DAO { - @Insert - void insertDeviceData (DeviceData single_entry); - - //one thing need to check - read that room throws error if no value returned. Workaround for this. - - //will be required to fetch records to coords check that duplicate data is not inserted. insert only if no records returned. - // as assuming that capturing only 1 device's entries - wrapper will be provided by Sage no need of a where clause. Any entry in table means device data stored. - @Query("SELECT id FROM DeviceData ") - public int fetchDeviceId(); - -} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/KeyData_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/KeyData_DAO.java deleted file mode 100644 index cf9e4ef26c..0000000000 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/KeyData_DAO.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomDAO; - -import android.arch.persistence.room.Dao; -import android.arch.persistence.room.Insert; -import android.arch.persistence.room.Update; - -import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.KeyData; - -@Dao -public interface KeyData_DAO { - - @Insert - void insertOnlySingleKeyMetrics (KeyData single_entry); - @Insert - void insertMultipleKeyMetrics (KeyData[] keyDataList); - - //for radius one way of adding to DB will be update at end of session. Creating the stub as placeholder for now - //not required but kept return type int so that Roomreturns number of rows edited. This will help in debugging - @Update - public int updateRadiusofTouch(KeyData data); - -} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Session_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Session_DAO.java deleted file mode 100644 index f1ccf3c3eb..0000000000 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Session_DAO.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomDAO; - -import android.arch.persistence.room.Dao; -import android.arch.persistence.room.Insert; -import android.arch.persistence.room.Update; - -import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.SessionData; - -@Dao -public interface Session_DAO { - - //while implementing we will have to add starttime as end time as end time and later update it - @Insert - void insertSessionStartTime (SessionData single_entry); - - @Update - void updateSessionEndTime(SessionData data); -} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Touch_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Touch_DAO.java deleted file mode 100644 index cd8040f168..0000000000 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomDAO/Touch_DAO.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomDAO; - -import android.arch.persistence.room.Dao; -import android.arch.persistence.room.Insert; -import android.arch.persistence.room.Query; - -import com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel.TouchData; -/** - * Created by Sreetama Banerjee on 4/22/2019. - * reason : room DAO - */ - -@Dao -public interface Touch_DAO { - - @Insert - void insertOnlySingleTouchMetrics (TouchData single_entry); - @Insert - void insertMultipleTouchMetrics (TouchData[] touchDataList); - - //will be required to fetch X Y coords during Key data update - @Query("SELECT * FROM TouchTypeData WHERE Key_down_time= :keyId"+" AND Key_Event_Action= :motioneventtype") - public TouchData[] fetchTouchData(long keyId,int motioneventtype); - -} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/AccelerometerData.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/AccelerometerData.java deleted file mode 100644 index f879f798b3..0000000000 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/AccelerometerData.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel; - -import android.arch.persistence.room.ColumnInfo; -import android.arch.persistence.room.Entity; -import android.arch.persistence.room.PrimaryKey; -import android.support.annotation.NonNull; - -@Entity -public class AccelerometerData { - - @PrimaryKey(autoGenerate = true) - @NonNull - @ColumnInfo(name = "id") - public long id; - - @NonNull - @ColumnInfo(name = "Key_press_time") - public long eventTime; - - @NonNull - @ColumnInfo(name = "accelerometer_x") - public float accelerometer_x; - - @NonNull - @ColumnInfo(name = "accelerometer_y") - public float accelerometer_y; - - @NonNull - @ColumnInfo(name = "accelerometer_z") - public float accelerometer_z; - -} diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/DeviceData.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/DeviceData.java deleted file mode 100644 index ea4687e284..0000000000 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/DeviceData.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel; - - -import android.arch.persistence.room.ColumnInfo; -import android.arch.persistence.room.Entity; -import android.arch.persistence.room.PrimaryKey; -import android.support.annotation.NonNull; - -@Entity(tableName = "DeviceData") -public class DeviceData { - - @PrimaryKey(autoGenerate = true) - @NonNull - @ColumnInfo(name = "id") - public long id; - - @NonNull - @ColumnInfo(name = "Pixel_Density") - public float density; - - @NonNull - @ColumnInfo(name = "Screen_Size") - public float size; - - @NonNull - @ColumnInfo(name = "Phone_model") - public String modelname; - - - - - -} - diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/KeyData.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/KeyData.java deleted file mode 100644 index 738a74dff7..0000000000 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/KeyData.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel; - -import android.arch.persistence.room.ColumnInfo; -import android.arch.persistence.room.Entity; -import android.arch.persistence.room.PrimaryKey; -import android.support.annotation.NonNull; - -@Entity(tableName = "KeyTypeData") -public class KeyData -{ - @PrimaryKey - @NonNull - @ColumnInfo(name = "Key_Id") - public long eventDownTime; - - //will later need to add some mapping functionality key - type - @NonNull - @ColumnInfo(name = "Key_Type") - public int keyType; - - @ColumnInfo(name = "radius%_of_key_downp_ress") - public float radius_percent; - - @NonNull - @ColumnInfo(name = "Key_Center_X") - public float Key_X; - - @NonNull - @ColumnInfo(name = "Key_Center_Y") - public float Key_Y; - - @NonNull - @ColumnInfo(name = "Key_Width") - public float Key_width; - - @NonNull - @ColumnInfo(name = "Key_Height") - public float Key_height; - - // we need to capture time of key up as well cause they need duration of a key press. Need to discuss with Viru. -} - - diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/SessionData.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/SessionData.java deleted file mode 100644 index f8104bf9e2..0000000000 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/SessionData.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel; - -import android.arch.persistence.room.ColumnInfo; -import android.arch.persistence.room.Entity; -import android.arch.persistence.room.PrimaryKey; -import android.support.annotation.NonNull; - -@Entity -public class SessionData { - - @PrimaryKey - @NonNull - @ColumnInfo(name = "Session_start_time") - public long startTime; - - @NonNull - @ColumnInfo(name = "Session_end_time") - public long endTime; -} \ No newline at end of file diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/TouchData.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/TouchData.java deleted file mode 100644 index dc7fa7b88e..0000000000 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffectDB/BiAffectDB_roomModel/TouchData.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.menny.android.anysoftkeyboard.BiAffectDB.BiAffectDB_roomModel; - -import android.arch.persistence.room.ColumnInfo; -import android.arch.persistence.room.Entity; -import android.arch.persistence.room.PrimaryKey; -import android.support.annotation.NonNull; - -//@Entity(foreignKeys = @ForeignKey(entity = KeyData.class, -// parentColumns = "Key_Id", -// childColumns = "KeyId", -// onDelete = ForeignKey.NO_ACTION), -// indices = {@Index("KeyId"), -// @Index(value = {"KeyId"})}) -@Entity(tableName = "TouchTypeData") -public class TouchData { - - //Every field that's stored in the database needs to be either public or have a "getter" method. should not make primary key public but do not want to provide getter and setters for id. - @PrimaryKey(autoGenerate = true) - @NonNull - @ColumnInfo(name = "Id") - public int Id; - - //keydownpress rename - @NonNull - @ColumnInfo(name = "Key_down_time") - public long eventDownTime; - - @NonNull - @ColumnInfo(name = "Key_current_time") - public long eventTime; - - @NonNull - @ColumnInfo(name = "Key_Event_Action") - public int eventAction; - - @NonNull - @ColumnInfo(name = "Force_of_Touch") - public float pressure; - - @NonNull - @ColumnInfo(name = "Key_press_X_cord") - public float x_cord; - - @NonNull - @ColumnInfo(name = "Key_press_Y_cord") - public float y_cord; - - @NonNull - @ColumnInfo(name = "Key_toucharea_Major_axis") - public float major_axis; - - @NonNull - @ColumnInfo(name = "Key_toucharea_Minor_axis") - public float minor_axis; - - - public TouchData() { - // default constructor - // no setter method or initialising in constructor required as primary key is autogenarated - - } - - // to get the PK value - public int getId() { return Id; } - - -} - - From fd013f2f38b4734359b5e4b005f54403a3440138 Mon Sep 17 00:00:00 2001 From: Vinay Manchundiya Date: Sat, 27 Apr 2019 00:38:10 -0500 Subject: [PATCH 034/113] Time stamps adjusted --- .../anysoftkeyboard/BiAffect/BiAManager.java | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java index ff03f5e06d..1409b46589 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java @@ -6,6 +6,7 @@ import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Build; +import android.os.SystemClock; import android.util.DisplayMetrics; import android.util.Log; @@ -13,6 +14,7 @@ import com.menny.android.anysoftkeyboard.BiAffect.Database.BiAffect_Database; import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.SessionData; +import java.time.Instant; import java.util.LinkedHashMap; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Semaphore; @@ -52,6 +54,11 @@ public class BiAManager implements BiADataProcessorInterface.TouchDataProcessorI //Database BiADatabaseManager mBiADatabaseManager; + //TIME OFFSETS + long birthTime; + long upTimeAtBirth; + long offset; + @Override public void onSensorChanged(SensorEvent event) { if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){ @@ -80,6 +87,10 @@ static class FeatureLookupStruct{ private BiAManager(Context context){ + this.birthTime = System.currentTimeMillis(); + this.upTimeAtBirth = SystemClock.uptimeMillis(); + this.offset = birthTime - upTimeAtBirth; + this.mContext = context; //This will initialise the dbManager when the constructor of BiAManager is called... //This wont contain anything as such @@ -201,8 +212,8 @@ public boolean addMasterEntry(long eventDownTime, long eventTime, int eventActio //lock the buffer, if lock fails, there is something wrong with the code try { temp_Semaphore.acquire(); - temp[currentIndex].eventDownTime = eventDownTime; - temp[currentIndex].eventTime = eventTime; + temp[currentIndex].eventDownTime = eventDownTime + offset; + temp[currentIndex].eventTime = eventTime + offset; temp[currentIndex].eventAction = eventAction; temp[currentIndex].pressure = pressure; temp[currentIndex].x_cord = x_cord; @@ -264,8 +275,8 @@ public boolean addKeyDataOnlyDownTime(long eventDownTime, int keyType, float key //Lock the semaphore try { temp_Semaphore.acquire(); - temp[currentIndexKey].eventDownTime = eventDownTime; - temp[currentIndexKey].eventUpTime = 0; + temp[currentIndexKey].eventDownTime = eventDownTime + offset; + temp[currentIndexKey].eventUpTime = 0 + offset; temp[currentIndexKey].keyType = keyType; temp[currentIndexKey].keyCentre_X = keyCentre_X; temp[currentIndexKey].keyCentre_Y = keyCentre_Y; From 7c0cca8a881c42e4539e45f3f4c0e76e7e5c28a3 Mon Sep 17 00:00:00 2001 From: Vinay Manchundiya Date: Fri, 3 May 2019 01:42:07 -0500 Subject: [PATCH 035/113] Code Final With multi touches being handled properly --- .../com/anysoftkeyboard/AnySoftKeyboard.java | 17 +++- .../ime/AnySoftKeyboardBase.java | 7 +- .../keyboards/views/AnyKeyboardView.java | 97 ++++++++++++++----- .../keyboards/views/AnyKeyboardViewBase.java | 6 -- .../AnyKeyboardViewWithMiniKeyboard.java | 2 - .../keyboards/views/PointerTracker.java | 8 +- .../BiAffect/AccelerometerDataWorker.java | 2 +- .../BiAffect/BiADataProcessorInterface.java | 7 +- .../anysoftkeyboard/BiAffect/BiAFeature.java | 8 -- .../anysoftkeyboard/BiAffect/BiAManager.java | 50 ++++------ .../anysoftkeyboard/BiAffect/BiAPOJO.java | 60 ------------ .../anysoftkeyboard/BiAffect/BiAWorker1.java | 78 --------------- .../BiAffect/Database/BiADBInterface.java | 58 +++++++++++ .../BiAffect/Database/BiADatabaseManager.java | 17 +++- .../Database/Models/AccelerometerData.java | 19 +++- .../BiAffect/Database/Models/DeviceData.java | 23 ++++- .../BiAffect/Database/Models/KeyTypeData.java | 23 +++++ .../BiAffect/Database/Models/SessionData.java | 10 ++ .../Database/Models/TouchTypeData.java | 21 +++- .../anysoftkeyboard/BiAffect/Pressure.java | 13 --- 20 files changed, 286 insertions(+), 240 deletions(-) delete mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAFeature.java delete mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAPOJO.java delete mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAWorker1.java create mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiADBInterface.java delete mode 100644 app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Pressure.java diff --git a/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java b/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java index b5795d0a50..be48bd77c8 100644 --- a/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java +++ b/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java @@ -204,6 +204,11 @@ public void onDestroy() { DeveloperUtils.getTraceFile()), Toast.LENGTH_SHORT) .show(); } + if(!BiAManager.getInstance(AnyApplication.getAppContext()).endSession()){ + Log.i("BiAffect", "End Session Failed in hideWindow"); + }else{ + Log.i("BiAffect", "End Session Successfull in hideWindow"); + } super.onDestroy(); } @@ -219,8 +224,13 @@ public void onStartInputView(final EditorInfo attribute, final boolean restartin Logger.v(TAG, "onStartInputView(EditorInfo{imeOptions %d, inputType %d}, restarting %s", attribute.imeOptions, attribute.inputType, restarting); + if(!BiAManager.getInstance(AnyApplication.getAppContext()).startSession()){ + Log.i("BiAffect", "Start Session Failed"); + }else{ + Log.i("BiAffect", "Start Session Successfull"); + } + super.onStartInputView(attribute, restarting); - BiAManager.getInstance(AnyApplication.getAppContext()).startSession(); if (mVoiceRecognitionTrigger != null) { mVoiceRecognitionTrigger.onStartInputView(); } @@ -1131,6 +1141,11 @@ private void showOptionsMenu() { @Override public void onConfigurationChanged(Configuration newConfig) { + if(!BiAManager.getInstance(AnyApplication.getAppContext()).endSession()){ + Log.i("BiAffect", "End Session Failed"); + }else{ + Log.i("BiAffect", "End Session Successfull"); + } super.onConfigurationChanged(newConfig); if (newConfig.orientation != mOrientation) { mOrientation = newConfig.orientation; diff --git a/app/src/main/java/com/anysoftkeyboard/ime/AnySoftKeyboardBase.java b/app/src/main/java/com/anysoftkeyboard/ime/AnySoftKeyboardBase.java index ead9812ae0..b640d95893 100644 --- a/app/src/main/java/com/anysoftkeyboard/ime/AnySoftKeyboardBase.java +++ b/app/src/main/java/com/anysoftkeyboard/ime/AnySoftKeyboardBase.java @@ -25,6 +25,7 @@ import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StringRes; +import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; @@ -318,7 +319,6 @@ public void hideWindow() { while (handleCloseRequest()) { Logger.i(TAG, "Still have stuff to close. Trying handleCloseRequest again."); } - BiAManager.getInstance(AnyApplication.getAppContext()).endSession(); super.hideWindow(); } @@ -327,6 +327,11 @@ public void onDestroy() { mInputSessionDisposables.dispose(); if (getInputView() != null) getInputView().onViewNotRequired(); mInputView = null; + if(!BiAManager.getInstance(AnyApplication.getAppContext()).endSession()){ + Log.i("BiAffect", "End Session Failed in destroy"); + }else{ + Log.i("BiAffect", "End Session Successfull in destroy"); + } super.onDestroy(); } diff --git a/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardView.java b/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardView.java index b58ec8aeb0..b59a934be0 100644 --- a/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardView.java +++ b/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardView.java @@ -54,6 +54,7 @@ import com.menny.android.anysoftkeyboard.R; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public class AnyKeyboardView extends AnyKeyboardViewWithExtraDraw implements InputViewBinder{ @@ -63,6 +64,9 @@ public class AnyKeyboardView extends AnyKeyboardViewWithExtraDraw implements Inp public static final int DEFAULT_EXTENSION_POINT = -5; private AnimationsLevel mAnimationLevel; + //BiAffect Specific Data Structures + HashMap idToDownTimeMap = new HashMap<>(); + private boolean mExtensionVisible = false; private int mExtensionKeyboardYActivationPoint; private final int mExtensionKeyboardPopupOffset; @@ -195,37 +199,15 @@ public boolean onTouchEvent(@NonNull MotionEvent me) { //I mean, if there isn't any keyboard I'm handling, what's the point? return false; } - if (areTouchesDisabled(me)) { mGestureTypingPathShouldBeDrawn = false; return super.onTouchEvent(me); } - Long tsLong = System.currentTimeMillis(); - //Log.d(" -> ", tsLong.toString()); - //Log.d("CS", Log.getStackTraceString(new Exception())); - - Log.d("CS_KD_OTE", " "+ me.getAction() + " "+tsLong); - - //TestCode for BiAffect -// Log.d("CS_TS -> Pointer Count", me.getPointerCount() + " "); -// Log.d("CS_TS -> Cords", me.getX() + ","+ me.getY()); -// Log.d("CS_TS -> RAW Cords", me.getRawX() + ","+ me.getRawY()); -// Log.d("CS_TS -> View Cords", this.getX() + ","+ this.getY()); -// Log.d("CS_TS -> Action", me.getAction() + " "); -// Log.d("CS_TS -> Cords", me.getX(0) + ","+ me.getY(0)); -// Log.d("CS_TS -> Pressure", me.getPressure(0) + " "); -// Log.d("CS_TS -> MajorAxis", me.getTouchMajor(0) + " "); -// Log.d("CS_TS -> MinorAxis", me.getTouchMinor(0) + " "); -// Log.d("CS_TS -> Size", me.getSize(0) + " "); -// Log.d("CS_TS -> PointerID", me.getPointerId(0) + " "); -// Log.d("CS_TS -> EventTime", me.getDownTime() + " on Action " + me.getAction()); -// Log.d("CS_TS -> EventTimeSys", tsLong.toString() + " on Action " + me.getAction()); -// Log.d("CS_TS", " "); - - //BiAManager.getInstance().recordKeyPressForce(me.getDownTime(), me.getPressure(0),me.getAction()); - BiAManager.getInstance(AnyApplication.getAppContext()).addMasterEntry(me.getDownTime(), me.getEventTime(), me.getAction(), me.getPressure(), me.getX(), me.getY(), me.getTouchMajor(), me.getTouchMinor(), me.getPointerCount()); + final int action = MotionEventCompat.getActionMasked(me); + biAffectTouchDataProbe(me); + PointerTracker pointerTracker = getPointerTracker(me); mGestureTypingPathShouldBeDrawn = pointerTracker.isInGestureTyping(); if (mGestureTypingPathShouldBeDrawn) { @@ -305,6 +287,71 @@ public boolean onTouchEvent(@NonNull MotionEvent me) { } } + public void biAffectTouchDataProbe(android.view.MotionEvent me){ + final int action = MotionEventCompat.getActionMasked(me); + final int index = MotionEventCompat.getActionIndex(me); + long eventDownTime; + int pointerId; + switch (action) { + case MotionEvent.ACTION_DOWN: + pointerId = me.getPointerId(index); + idToDownTimeMap.put(pointerId,me.getEventTime()); + eventDownTime = idToDownTimeMap.get(pointerId); + BiAManager.getInstance(AnyApplication.getAppContext()).addMasterEntry(eventDownTime, me.getEventTime(), action, me.getPressure(index), + me.getX(index), me.getY(index), me.getTouchMajor(index), me.getTouchMinor(index), me.getPointerCount()); + break; + + case MotionEvent.ACTION_MOVE: + pointerId = me.getPointerId(index); + eventDownTime = idToDownTimeMap.get(pointerId); + BiAManager.getInstance(AnyApplication.getAppContext()).addMasterEntry(eventDownTime, me.getEventTime(), action, me.getPressure(index), + me.getX(index), me.getY(index), me.getTouchMajor(index), me.getTouchMinor(index), me.getPointerCount()); + break; + + + case MotionEvent.ACTION_POINTER_DOWN: + pointerId = me.getPointerId(index); + idToDownTimeMap.put(pointerId,me.getEventTime()); + eventDownTime = idToDownTimeMap.get(pointerId); + BiAManager.getInstance(AnyApplication.getAppContext()).addMasterEntry(eventDownTime, me.getEventTime(), MotionEvent.ACTION_DOWN, me.getPressure(index), + me.getX(index), me.getY(index), me.getTouchMajor(index), me.getTouchMinor(index), me.getPointerCount()); + break; + + + case MotionEvent.ACTION_UP: + pointerId = me.getPointerId(index); + eventDownTime = idToDownTimeMap.get(pointerId); + BiAManager.getInstance(AnyApplication.getAppContext()).addMasterEntry(eventDownTime, me.getEventTime(), action, me.getPressure(index), + me.getX(index), me.getY(index), me.getTouchMajor(index), me.getTouchMinor(index), me.getPointerCount()); + break; + + + case MotionEvent.ACTION_POINTER_UP: + pointerId = me.getPointerId(index); + eventDownTime = idToDownTimeMap.get(pointerId); + BiAManager.getInstance(AnyApplication.getAppContext()).addMasterEntry(eventDownTime, me.getEventTime(), MotionEvent.ACTION_UP, me.getPressure(index), + me.getX(index), me.getY(index), me.getTouchMajor(index), me.getTouchMinor(index), me.getPointerCount()); + break; + + + case MotionEvent.ACTION_OUTSIDE: + pointerId = me.getPointerId(index); + eventDownTime = idToDownTimeMap.get(pointerId); + BiAManager.getInstance(AnyApplication.getAppContext()).addMasterEntry(eventDownTime, me.getEventTime(), action, me.getPressure(index), + me.getX(index), me.getY(index), me.getTouchMajor(index), me.getTouchMinor(index), me.getPointerCount()); + break; + + + case MotionEvent.ACTION_CANCEL: + pointerId = me.getPointerId(index); + eventDownTime = idToDownTimeMap.get(pointerId); + BiAManager.getInstance(AnyApplication.getAppContext()).addMasterEntry(eventDownTime, me.getEventTime(), action, me.getPressure(index), me.getX(index), me.getY(index), me.getTouchMajor(index), me.getTouchMinor(index), me.getPointerCount()); + break; + + } + + } + @Override protected void onUpEvent(PointerTracker tracker, int x, int y, long eventTime) { diff --git a/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardViewBase.java b/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardViewBase.java index f94d72908b..1caf575852 100644 --- a/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardViewBase.java +++ b/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardViewBase.java @@ -1759,10 +1759,6 @@ public boolean onTouchEvent(@NonNull MotionEvent nativeMotionEvent) { tracker.onMoveEvent((int) nativeMotionEvent.getX(i), (int) nativeMotionEvent.getY(i), eventTime); } } else { - Long tsLong = System.currentTimeMillis()/1000; - Log.d("CS TS -> ", tsLong.toString()); - float fg = nativeMotionEvent.getPressure(); - Log.d("CS TS -> ", fg + " "); PointerTracker tracker = getPointerTracker(id); sendOnXEvent(action, eventTime, x, y, tracker); } @@ -1811,8 +1807,6 @@ protected void onDownEvent(PointerTracker tracker, int x, int y, Log.d("CS TS -> ", tsLong.toString()); mPointerQueue.releaseAllPointersExcept(tracker, eventTime); } - Long tsLong = System.currentTimeMillis()/1000; - Log.d("CS TS -> ", tsLong.toString()); tracker.onDownEvent(x, y, eventTime); mPointerQueue.add(tracker); } diff --git a/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardViewWithMiniKeyboard.java b/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardViewWithMiniKeyboard.java index d9dfd61677..4700aab842 100644 --- a/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardViewWithMiniKeyboard.java +++ b/app/src/main/java/com/anysoftkeyboard/keyboards/views/AnyKeyboardViewWithMiniKeyboard.java @@ -97,8 +97,6 @@ public boolean onTouchEvent(@NonNull MotionEvent me) { translated.recycle(); return true; } - Long tsLong = System.currentTimeMillis()/1000; - Log.d("CS TS -> ", tsLong.toString()); return super.onTouchEvent(me); } diff --git a/app/src/main/java/com/anysoftkeyboard/keyboards/views/PointerTracker.java b/app/src/main/java/com/anysoftkeyboard/keyboards/views/PointerTracker.java index c2f00d0e1a..6956884af4 100644 --- a/app/src/main/java/com/anysoftkeyboard/keyboards/views/PointerTracker.java +++ b/app/src/main/java/com/anysoftkeyboard/keyboards/views/PointerTracker.java @@ -245,12 +245,12 @@ void onDownEvent(int x, int y, long eventTime) { mKeyAlreadyProcessed = false; mIsRepeatableKey = false; mKeyCodesInPathLength = -1; - Log.i("CS_BiAffect_K", "KeyIndex->"+getKey(keyIndex).label.toString()); - Log.i("CS_BiAffect_K", "EventTime->"+eventTime); - Log.i("CS_BiAffect_K", "X->"+x); - Log.i("CS_BiAffect_K", "Y->"+y); + + //BiAffect Code Key Probe Start Key temp = getKey(keyIndex); BiAManager.getInstance(AnyApplication.getAppContext()).addKeyDataOnlyDownTime(eventTime, temp.getPrimaryCode(), temp.centerX, temp.centerY, temp.width, temp.height); + //BiAffect Code Key Probe End + checkMultiTap(eventTime, keyIndex); if (mListener != null && isValidKeyIndex(keyIndex)) { AnyKey key = (AnyKey) mKeys[keyIndex]; diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/AccelerometerDataWorker.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/AccelerometerDataWorker.java index 315819e0cc..edc96831cf 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/AccelerometerDataWorker.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/AccelerometerDataWorker.java @@ -20,7 +20,7 @@ public void run() { while(sharedInstance.sessionRunning){ long currentTime = System.currentTimeMillis(); mBiADatabaseManager.insertAccelerometerData(currentTime, sharedInstance.current_accelerometer_x, sharedInstance.current_accelerometer_y, sharedInstance.current_accelerometer_z); - Log.i("ACC", "PUSHED"); + //Log.i("ACC", "PUSHED"); try { Thread.sleep(oneSecondMillis/FREQUENCY); }catch (InterruptedException e){ diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiADataProcessorInterface.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiADataProcessorInterface.java index a742af062a..9df6ac9f1b 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiADataProcessorInterface.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiADataProcessorInterface.java @@ -39,15 +39,16 @@ interface DeviceDataProcessorInterface{ //This interface is going to put the device specific data in the table, it will only happen once //we need to figureout how can i achieve that //We will be putting in 4 values in here for now, which are android version, pixel density, screen size and phone model + void sendDeviceData(); + } interface SessionDataProcessorInterface{ //This will contain the methods which are specific to record the session of the keyboard, //This will not be processed by any worker thread, instead it will be pushed in to db directly and the id of the current session will be //maintained in the BiAManager.java - //This will contain start session, end session and GyroScope data + boolean startSession(); + boolean endSession(); } - boolean recordKeyPressForce(long eventDownTime, double pressure, int action) throws InterruptedException; - } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAFeature.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAFeature.java deleted file mode 100644 index d3a1c2dc1f..0000000000 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAFeature.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.menny.android.anysoftkeyboard.BiAffect; - -public abstract class BiAFeature { - String TAG; - long id; - int action; -} - diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java index 1409b46589..baddb202aa 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAManager.java @@ -19,9 +19,12 @@ import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.Semaphore; -public class BiAManager implements BiADataProcessorInterface.TouchDataProcessorInterface, BiADataProcessorInterface, SensorEventListener, BiADataProcessorInterface.KeyDataProcessorInterface { - - private BiAWorker1 myCurrentWorker1; +public class BiAManager implements BiADataProcessorInterface.TouchDataProcessorInterface, + BiADataProcessorInterface, SensorEventListener, + BiADataProcessorInterface.KeyDataProcessorInterface, + BiADataProcessorInterface.SessionDataProcessorInterface, + BiADataProcessorInterface.DeviceDataProcessorInterface +{ //Context specific holders Context mContext; @@ -73,18 +76,7 @@ public void onAccuracyChanged(Sensor sensor, int accuracy) { } - //Instead of inner static class we can also use enum - static class FeatureLookupStruct{ - final static String pressure = "PRESSURE"; - //final static String action_key_up = "Up"; - //final static String action_key_down = "Down"; - } - private static BiAManager shared_instance = null; - ArrayBlockingQueue myTupleQueue; - LinkedHashMap processingMap; - LinkedHashMap finalPOJOMap; - private BiAManager(Context context){ this.birthTime = System.currentTimeMillis(); @@ -95,10 +87,6 @@ private BiAManager(Context context){ //This will initialise the dbManager when the constructor of BiAManager is called... //This wont contain anything as such - this.myTupleQueue = new ArrayBlockingQueue<>(10000); - this.processingMap = new LinkedHashMap<>(); - this.finalPOJOMap = new LinkedHashMap<>(); - //Initialising all the buffers this.t1 = new TouchDataPOJO[TOUCH_BUFFER_SIZE]; this.t2 = new TouchDataPOJO[TOUCH_BUFFER_SIZE]; @@ -131,8 +119,9 @@ private BiAManager(Context context){ sendDeviceData(); } + @Override public void sendDeviceData(){ - Log.i("DEVICEDATA", "CALLING"); + //Log.i("DEVICEDATA", "CALLING"); Thread temp = new Thread(new Runnable() { @Override public void run() { @@ -153,21 +142,16 @@ public static synchronized BiAManager getInstance(Context mContext) return shared_instance; } - @Override - public boolean recordKeyPressForce(long eventDownTime, double pressure, int action) throws NullPointerException, InterruptedException{ - System.out.println("BiAffect recordKeyPressForce received for "+eventDownTime+ " For action "+ action); - Pressure myPressure = new Pressure(FeatureLookupStruct.pressure, eventDownTime, pressure, action); - shared_instance.myTupleQueue.put(myPressure); - return true; - } - //Session specific calls + @Override public boolean startSession(){ //check once.. I dont think the event time is stored as milli sec - Log.i("CS_BiAffect_S","-----------Start SESSION START-------------"); + Log.i("CS_BiAffect_Sess","-----------Start SESSION START-------------"); + Log.i("CS_BiAffect_Sess",Log.getStackTraceString(new Exception())); + this.sessionRunning = true; this.currentRunningSession = System.currentTimeMillis(); - Log.i("CS_BiAffect_S","startTime -> "+currentRunningSession); + Log.i("CS_BiAffect_Sess","startTime -> "+currentRunningSession); Thread accelerometerDataCollector = new Thread(new AccelerometerDataWorker(mBiADatabaseManager)); accelerometerDataCollector.start(); @@ -179,18 +163,20 @@ public void run() { } }); temp.start(); - Log.i("CS_BiAffect_S","-----------Start SESSION End-------------"); + Log.i("CS_BiAffect_Sess","-----------Start SESSION End-------------"); return true; } + @Override public boolean endSession(){ if(!this.sessionRunning) return false; - Log.i("CS_BiAffect_E","-----------END SESSION START-------------"); + Log.i("CS_BiAffect_Sess","-----------END SESSION START-------------"); + Log.i("CS_BiAffect_Sess",Log.getStackTraceString(new Exception())); this.sessionRunning = false; long sessionEndTime = System.currentTimeMillis(); Thread temp = new Thread(new Finaliser(this.currentRunningSession, sessionEndTime, mBiADatabaseManager)); temp.start(); - Log.i("CS_BiAffect_E","-----------END SESSION END-------------"); + Log.i("CS_BiAffect_Sess","-----------END SESSION END-------------"); return true; } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAPOJO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAPOJO.java deleted file mode 100644 index 975dd067bc..0000000000 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAPOJO.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.menny.android.anysoftkeyboard.BiAffect; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; - -public class BiAPOJO{ - public HashMap totalRecordMap; - public List pressureValues; - public double finalPressure; - - public enum FeatureSet{ - PRESSURE - } - - public BiAPOJO(){ - this.totalRecordMap = new HashMap<>(); - for(FeatureSet f : FeatureSet.values()){ - totalRecordMap.put(f,false); - } - pressureValues = new ArrayList<>(); - } - - public void addRecord(BiAFeature feature){ - //we will have switch statement for tag of the feature - System.out.println("BiAffect, I am from Pojo, something changed in me"); - switch (feature.TAG){ - case BiAManager.FeatureLookupStruct.pressure: - //this is pressure value, we need to call pressure function and let it do the rest - Pressure currentInstance = (Pressure) feature; - recordPressure(currentInstance.action, currentInstance.value); - - } - } - - public void recordPressure(int action, double value){ - pressureValues.add(value); - System.out.println("BiAffect, recorded pressure value is "+value); - if(action == 1){ - //This means this was ACTION_UP, we need to call finalize pressure - finalizePressure(); - } - } - - private void finalizePressure(){ - //We can traverse through the list and get max or min or avg or whatever required - System.out.println("BiAffect, Pressure got finalised"); - this.finalPressure = Collections.max(pressureValues); - System.out.println("BiAffect, Final pressure value is "+ this.finalPressure); - totalRecordMap.remove(FeatureSet.PRESSURE); - totalRecordMap.put(FeatureSet.PRESSURE, true); - - } - - public void printAllValues(){ - - } -} - diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAWorker1.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAWorker1.java deleted file mode 100644 index 5482763a0e..0000000000 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/BiAWorker1.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.menny.android.anysoftkeyboard.BiAffect; -import android.util.Log; -import java.util.Hashtable; -import java.util.LinkedHashMap; -import java.util.concurrent.ArrayBlockingQueue; - - -public class BiAWorker1 extends Thread{ - - private boolean sessionRunning; - - private long sessionStartTime; - - BiAWorker1(){ - super(); - System.out.println("Session Started with start time to be "+sessionStartTime); - this.sessionStartTime = System.currentTimeMillis(); - sessionRunning = true; - } - - - @Override - public void run(){ - BiAManager managerSharedInstance = BiAManager.getInstance(null); - if(managerSharedInstance != null){ - ArrayBlockingQueue myQueueReference = managerSharedInstance.myTupleQueue; - LinkedHashMap myProcessingMapReference = managerSharedInstance.processingMap; - //Hashtable myFinalPOJOMapReference = managerSharedInstance.finalPOJOMap; - - BiAPOJO referenceHolder; - - while (sessionRunning){ - Log.d("BiA Data Processing", "BiAWorker1 is running"); - try { - BiAFeature currentTuple = myQueueReference.take(); - - if(myProcessingMapReference.containsKey(currentTuple.id)){ - //already present in the map we dont need to create a new pojo instance - System.out.println("BiAffect Pojo already present in map"); - referenceHolder = myProcessingMapReference.get(currentTuple.id); - assert referenceHolder != null; - referenceHolder.addRecord(currentTuple); - }else{ - //create pojo instance - System.out.println("BiAffect Creating new pojo"); - referenceHolder = new BiAPOJO(); - referenceHolder.addRecord(currentTuple); - myProcessingMapReference.put(currentTuple.id, referenceHolder); - } - - if(!referenceHolder.totalRecordMap.containsValue(false)){ - //Now this means that this pojo is ready to be pushed into second buffer - System.out.println("BiAffect A pojo just finished"); - } - - }catch (InterruptedException e) { - //e.printStackTrace(); - } - - try { - Thread.sleep(25);//sleep for 25ms - } catch (InterruptedException e) { - //e.printStackTrace(); - } - } - } else{ - Log.i("CS_BiAffect","Shared instance was null in "+this.getClass().getName()) - ; - } - } - - public void endCurrentSession(){ - long sessionEndTime = System.currentTimeMillis(); - this.sessionRunning = false; - System.out.println("Session Ended with end time to be "+ sessionEndTime); - } -} - diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiADBInterface.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiADBInterface.java new file mode 100644 index 0000000000..bca228ce7d --- /dev/null +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiADBInterface.java @@ -0,0 +1,58 @@ +package com.menny.android.anysoftkeyboard.BiAffect.Database; + +import android.content.Context; + +public interface BiADBInterface { + interface TouchDataInterface { + + //All the calls to process the touch data will be provided over here + // no data processing handled by data collector. raw data sent as parameters. + //EventDownTime + //EventTime + //EventAction + //Pressure of the event + //x_cordinate + //y_cordinate + //major axis + //minor axis + + // Currently according to design, single insert works efficiently. thus only this implemented. + void insertTouchData(long eventDownTime, long eventTime, int eventAction, float pressure, float x_cord, float y_cord, float majorAxis, float minorAxis); + } + + interface KeyDataInterface { + + //All the calls to process the key data will be provided over here + //no data processing handled by data collector. raw data sent as parameters. + // eventDownTime which acts as ID + // keytype code + // key center X + // key center Y + // kry width + //key height + + //Api will be to add a call to record the keyDownTime and the associated key code along with all values + void insertKeyData(long keyDownTime, int keyCode, float centre_X, float centre_Y, float width, float height); + } + + + interface SessionDataInterface { + + //This will contain the methods which are specific to record the session of the keyboard, + + void insertSessionData(long sessionStartTime); + void updateSessionData(long sessionStartTime, long sessionEndTime); + } + + interface AccelerometerData { + // insert accelerometer data sampled every 1/1000th of a second through out a session + void insertAccelerometerData(long time, float x, float y, float z); + } + + interface DeviceData { + //This interface is going to put the device specific data in the table, it will only happen once + // this is handled in the implementation + void insertDeviceData(Context c); + } +} + diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiADatabaseManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiADatabaseManager.java index 451945559d..830476b559 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiADatabaseManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiADatabaseManager.java @@ -6,14 +6,15 @@ import android.util.DisplayMetrics; import android.util.Log; -import com.menny.android.anysoftkeyboard.BiAffect.Database.DAO.Device_DAO; + import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.AccelerometerData; import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.DeviceData; import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.KeyTypeData; import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.SessionData; import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.TouchTypeData; -public class BiADatabaseManager { +public class BiADatabaseManager implements BiADBInterface.TouchDataInterface,BiADBInterface.KeyDataInterface, +BiADBInterface.SessionDataInterface,BiADBInterface.AccelerometerData,BiADBInterface.DeviceData { private static BiADatabaseManager sharedInstance; private static BiAffect_Database mDatabaseInstance; @@ -33,12 +34,14 @@ private BiADatabaseManager(Context appContext) { } //exposed API for Session + @Override public void insertSessionData(long sessionStartTime){ SessionData currentSessionData = new SessionData(); currentSessionData.sessionStartTime = sessionStartTime; mDatabaseInstance.mSession_dao().insertSessionStartTime(currentSessionData); } + @Override public void updateSessionData(long sessionStartTime, long sessionEndTime){ SessionData currentSessionData = new SessionData(); currentSessionData.sessionStartTime = sessionStartTime; @@ -47,6 +50,7 @@ public void updateSessionData(long sessionStartTime, long sessionEndTime){ } //exposed Api for touch data + @Override public void insertTouchData(long eventDownTime, long eventTime, int eventAction, float pressure, float x_cord, float y_cord, float majorAxis, float minorAxis){ TouchTypeData data = new TouchTypeData(); data.eventDownTime = eventDownTime; @@ -61,6 +65,7 @@ public void insertTouchData(long eventDownTime, long eventTime, int eventAction, } //exposed api for keydata + @Override public void insertKeyData(long keyDownTime, int keyCode, float centre_X, float centre_Y, float width, float height){ KeyTypeData data = new KeyTypeData(); data.keyDownTime_id = keyDownTime; @@ -70,10 +75,15 @@ public void insertKeyData(long keyDownTime, int keyCode, float centre_X, float c data.key_Width = width; data.key_Height = height; - mDatabaseInstance.mKey_dao().insertSingleKeyData(data); + try { + mDatabaseInstance.mKey_dao().insertSingleKeyData(data); + }catch(Exception e){ + Log.i("BiAffect", "Exception caught in insertKeyData at "+keyDownTime+ "\n"); + } } //accelerometer exposed apis + @Override public void insertAccelerometerData(long time, float x, float y, float z){ AccelerometerData data = new AccelerometerData(); data.time = time; @@ -84,6 +94,7 @@ public void insertAccelerometerData(long time, float x, float y, float z){ } //api exposed for Device Data + @Override public void insertDeviceData(Context c){ int size=-1; try { diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/AccelerometerData.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/AccelerometerData.java index 68919a741b..7117864dbf 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/AccelerometerData.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/AccelerometerData.java @@ -7,23 +7,40 @@ @Entity public class AccelerometerData { + + //Id is an autogenerated primary key. It keeps track of number of rows in the table @PrimaryKey(autoGenerate = true) @NonNull public int id; + // timestamp in milliseconds when the accelerometer data was recorded @NonNull public long time; + /* + * Acceleration force along the x axis (including gravity). + * Unit of measure : m/s2 + * */ @NonNull public float Acc_X; + /* + * Acceleration force along the y axis (including gravity). + * Unit of measure : m/s2 + * */ @NonNull public float Acc_Y; + /* + * Acceleration force along the z axis (including gravity). + * Unit of measure : m/s2 + * */ @NonNull public float Acc_Z; public AccelerometerData(){ - + //Default constructor + // as all data members are public no need for getter and setter methods. + // each data member defined in an @Entity class must be either public or have a getter method } } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/DeviceData.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/DeviceData.java index d3655bbef5..bc121fd5d6 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/DeviceData.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/DeviceData.java @@ -5,33 +5,54 @@ import io.reactivex.annotations.NonNull; +//@Entity annotates that this class is a table schema and each data member declared in this class corresponds to a table column @Entity public class DeviceData { + + //Id is an autogenerated primary key. It keeps track of number of rows in the table @PrimaryKey(autoGenerate = true) public int Id; + // SDK version and release info @NonNull public String androidVersion; + /* + * The logical density of the display. This is a scaling factor for the Density Independent Pixel unit, + * one DIP is one pixel on an approximately 160 dpi screen (for example a 240x320, 1.5"x2" screen), + * provides the baseline of the system's display. + * Thus on a 160dpi screen this density value will be 1; on a 120 dpi screen it would be .75; etc. + This value does not exactly follow the real screen size (as given by xdpi and ydpi, + rather is used to scale the size of the overall UI in steps based on gross changes in the display dpi. + For example, a 240x320 screen will have a density of 1 even if its width is 1.8", 1.3", etc. + However, if the screen resolution is increased to 320x480 but the screen size remained 1.5"x2" then the density would be increased (probably to 1.5). + * */ @NonNull public float pixelDensityLogical; + // The screen density expressed as dots-per-inch. @NonNull public int pixelDensityDpi; + // The absolute width of the available display size in pixels. @NonNull public int deviceWidthPixel; + // The absolute height of the available display size in pixels. @NonNull public int deviceHeightPixel; + // phone manufacturer information @NonNull public String manufacturer; + // model information @NonNull public String phoneModel; public DeviceData(){ - + //Default constructor + // as all data members are public no need for getter and setter methods. + // each data member defined in an @Entity class must be either public or have a getter method } } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/KeyTypeData.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/KeyTypeData.java index 1c443b51ef..68144b3a81 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/KeyTypeData.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/KeyTypeData.java @@ -5,24 +5,47 @@ import io.reactivex.annotations.NonNull; +/* +For each key pressed, the data related to the key is constant. But each key press has multiple touch events being fired and we are capturing data for each event. +* To avoid having duplicate key data, we have normalised the data of touch and key +* */ + +//@Entity annotates that this class is a table schema and each data member declared in this class corresponds to a table column @Entity public class KeyTypeData { + /*This Column is a foreign key in TouchTypeData Table. + eventDownTime is the time when the motion event - ACTION_DOWN is fired for a touch. + Each key press will have multiple actions associated with it. We store data for each action fired during the course of each key press. + To group the records to the corresponding key press we store the eventdowntime for each data record as eventDownTime is unique for each key press. + */ + /* To correlate the key pressed at each "key press" we are using eventdowntime as a primary key in this table as keyDownTime_id. + Therefore all the records in TouchTypeData Table having eventdowntime value equal to keyDownTime_id value are data collected for that key press + * */ @PrimaryKey @NonNull public long keyDownTime_id; + // We do not store the key pressed. Instead we have grouped the keys into different categories - alphanumeric, backspace, autocorrect, suggestion, other. Codes of these categories are stored. @NonNull public int keyTypeCode; + // The centre of the key pressed - X coord + // In pixels @NonNull public float keyCentre_X; + // The centre of the key pressed - Y coord + // In pixels @NonNull public float keyCentre_Y; + // The width of the key pressed + // In pixels @NonNull public float key_Width; + // The width of the key pressed + // In pixels @NonNull public float key_Height; } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/SessionData.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/SessionData.java index ef1528023d..b82673bfc7 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/SessionData.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/SessionData.java @@ -4,14 +4,24 @@ import io.reactivex.annotations.NonNull; +//@Entity annotates that this class is a table schema and each data member declared in this class corresponds to a table column @Entity public class SessionData { + + // A session starts when the keyboard comes into view + // sessionStartTime is the timestamp in milliseconds when the keybaord comes into view, starting a session @PrimaryKey @NonNull public long sessionStartTime; + + // A session ends when the keyboard goes out of view. + // sessionEndTime is the timestamp in milliseconds when the keybaord goes out of view, ending a session public long sessionEndTime; public SessionData(){ + //Default constructor + // as all data members are public no need for getter and setter methods. + // each data member defined in an @Entity class must be either public or have a getter method } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/TouchTypeData.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/TouchTypeData.java index 3f2050b440..cbe29006e8 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/TouchTypeData.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/Models/TouchTypeData.java @@ -8,39 +8,58 @@ import io.reactivex.annotations.NonNull; +//@Entity annotates that this class is a table schema and each data member declared in this class corresponds to a table column @Entity public class TouchTypeData { - + //Id is an autogenerated primary key. It keeps track of number of rows in the table @PrimaryKey(autoGenerate = true) @NonNull public int id; + /* eventDownTime is the time when the motion event - ACTION_DOWN is fired for a touch. + Each key press will have multiple actions associated with it. We store data for each action fired during the course of each key press. + To group the records to the corresponding key press we store the eventdowntime for each data record as eventDownTime is unique for each key press. + */ @NonNull public long eventDownTime; + // stores the time when this motion event action was fires for the key press. @NonNull public long eventActionTime; + // stores the code for type of motion event action that was fired at that key press. 0 for ACTION_DOWN, 2 for ACTION_MOVE, 1 for ACTION_UP @NonNull public int eventAction; + // stores the pressure of key press recorded at the moment the event action in question was fired. @NonNull public float force; + // stores the point of touch - X coordinate in pixel recorded at the moment the event action in question was fired. @NonNull public float touch_xcord; + // stores the point of touch - Y coordinate in pixel recorded at the moment the event action in question was fired. @NonNull public float touch_ycord; + // stores The length of the major axis of an ellipse that describes the touch area at the point of contact + // recorded at the moment the event action in question was fired. + // the length is reported in pixels @NonNull public float touch_majorAxis; + + // stores The length of the minor axis of an ellipse that describes the touch area at the point of contact + // recorded at the moment the event action in question was fired. + // the length is reported in pixels @NonNull public float touch_minorAxis; public TouchTypeData(){ //Default constructor + // as all data members are public no need for getter and setter methods. + // each data member defined in an @Entity class must be either public or have a getter method } } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Pressure.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Pressure.java deleted file mode 100644 index 1f9f0506d5..0000000000 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Pressure.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.menny.android.anysoftkeyboard.BiAffect; - -public class Pressure extends BiAFeature{ - double value; - - public Pressure(String TAG, long id, double value, int action){ - this.TAG = TAG; - this.id = id; - this.value = value; - this.action = action; - } -} - From 814a7a4ac063c49120f93f303cdde29d80b38751 Mon Sep 17 00:00:00 2001 From: sree Date: Fri, 3 May 2019 10:07:54 -0500 Subject: [PATCH 036/113] . --- .../com/menny/android/anysoftkeyboard/AnyApplication.java | 4 ++++ .../anysoftkeyboard/BiAffect/Database/BiADatabaseManager.java | 3 ++- .../anysoftkeyboard/BiAffect/Database/BiAffect_Database.java | 3 ++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/AnyApplication.java b/app/src/main/java/com/menny/android/anysoftkeyboard/AnyApplication.java index e9ef69cbdb..132044b5c9 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/AnyApplication.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/AnyApplication.java @@ -183,6 +183,9 @@ public void onCreate() { appContext = getApplicationContext(); } + public static Context getAppContext1() { + return appContext; + } @Override @@ -321,6 +324,7 @@ public static RxSharedPrefs prefs(Context context) { * Created by Sreetama Banerjee on 4/22/2019. * reason : to allow all components of project to get appcontext */ + public static Context getAppContext() { return appContext; } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiADatabaseManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiADatabaseManager.java index 451945559d..a41c0e3f21 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiADatabaseManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiADatabaseManager.java @@ -26,7 +26,8 @@ public static synchronized BiADatabaseManager getInstance(Context appContext) { } private BiADatabaseManager(Context appContext) { - mDatabaseInstance = Room.databaseBuilder(appContext, BiAffect_Database.class, "BiAffect_Database.db") + mDatabaseInstance = Room.databaseBuilder(appContext, BiAffect_Database.class, + "BiAffect_Database.db") .fallbackToDestructiveMigration() .build(); diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiAffect_Database.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiAffect_Database.java index 15a55edbe9..14cbd84f98 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiAffect_Database.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiAffect_Database.java @@ -13,7 +13,8 @@ import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.SessionData; import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.TouchTypeData; -@Database(entities = {SessionData.class, TouchTypeData.class, KeyTypeData.class, AccelerometerData.class, DeviceData.class}, version = 1, exportSchema = false) +@Database(entities = {SessionData.class, TouchTypeData.class, KeyTypeData.class, + AccelerometerData.class, DeviceData.class}, version = 1, exportSchema = false) public abstract class BiAffect_Database extends RoomDatabase { public abstract Session_DAO mSession_dao(); public abstract Touch_DAO mTouch_dao(); From 4856cad5e91cddf528755d15a7ce11d02cb55c4a Mon Sep 17 00:00:00 2001 From: sree Date: Fri, 3 May 2019 11:43:15 -0500 Subject: [PATCH 037/113] commented and cleaned up Data base code --- .../BiAffect/Database/BiADatabaseManager.java | 127 ++++++++++++++++-- .../BiAffect/Database/BiAffect_Database.java | 12 ++ .../Database/DAO/Accelerometer_DAO.java | 5 + .../BiAffect/Database/DAO/Device_DAO.java | 15 +++ .../BiAffect/Database/DAO/Key_DAO.java | 6 + .../BiAffect/Database/DAO/Session_DAO.java | 9 ++ .../BiAffect/Database/DAO/Touch_DAO.java | 5 + 7 files changed, 167 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiADatabaseManager.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiADatabaseManager.java index 9e19d6d223..6a8204b306 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiADatabaseManager.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiADatabaseManager.java @@ -13,12 +13,18 @@ import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.SessionData; import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.TouchTypeData; + +// All data processing work handeled here +// calls to room DB and CRUD operations are called from here +// APIs exposed to Data Collection system are defined here. public class BiADatabaseManager implements BiADBInterface.TouchDataInterface,BiADBInterface.KeyDataInterface, BiADBInterface.SessionDataInterface,BiADBInterface.AccelerometerData,BiADBInterface.DeviceData { + private static BiADatabaseManager sharedInstance; private static BiAffect_Database mDatabaseInstance; + // made BiADatabaseManager Singleton. Only one Instance is available throughout execution and shared by everyone. public static synchronized BiADatabaseManager getInstance(Context appContext) { if(sharedInstance==null){ sharedInstance = new BiADatabaseManager(appContext); @@ -27,6 +33,10 @@ public static synchronized BiADatabaseManager getInstance(Context appContext) { } private BiADatabaseManager(Context appContext) { + + // The Room database instance is created inside constructor. + // As the constructor will be called only once the Database in turn, has only one instance created + // This is done to prevent having multiple instances of the database opened at the same time. mDatabaseInstance = Room.databaseBuilder(appContext, BiAffect_Database.class, "BiAffect_Database.db") .fallbackToDestructiveMigration() @@ -34,25 +44,57 @@ private BiADatabaseManager(Context appContext) { } - //exposed API for Session + //exposed API for processing Session data @Override public void insertSessionData(long sessionStartTime){ + + // Creating an object for Session entity class and initialising the data members + // This object will be used as parameter for Room @Insert method + // In essence The object encapsulates the values to be inserted into the table SessionData currentSessionData = new SessionData(); currentSessionData.sessionStartTime = sessionStartTime; - mDatabaseInstance.mSession_dao().insertSessionStartTime(currentSessionData); + + // Add a wrapper for the insert() method for Session Table. + // Insert will throw error is datamembers annotated with @nonnull have null values + // Insert will throw error is datamembers annotated with @primaryKey is a duplicate + // thus in try catch block + try{ + mDatabaseInstance.mSession_dao().insertSessionStartTime(currentSessionData); + }catch (Exception e) + { + // do nothing + } + } @Override - public void updateSessionData(long sessionStartTime, long sessionEndTime){ + public void updateSessionData(long sessionStartTime, long sessionEndTime) { + + // Creating an object for Session entity class and initialising the data members + // This object will be used as parameter for Room @Insert method + // In essence The object encapsulates the values to be updated into the table, + // Room takes the object, extracts value of the data member annotated with @PrimaryKey, + // finds a record in table with that value for the Primary Key column + // If a record matches, that row is updated SessionData currentSessionData = new SessionData(); currentSessionData.sessionStartTime = sessionStartTime; currentSessionData.sessionEndTime = sessionEndTime; - mDatabaseInstance.mSession_dao().updateSessionEndTime(currentSessionData); + + // Add a wrapper for the update() method for Session Table. + try { + mDatabaseInstance.mSession_dao().updateSessionEndTime(currentSessionData); + } catch (Exception e) { + //do nothing + } } //exposed Api for touch data @Override public void insertTouchData(long eventDownTime, long eventTime, int eventAction, float pressure, float x_cord, float y_cord, float majorAxis, float minorAxis){ + + // Creating an object for TouchTypeData entity class and initialising the data members + // This object will be used as parameter for Room @Insert method + // In essence The object encapsulates the values to be inserted into the table TouchTypeData data = new TouchTypeData(); data.eventDownTime = eventDownTime; data.eventActionTime = eventTime; @@ -62,12 +104,25 @@ public void insertTouchData(long eventDownTime, long eventTime, int eventAction, data.touch_ycord = y_cord; data.touch_majorAxis = majorAxis; data.touch_minorAxis = minorAxis; + + // Add a wrapper for the insert() method for TouchTypeData Table. + // Insert will throw error is datamembers annotated with @nonnull have null values + // Insert will throw error is datamembers annotated with @primaryKey is a duplicate + // thus in try catch block + try{ mDatabaseInstance.mTouch_dao().insertSingleTouchDataEntry(data); + }catch (Exception e){ + // do nothing + } } //exposed api for keydata @Override public void insertKeyData(long keyDownTime, int keyCode, float centre_X, float centre_Y, float width, float height){ + + // Creating an object for KeyTypeData entity class and initialising the data members + // This object will be used as parameter for Room @Insert method + // In essence The object encapsulates the values to be inserted into the table KeyTypeData data = new KeyTypeData(); data.keyDownTime_id = keyDownTime; data.keyTypeCode = keyCode; @@ -76,49 +131,91 @@ public void insertKeyData(long keyDownTime, int keyCode, float centre_X, float c data.key_Width = width; data.key_Height = height; + // Add a wrapper for the insert() method for KeyTypeData Table. + // Insert will throw error is datamembers annotated with @nonnull have null values + // Insert will throw error is datamembers annotated with @primaryKey is a duplicate + // thus in try catch block try { mDatabaseInstance.mKey_dao().insertSingleKeyData(data); }catch(Exception e){ - Log.i("BiAffect", "Exception caught in insertKeyData at "+keyDownTime+ "\n"); + //do nothing + //Log.i("BiAffect", "Exception caught in insertKeyData at "+keyDownTime+ "\n"); } } //accelerometer exposed apis @Override public void insertAccelerometerData(long time, float x, float y, float z){ + + // Creating an object for Accelerometer entity class and initialising the data members + // This object will be used as parameter for Room @Insert method + // In essence The object encapsulates the values to be inserted into the table AccelerometerData data = new AccelerometerData(); data.time = time; data.Acc_X = x; data.Acc_Y = y; data.Acc_Z = z; + + // Add a wrapper for the insert() method for TouchTypeData Table. + // Insert will throw error is datamembers annotated with @nonnull have null values + // Insert will throw error is datamembers annotated with @primaryKey is a duplicate + // thus in try catch block + try{ mDatabaseInstance.mAccelerometer_dao().insertAccelerometerData(data); - } + }catch (Exception e){ + // do nothing + }} //api exposed for Device Data @Override public void insertDeviceData(Context c){ + + // Handling device data being inserted only once + // Instered when the app is first installed and never again. + // Not inserted every time a session starts + // avoid dupliaction of data + int size=-1; + // Add a wrapper for the getAllIds() method in Device DAO for DeviceData Table. + // This method is a SQL SELECT query + // It gives a warning if only some field names match. + // It gives an error if no field names match. try { size = mDatabaseInstance.mDevice_dao().getAllIds().length; - Log.i("DEVICEDATA", " "+size); + //Log.i("DEVICEDATA", " "+size); }catch (Exception e){ - Log.i("DEVICEDATA", "EXCEPTION"+e.getLocalizedMessage()); + // Log.i("DEVICEDATA", "EXCEPTION"+e.getLocalizedMessage()); } + // getAllIds() returns the IDs of all the records stored in DeviceData Table + // getAllIds().length will return 0 if and only if no record exists in the DeviceData table + // this is a check done for single insertion if(size==0){ - //insert the data into db + + // No probes on Data Collection system for Device Data. Directly collected and Proccessed here. + + // Getting device SDK vesion String release = Build.VERSION.RELEASE; int sdkVersion = Build.VERSION.SDK_INT; String FINALVERSION = "Android SDK: " + sdkVersion + " (" + release +")"; + // Getting device display metrics - pixel density, width, height (in pixels) DisplayMetrics metrics = c.getResources().getDisplayMetrics(); int densityDPI = metrics.densityDpi; float densityLogical = metrics.density; int widthPixels = metrics.widthPixels; int heightPixels = metrics.heightPixels; + + // Getting device manufacturer and model details String manufacturer = Build.MANUFACTURER; String model = Build.MODEL; + + //insert the data into db + + // Creating an object for DeviceData entity class and initialising the data members + // This object will be used as parameter for Room @Insert method + // In essence The object encapsulates the values to be inserted into the table DeviceData data = new DeviceData(); data.androidVersion = FINALVERSION; data.pixelDensityDpi = densityDPI; @@ -128,9 +225,15 @@ public void insertDeviceData(Context c){ data.manufacturer = manufacturer; data.phoneModel = model; - mDatabaseInstance.mDevice_dao().insertDeviceData(data); - - + // Add a wrapper for the insert() method for DeviceData Table. + // Insert will throw error is datamembers annotated with @nonnull have null values + // Insert will throw error is datamembers annotated with @primaryKey is a duplicate + // thus in try catch block + try { + mDatabaseInstance.mDevice_dao().insertDeviceData(data); + }catch (Exception e){ + // do nothing + } } } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiAffect_Database.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiAffect_Database.java index 14cbd84f98..a32c704c92 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiAffect_Database.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiAffect_Database.java @@ -13,9 +13,21 @@ import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.SessionData; import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.TouchTypeData; + +/* +Room class must be abstract and extend RoomDatabase. This class is the boiler plate for the database to be created +Usually, you only need one instance of the Room database for the whole app. +*/ + +//Annotate the class to be a Room database, declare the entities that belong in the database and set the version number. +// Listing the entities will create tables in the database. @Database(entities = {SessionData.class, TouchTypeData.class, KeyTypeData.class, AccelerometerData.class, DeviceData.class}, version = 1, exportSchema = false) public abstract class BiAffect_Database extends RoomDatabase { + + // Defining the DAOs that work with the database. + // Since gave all of the DAOs public access, no need to explicity provide abstract "getter" method for each @Dao. + // Definition required in this class so that Room knows which transactions should be handled for each table. public abstract Session_DAO mSession_dao(); public abstract Touch_DAO mTouch_dao(); public abstract Key_DAO mKey_dao(); diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Accelerometer_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Accelerometer_DAO.java index 257e8668fc..eedff6b004 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Accelerometer_DAO.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Accelerometer_DAO.java @@ -5,8 +5,13 @@ import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.AccelerometerData; + +// DAO includes methods that offer abstract access to your app's database. @Dao public interface Accelerometer_DAO { + + // When you create a DAO method and annotate it with @Insert, + // Room generates an implementation that inserts all parameters into the database in a single transaction. @Insert void insertAccelerometerData(AccelerometerData data); } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Device_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Device_DAO.java index 13c106c5a5..0508ce67fe 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Device_DAO.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Device_DAO.java @@ -6,10 +6,25 @@ import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.DeviceData; +// DAO includes methods that offer abstract access to your app's database. @Dao public interface Device_DAO { + + // When you create a DAO method and annotate it with @Insert, + // Room generates an implementation that inserts all parameters into the database in a single transaction. @Insert void insertDeviceData(DeviceData data); + + // @Query is the main annotation used in DAO classes. + // It allows you to perform read/write operations on a database. + /*Each @Query method is verified at compile time, so if there is a problem with the query, + a compilation error occurs instead of a runtime failure. + */ + //Room also verifies the return value of the query + // If the name of the field in the returned object doesn't match the corresponding column names in the query response, + // Room alerts you in one of the following two ways: + //It gives a warning if only some field names match. + //It gives an error if no field names match. @Query("SELECT id FROM DeviceData") int[] getAllIds(); } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Key_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Key_DAO.java index ae6993a99f..b2bc137dc9 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Key_DAO.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Key_DAO.java @@ -5,8 +5,14 @@ import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.KeyTypeData; + +// DAO includes methods that offer abstract access to your app's database. @Dao public interface Key_DAO { + + // When you create a DAO method and annotate it with @Insert, + // Room generates an implementation that inserts all parameters into the database in a single transaction. + @Insert void insertSingleKeyData(KeyTypeData data); } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Session_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Session_DAO.java index cf0ecd34a0..98c4aa4b44 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Session_DAO.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Session_DAO.java @@ -4,10 +4,19 @@ import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.SessionData; + +// DAO includes methods that offer abstract access to your app's database. @Dao public interface Session_DAO { + + // When you create a DAO method and annotate it with @Insert, + // Room generates an implementation that inserts all parameters into the database in a single transaction. + @Insert void insertSessionStartTime(SessionData currentSessionData); + + // The Update convenience method modifies a set of entities, given as parameters, in the database. + // It uses a query that matches against the primary key of each entity. @Update int updateSessionEndTime(SessionData currentSessionData); @Query("SELECT * FROM SESSIONDATA") diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Touch_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Touch_DAO.java index 0a7369d574..30cc0383fa 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Touch_DAO.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Touch_DAO.java @@ -5,8 +5,13 @@ import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.TouchTypeData; + +// DAO includes methods that offer abstract access to your app's database. @Dao public interface Touch_DAO { + + // When you create a DAO method and annotate it with @Insert, + // Room generates an implementation that inserts all parameters into the database in a single transaction. @Insert void insertSingleTouchDataEntry(TouchTypeData data); } From 0e1d397d02bc42f5b5db7d3deb553a81a9c022ac Mon Sep 17 00:00:00 2001 From: sree Date: Fri, 3 May 2019 11:52:27 -0500 Subject: [PATCH 038/113] put in logic to handle violation of unique or PKey in transaction --- .../BiAffect/Database/DAO/Accelerometer_DAO.java | 8 +++++++- .../BiAffect/Database/DAO/Device_DAO.java | 9 ++++++++- .../anysoftkeyboard/BiAffect/Database/DAO/Key_DAO.java | 7 ++++++- .../BiAffect/Database/DAO/Session_DAO.java | 6 +++++- .../anysoftkeyboard/BiAffect/Database/DAO/Touch_DAO.java | 8 +++++++- 5 files changed, 33 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Accelerometer_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Accelerometer_DAO.java index eedff6b004..5d09fc39cb 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Accelerometer_DAO.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Accelerometer_DAO.java @@ -2,6 +2,7 @@ import android.arch.persistence.room.Dao; import android.arch.persistence.room.Insert; +import android.arch.persistence.room.OnConflictStrategy; import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.AccelerometerData; @@ -12,6 +13,11 @@ public interface Accelerometer_DAO { // When you create a DAO method and annotate it with @Insert, // Room generates an implementation that inserts all parameters into the database in a single transaction. - @Insert + + // When an applicable constraint violation occurs, the IGNORE resolution algorithm skips the one row that contains the constraint violation + // and continues processing subsequent rows of the SQL statement as if nothing went wrong. + // Other rows before and after the row that contained the constraint violation are inserted or updated normally. + // No error is returned when the IGNORE conflict resolution algorithm is used. + @Insert(onConflict = OnConflictStrategy.IGNORE) void insertAccelerometerData(AccelerometerData data); } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Device_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Device_DAO.java index 0508ce67fe..a9e8f6cb6f 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Device_DAO.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Device_DAO.java @@ -2,6 +2,7 @@ import android.arch.persistence.room.Dao; import android.arch.persistence.room.Insert; +import android.arch.persistence.room.OnConflictStrategy; import android.arch.persistence.room.Query; import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.DeviceData; @@ -12,7 +13,13 @@ public interface Device_DAO { // When you create a DAO method and annotate it with @Insert, // Room generates an implementation that inserts all parameters into the database in a single transaction. - @Insert + + + // When an applicable constraint violation occurs, the IGNORE resolution algorithm skips the one row that contains the constraint violation + // and continues processing subsequent rows of the SQL statement as if nothing went wrong. + // Other rows before and after the row that contained the constraint violation are inserted or updated normally. + // No error is returned when the IGNORE conflict resolution algorithm is used. + @Insert(onConflict = OnConflictStrategy.IGNORE) void insertDeviceData(DeviceData data); // @Query is the main annotation used in DAO classes. diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Key_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Key_DAO.java index b2bc137dc9..89850f8593 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Key_DAO.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Key_DAO.java @@ -2,6 +2,7 @@ import android.arch.persistence.room.Dao; import android.arch.persistence.room.Insert; +import android.arch.persistence.room.OnConflictStrategy; import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.KeyTypeData; @@ -13,6 +14,10 @@ public interface Key_DAO { // When you create a DAO method and annotate it with @Insert, // Room generates an implementation that inserts all parameters into the database in a single transaction. - @Insert + // When an applicable constraint violation occurs, the IGNORE resolution algorithm skips the one row that contains the constraint violation + // and continues processing subsequent rows of the SQL statement as if nothing went wrong. + // Other rows before and after the row that contained the constraint violation are inserted or updated normally. + // No error is returned when the IGNORE conflict resolution algorithm is used. + @Insert(onConflict = OnConflictStrategy.IGNORE) void insertSingleKeyData(KeyTypeData data); } diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Session_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Session_DAO.java index 98c4aa4b44..058364205e 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Session_DAO.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Session_DAO.java @@ -12,7 +12,11 @@ public interface Session_DAO { // When you create a DAO method and annotate it with @Insert, // Room generates an implementation that inserts all parameters into the database in a single transaction. - @Insert + // When an applicable constraint violation occurs, the IGNORE resolution algorithm skips the one row that contains the constraint violation + // and continues processing subsequent rows of the SQL statement as if nothing went wrong. + // Other rows before and after the row that contained the constraint violation are inserted or updated normally. + // No error is returned when the IGNORE conflict resolution algorithm is used. + @Insert(onConflict = OnConflictStrategy.IGNORE) void insertSessionStartTime(SessionData currentSessionData); // The Update convenience method modifies a set of entities, given as parameters, in the database. diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Touch_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Touch_DAO.java index 30cc0383fa..3b2336fb2d 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Touch_DAO.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Touch_DAO.java @@ -2,6 +2,7 @@ import android.arch.persistence.room.Dao; import android.arch.persistence.room.Insert; +import android.arch.persistence.room.OnConflictStrategy; import com.menny.android.anysoftkeyboard.BiAffect.Database.Models.TouchTypeData; @@ -12,6 +13,11 @@ public interface Touch_DAO { // When you create a DAO method and annotate it with @Insert, // Room generates an implementation that inserts all parameters into the database in a single transaction. - @Insert + + // When an applicable constraint violation occurs, the IGNORE resolution algorithm skips the one row that contains the constraint violation + // and continues processing subsequent rows of the SQL statement as if nothing went wrong. + // Other rows before and after the row that contained the constraint violation are inserted or updated normally. + // No error is returned when the IGNORE conflict resolution algorithm is used. + @Insert(onConflict = OnConflictStrategy.IGNORE) void insertSingleTouchDataEntry(TouchTypeData data); } From 44eaadfe52a163bbc59226ce47556da5fb1854e6 Mon Sep 17 00:00:00 2001 From: sree Date: Tue, 7 May 2019 23:30:30 -0500 Subject: [PATCH 039/113] . --- .../anysoftkeyboard/BiAffect/Database/BiADBInterface.java | 3 ++- .../anysoftkeyboard/BiAffect/Database/DAO/Key_DAO.java | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiADBInterface.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiADBInterface.java index bca228ce7d..68123935bb 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiADBInterface.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/BiADBInterface.java @@ -17,7 +17,8 @@ interface TouchDataInterface { //minor axis // Currently according to design, single insert works efficiently. thus only this implemented. - void insertTouchData(long eventDownTime, long eventTime, int eventAction, float pressure, float x_cord, float y_cord, float majorAxis, float minorAxis); + void insertTouchData(long eventDownTime, long eventTime, int eventAction, + float pressure, float x_cord, float y_cord, float majorAxis, float minorAxis); } interface KeyDataInterface { diff --git a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Key_DAO.java b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Key_DAO.java index 89850f8593..80096e6d22 100644 --- a/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Key_DAO.java +++ b/app/src/main/java/com/menny/android/anysoftkeyboard/BiAffect/Database/DAO/Key_DAO.java @@ -14,10 +14,12 @@ public interface Key_DAO { // When you create a DAO method and annotate it with @Insert, // Room generates an implementation that inserts all parameters into the database in a single transaction. - // When an applicable constraint violation occurs, the IGNORE resolution algorithm skips the one row that contains the constraint violation + // When an applicable constraint violation occurs, the IGNORE resolution algorithm skips + // the one row that contains the constraint violation // and continues processing subsequent rows of the SQL statement as if nothing went wrong. // Other rows before and after the row that contained the constraint violation are inserted or updated normally. // No error is returned when the IGNORE conflict resolution algorithm is used. + @Insert(onConflict = OnConflictStrategy.IGNORE) void insertSingleKeyData(KeyTypeData data); } From 6ea89b68e65bf0c83831f3dbde12096f167f153c Mon Sep 17 00:00:00 2001 From: chenghungma Date: Mon, 22 Jul 2019 10:04:05 -0700 Subject: [PATCH 040/113] Solve data saving problem Solve the problem of saving data when user close the keyboard --- app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java b/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java index be48bd77c8..97ca01c57d 100644 --- a/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java +++ b/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java @@ -977,6 +977,8 @@ public void onWindowHidden() { super.onWindowHidden(); abortCorrectionAndResetPredictionState(true); + // solve the problem of saving data when user close the keyboard + BiAManager.getInstance(AnyApplication.getAppContext()).endSession(); } private void nextAlterKeyboard(EditorInfo currentEditorInfo) { From 497cfd1d2d52874f13c05e75f1921a2855cf1fd4 Mon Sep 17 00:00:00 2001 From: ag009 Date: Mon, 22 Jul 2019 11:04:48 -0700 Subject: [PATCH 041/113] update log --- app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java b/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java index 97ca01c57d..744f00eec9 100644 --- a/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java +++ b/app/src/main/java/com/anysoftkeyboard/AnySoftKeyboard.java @@ -1143,10 +1143,11 @@ private void showOptionsMenu() { @Override public void onConfigurationChanged(Configuration newConfig) { + Log.i("Conf", "onConfigurationChanged be called"); if(!BiAManager.getInstance(AnyApplication.getAppContext()).endSession()){ Log.i("BiAffect", "End Session Failed"); }else{ - Log.i("BiAffect", "End Session Successfull"); + Log.i("BiAffect", "End Session Successfull/ CONFIGUARTION"); } super.onConfigurationChanged(newConfig); if (newConfig.orientation != mOrientation) { From 60044457d5f5fda7a40ae693283efc8ea9b4d38e Mon Sep 17 00:00:00 2001 From: ag009 Date: Mon, 22 Jul 2019 16:11:46 -0700 Subject: [PATCH 042/113] Add an empty first after first page 1. Add an empty activity for logging 2. Redirecting " start setup" to blankpage --- app/build.gradle | 13 ++++ app/src/main/AndroidManifest.xml | 60 ++++++++----------- .../ui/settings/MainFragment.java | 2 +- .../ui/settings/setup/LoggingPage.java | 15 +++++ .../setup/WizardPageWelcomeFragment.java | 12 ++-- .../main/res/layout/activity_logging_page.xml | 6 ++ app/src/main/res/values/dimens.xml | 9 ++- app/src/main/res/values/strings.xml | 24 +++++--- build.gradle | 5 +- 9 files changed, 92 insertions(+), 54 deletions(-) create mode 100644 app/src/main/java/com/anysoftkeyboard/ui/settings/setup/LoggingPage.java create mode 100644 app/src/main/res/layout/activity_logging_page.xml diff --git a/app/build.gradle b/app/build.gradle index 4996ace565..ba07e8addc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -145,6 +145,9 @@ dependencies { implementation 'com.anysoftkeybaord.languages:base:4.0.368@aar' implementation 'com.anysoftkeybaord.languages.english:english:4.0.368@aar' + implementation 'com.android.support:support-annotations:28.0.0' + implementation 'com.android.support.constraint:constraint-layout:1.1.3' + implementation 'android.arch.lifecycle:extensions:1.1.1' testImplementation project(path: ':base-test') testImplementation 'com.github.triplet.simpleprovider:simpleprovider:1.1.0' @@ -174,3 +177,13 @@ dependencies { // // +configurations.all { + resolutionStrategy.eachDependency { DependencyResolveDetails details -> + def requested = details.requested + if (requested.group == 'com.android.support') { + if (!requested.name.startsWith("multidex")) { + details.useVersion '25.4.0' + } + } + } +} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index eb05ac3a36..1ab1843f39 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,33 +1,26 @@ + + xmlns:tools="http://schemas.android.com/tools" + package="com.menny.android.anysoftkeyboard"> + + - - - - + tools:ignore="UnusedAttribute" /> + - - - - - - - + + + - - - - - + + - - - - + - + + @@ -95,7 +90,6 @@ android:roundIcon="@mipmap/ic_launcher_round" android:theme="@style/Theme.AskApp.NoTitle.NoActionBar" android:windowSoftInputMode="adjustPan" /> - - + android:theme="@style/Theme.AskApp.Popup" /> - + android:theme="@style/Theme.AskApp.NoTitle" /> - - + \ No newline at end of file diff --git a/app/src/main/java/com/anysoftkeyboard/ui/settings/MainFragment.java b/app/src/main/java/com/anysoftkeyboard/ui/settings/MainFragment.java index 1ebcbd917c..de2a4ce7c3 100644 --- a/app/src/main/java/com/anysoftkeyboard/ui/settings/MainFragment.java +++ b/app/src/main/java/com/anysoftkeyboard/ui/settings/MainFragment.java @@ -210,7 +210,7 @@ public void onClick(View widget) { public void onStart() { super.onStart(); MainSettingsActivity.setActivityTitle(this, getString(R.string.how_to_pointer_title)); - + Logger.d(TAG, "MainFragment!!!!!!!!!!" ); View notConfiguredBox = getView().findViewById(R.id.not_configured_click_here_root); //checking if the IME is configured final Context context = getActivity().getApplicationContext(); diff --git a/app/src/main/java/com/anysoftkeyboard/ui/settings/setup/LoggingPage.java b/app/src/main/java/com/anysoftkeyboard/ui/settings/setup/LoggingPage.java new file mode 100644 index 0000000000..22ecbdb313 --- /dev/null +++ b/app/src/main/java/com/anysoftkeyboard/ui/settings/setup/LoggingPage.java @@ -0,0 +1,15 @@ +package com.anysoftkeyboard.ui.settings.setup; + +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; + +import com.menny.android.anysoftkeyboard.R; + +public class LoggingPage extends AppCompatActivity { + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_logging_page); + } +} diff --git a/app/src/main/java/com/anysoftkeyboard/ui/settings/setup/WizardPageWelcomeFragment.java b/app/src/main/java/com/anysoftkeyboard/ui/settings/setup/WizardPageWelcomeFragment.java index 257d3b318b..0a00601dd8 100644 --- a/app/src/main/java/com/anysoftkeyboard/ui/settings/setup/WizardPageWelcomeFragment.java +++ b/app/src/main/java/com/anysoftkeyboard/ui/settings/setup/WizardPageWelcomeFragment.java @@ -40,6 +40,7 @@ protected int getPageLayoutId() { public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); view.findViewById(R.id.go_to_start_setup).setOnClickListener(this); + //view.findViewById(R.id.start_to_Logging).setOnClickListener(this); view.findViewById(R.id.setup_wizard_welcome_privacy_action).setOnClickListener(this); mDemoAnyKeyboardView = view.findViewById(R.id.demo_keyboard_view); @@ -53,11 +54,14 @@ protected boolean isStepCompleted(@NonNull Context context) { @Override public void onClick(View v) { switch (v.getId()) { + case R.id.go_to_start_setup: - final SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(getContext()).edit(); - editor.putBoolean(STARTED_PREF_KEY, true); - SharedPreferencesCompat.EditorCompat.getInstance().apply(editor); - refreshWizardPager(); + Intent toLogging = new Intent(getContext(), LoggingPage.class); + startActivity(toLogging); + //final SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(getContext()).edit(); + //editor.putBoolean(STARTED_PREF_KEY, true); + //SharedPreferencesCompat.EditorCompat.getInstance().apply(editor); + //refreshWizardPager(); break; case R.id.setup_wizard_welcome_privacy_action: String privacyUrl = getString(R.string.privacy_policy); diff --git a/app/src/main/res/layout/activity_logging_page.xml b/app/src/main/res/layout/activity_logging_page.xml new file mode 100644 index 0000000000..ab3630737d --- /dev/null +++ b/app/src/main/res/layout/activity_logging_page.xml @@ -0,0 +1,6 @@ + + + diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 0bdb13e9af..c44c29ab53 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -1,5 +1,4 @@ - - +--> + 5dp 48dp @@ -98,4 +98,7 @@ 4dp 12sp 3dp + + 16dp + 16dp \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fcd1ba1c69..fbc0220642 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -179,7 +179,7 @@ Search emojis by tag, when typing starts with colon (:) - + Hide keyboard on physical key Hide soft keyboard when physical keyboard is used @@ -211,7 +211,6 @@ Shifted Backspace will delete the last character - Swipe up Define the swipe up gesture action. Currently, %s @@ -299,7 +298,7 @@ Suggestion dictionaries used in AnySoftKeyboard User-dictionary Suggest user added words (double-click a typed-suggestion to add) - + Use fallback User-dictionary Use only AnySoftKeyboard\'s built-in User-dictionary mechanism (not recommended). Try to use Android\'s built-in User-dictionary first (recommended). @@ -331,7 +330,7 @@ Contacts dictionary Suggest names from contacts list - + Tweaks Sound related tweaks Physical keyboard tweaks @@ -440,7 +439,7 @@ Insert space after word suggestion select - + Double space to period Double space tap will become period+space Animations @@ -583,7 +582,7 @@ Select keyboard - + Smiley key Shorter Smiley key @@ -651,7 +650,7 @@ Start compacted to left - + Language: User dictionary @@ -818,7 +817,7 @@ No usage yet. Type a bit more. Clipboard is empty, there is nothing to paste. Selected text copied to clipboard. - + Pick text to paste Clear next-word data This is irreversible. All your typing history will be cleared. @@ -922,4 +921,13 @@ Change theme colors based on used app Keyboard\'s colors will match active app (to the best of our ability). Always use theme\'s colors. + Sign in + Email + Password + Sign in or register + Sign in + "Welcome !" + Not a valid username + Password must be >5 characters + "Login failed" diff --git a/build.gradle b/build.gradle index ae8f4412bd..5bc10dc03a 100644 --- a/build.gradle +++ b/build.gradle @@ -11,7 +11,7 @@ buildscript { maven { url "https://plugins.gradle.org/m2/" } } dependencies { - classpath 'com.android.tools.build:gradle:3.3.1' + classpath 'com.android.tools.build:gradle:3.4.1' classpath 'com.github.triplet.gradle:play-publisher:2.0.0' classpath 'net.ltgt.gradle:gradle-errorprone-plugin:0.6.1' } @@ -33,4 +33,5 @@ apply from: "${rootDir}/gradle/root_all_projects_ext.gradle" ext { roomVersion = '1.1.1' -} \ No newline at end of file +} + From 749c228d13f025fce735debbe1a00bda32086076 Mon Sep 17 00:00:00 2001 From: chenghungma Date: Tue, 23 Jul 2019 13:55:50 -0700 Subject: [PATCH 043/113] Add 2 button of Login page, todo: logic add 2 buttons, todo: logic to jump to the setup page --- .../ui/settings/setup/LoggingPage.java | 16 ++++++++++++++++ .../setup/WizardPageWelcomeFragment.java | 10 +++++----- .../main/res/layout/activity_logging_page.xml | 12 ++++++++++++ 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/anysoftkeyboard/ui/settings/setup/LoggingPage.java b/app/src/main/java/com/anysoftkeyboard/ui/settings/setup/LoggingPage.java index 22ecbdb313..ac86e588fc 100644 --- a/app/src/main/java/com/anysoftkeyboard/ui/settings/setup/LoggingPage.java +++ b/app/src/main/java/com/anysoftkeyboard/ui/settings/setup/LoggingPage.java @@ -1,7 +1,12 @@ package com.anysoftkeyboard.ui.settings.setup; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; +import android.support.v4.content.SharedPreferencesCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; +import android.view.View; +import android.widget.Button; import com.menny.android.anysoftkeyboard.R; @@ -10,6 +15,17 @@ public class LoggingPage extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setContentView(R.layout.activity_logging_page); +// +// final Button button = findViewById(R.id.button); +// button.setOnClickListener(new View.OnClickListener() { +// public void onClick(View v) { +// final SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(getContext()).edit(); +// editor.putBoolean(STARTED_PREF_KEY, true); +// SharedPreferencesCompat.EditorCompat.getInstance().apply(editor); +// refreshWizardPager(); +// } +// }); } } diff --git a/app/src/main/java/com/anysoftkeyboard/ui/settings/setup/WizardPageWelcomeFragment.java b/app/src/main/java/com/anysoftkeyboard/ui/settings/setup/WizardPageWelcomeFragment.java index 0a00601dd8..6ebe011643 100644 --- a/app/src/main/java/com/anysoftkeyboard/ui/settings/setup/WizardPageWelcomeFragment.java +++ b/app/src/main/java/com/anysoftkeyboard/ui/settings/setup/WizardPageWelcomeFragment.java @@ -56,12 +56,12 @@ public void onClick(View v) { switch (v.getId()) { case R.id.go_to_start_setup: - Intent toLogging = new Intent(getContext(), LoggingPage.class); + Intent toLogging = new Intent(getContext(), LoggingPage.class); startActivity(toLogging); - //final SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(getContext()).edit(); - //editor.putBoolean(STARTED_PREF_KEY, true); - //SharedPreferencesCompat.EditorCompat.getInstance().apply(editor); - //refreshWizardPager(); +// final SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(getContext()).edit(); +// editor.putBoolean(STARTED_PREF_KEY, true); +// SharedPreferencesCompat.EditorCompat.getInstance().apply(editor); +// refreshWizardPager(); break; case R.id.setup_wizard_welcome_privacy_action: String privacyUrl = getString(R.string.privacy_policy); diff --git a/app/src/main/res/layout/activity_logging_page.xml b/app/src/main/res/layout/activity_logging_page.xml index ab3630737d..1682f7ae0c 100644 --- a/app/src/main/res/layout/activity_logging_page.xml +++ b/app/src/main/res/layout/activity_logging_page.xml @@ -3,4 +3,16 @@ android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> + +