22
33import android .content .Context ;
44import android .content .Intent ;
5+ import android .content .SharedPreferences ;
56import android .graphics .Point ;
67import android .location .Location ;
78import android .location .LocationManager ;
89import android .os .Build ;
910import android .os .CountDownTimer ;
11+ import android .os .Handler ;
12+ import android .support .annotation .NonNull ;
13+ import android .support .design .widget .BottomSheetBehavior ;
1014import android .support .design .widget .Snackbar ;
1115import android .support .v7 .app .AppCompatActivity ;
1216import android .os .Bundle ;
1317import android .view .Display ;
1418import android .view .DragEvent ;
19+ import android .view .GestureDetector ;
1520import android .view .KeyEvent ;
1621import android .view .LayoutInflater ;
22+ import android .view .MotionEvent ;
1723import android .view .View ;
1824import android .view .WindowManager ;
1925import android .view .inputmethod .EditorInfo ;
2026import android .widget .Button ;
2127import android .widget .EditText ;
2228import android .widget .HorizontalScrollView ;
29+ import android .widget .ImageView ;
2330import android .widget .LinearLayout ;
2431import android .widget .RelativeLayout ;
2532import android .widget .TextView ;
3037import java .util .ArrayList ;
3138import java .util .Date ;
3239
40+ import butterknife .BindView ;
41+ import butterknife .ButterKnife ;
3342import io .pslab .R ;
3443import io .pslab .communication .ScienceLab ;
3544import io .pslab .models .SensorDataBlock ;
3847import io .pslab .others .CustomSnackBar ;
3948import io .pslab .others .GPSLogger ;
4049import io .pslab .others .LocalDataLog ;
50+ import io .pslab .others .MathUtils ;
4151import io .pslab .others .ScienceLabCommon ;
52+ import io .pslab .others .SwipeGestureDetector ;
4253import io .realm .Realm ;
4354import io .realm .RealmObject ;
4455import io .realm .RealmResults ;
4556
4657public class RoboticArmActivity extends AppCompatActivity {
4758
59+ private static final String PREF_NAME = "RoboticArmActivity" ;
4860 private EditText degreeText1 , degreeText2 , degreeText3 , degreeText4 ;
4961 private SeekArc seekArc1 , seekArc2 , seekArc3 , seekArc4 ;
5062 private LinearLayout servo1TimeLine , servo2TimeLine , servo3TimeLine , servo4TimeLine ;
@@ -62,11 +74,32 @@ public class RoboticArmActivity extends AppCompatActivity {
6274 private final String DATA_BLOCK = "data_block" ;
6375 private int timelinePosition = 0 ;
6476 private ScienceLab scienceLab ;
77+ private BottomSheetBehavior bottomSheetBehavior ;
78+ private GestureDetector gestureDetector ;
79+ @ BindView (R .id .sheet_slide_text_robotic_arm )
80+ TextView bottomSheetSlideText ;
81+ @ BindView (R .id .parent_layout_robotic )
82+ View parentLayout ;
83+ @ BindView (R .id .bottom_sheet_robotic_arm )
84+ LinearLayout bottomSheet ;
85+ @ BindView (R .id .img_arrow_robotic_arm )
86+ ImageView arrowUpDown ;
6587
6688 @ Override
6789 protected void onCreate (Bundle savedInstanceState ) {
6890 super .onCreate (savedInstanceState );
6991 setContentView (R .layout .activity_robotic_arm );
92+ ButterKnife .bind (this );
93+
94+ setUpBottomSheet ();
95+ parentLayout .setOnClickListener (new View .OnClickListener () {
96+ @ Override
97+ public void onClick (View v ) {
98+ if (bottomSheetBehavior .getState () == BottomSheetBehavior .STATE_EXPANDED )
99+ bottomSheetBehavior .setState (BottomSheetBehavior .STATE_HIDDEN );
100+ parentLayout .setVisibility (View .GONE );
101+ }
102+ });
70103
71104 scienceLab = ScienceLabCommon .scienceLab ;
72105 if (!scienceLab .isConnected ()) {
@@ -484,6 +517,79 @@ public void onClick(View v) {
484517 .getBlockOfServoRecords (getIntent ().getExtras ().getLong (DATA_BLOCK ));
485518 setReceivedData ();
486519 }
520+
521+ Button guideButton = findViewById (R .id .timeline_guide_button );
522+ guideButton .setOnClickListener (new View .OnClickListener () {
523+ @ Override
524+ public void onClick (View v ) {
525+ bottomSheetBehavior .setState (bottomSheetBehavior .getState () == BottomSheetBehavior .STATE_HIDDEN ?
526+ BottomSheetBehavior .STATE_EXPANDED : BottomSheetBehavior .STATE_HIDDEN );
527+ }
528+ });
529+ }
530+
531+ private void setUpBottomSheet () {
532+ bottomSheetBehavior = BottomSheetBehavior .from (bottomSheet );
533+
534+ final SharedPreferences settings = this .getSharedPreferences (PREF_NAME , MODE_PRIVATE );
535+ Boolean isFirstTime = settings .getBoolean ("RoboticArmFirstTime" , true );
536+
537+ if (isFirstTime ) {
538+ bottomSheetBehavior .setState (BottomSheetBehavior .STATE_EXPANDED );
539+ parentLayout .setVisibility (View .VISIBLE );
540+ parentLayout .setAlpha (0.8f );
541+ arrowUpDown .setRotation (180 );
542+ bottomSheetSlideText .setText (R .string .hide_guide_text );
543+ SharedPreferences .Editor editor = settings .edit ();
544+ editor .putBoolean ("RoboticArmFirstTime" , false );
545+ editor .apply ();
546+ } else {
547+ bottomSheetBehavior .setState (BottomSheetBehavior .STATE_HIDDEN );
548+ }
549+
550+ bottomSheetBehavior .setBottomSheetCallback (new BottomSheetBehavior .BottomSheetCallback () {
551+ private Handler handler = new Handler ();
552+ private Runnable runnable = new Runnable () {
553+ @ Override
554+ public void run () {
555+ bottomSheetBehavior .setState (BottomSheetBehavior .STATE_HIDDEN );
556+ }
557+ };
558+
559+ @ Override
560+ public void onStateChanged (@ NonNull final View bottomSheet , int newState ) {
561+ switch (newState ) {
562+ case BottomSheetBehavior .STATE_EXPANDED :
563+ handler .removeCallbacks (runnable );
564+ bottomSheetSlideText .setText (R .string .hide_guide_text );
565+ break ;
566+
567+ case BottomSheetBehavior .STATE_COLLAPSED :
568+ handler .postDelayed (runnable , 2000 );
569+ break ;
570+
571+ default :
572+ handler .removeCallbacks (runnable );
573+ bottomSheetSlideText .setText (R .string .show_guide_text );
574+ break ;
575+ }
576+ }
577+
578+ @ Override
579+ public void onSlide (@ NonNull View bottomSheet , float slideOffset ) {
580+ Float value = (float ) MathUtils .map ((double ) slideOffset , 0.0 , 1.0 , 0.0 , 0.8 );
581+ parentLayout .setVisibility (View .VISIBLE );
582+ parentLayout .setAlpha (value );
583+ arrowUpDown .setRotation (slideOffset * 180 );
584+ }
585+ });
586+ gestureDetector = new GestureDetector (this , new SwipeGestureDetector (bottomSheetBehavior ));
587+ }
588+
589+ @ Override
590+ public boolean onTouchEvent (MotionEvent event ) {
591+ gestureDetector .onTouchEvent (event ); //Gesture detector need this to transfer touch event to the gesture detector.
592+ return super .onTouchEvent (event );
487593 }
488594
489595 private void toastInvalidValueMessage () {
@@ -545,7 +651,7 @@ private void saveTimeline() {
545651 }
546652 }
547653 servoCSVLogger .writeCSVFile (data );
548- CustomSnackBar .showSnackBar (findViewById (R .id .robotic_arm_relative_view ),
654+ CustomSnackBar .showSnackBar (findViewById (R .id .robotic_arm_coordinator ),
549655 getString (R .string .csv_store_text ) + " " + servoCSVLogger .getCurrentFilePath ()
550656 , getString (R .string .open ), new View .OnClickListener () {
551657 @ Override
0 commit comments