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,12 +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 );
7092
93+ setUpBottomSheet ();
94+ parentLayout .setOnClickListener (new View .OnClickListener () {
95+ @ Override
96+ public void onClick (View v ) {
97+ if (bottomSheetBehavior .getState () == BottomSheetBehavior .STATE_EXPANDED )
98+ bottomSheetBehavior .setState (BottomSheetBehavior .STATE_HIDDEN );
99+ parentLayout .setVisibility (View .GONE );
100+ }
101+ });
102+
71103 scienceLab = ScienceLabCommon .scienceLab ;
72104 if (!scienceLab .isConnected ()) {
73105 Toast .makeText (this , getResources ().getString (R .string .device_not_connected ), Toast .LENGTH_SHORT ).show ();
@@ -484,6 +516,79 @@ public void onClick(View v) {
484516 .getBlockOfServoRecords (getIntent ().getExtras ().getLong (DATA_BLOCK ));
485517 setReceivedData ();
486518 }
519+
520+ Button guideButton = findViewById (R .id .timeline_guide_button );
521+ guideButton .setOnClickListener (new View .OnClickListener () {
522+ @ Override
523+ public void onClick (View v ) {
524+ bottomSheetBehavior .setState (bottomSheetBehavior .getState () == BottomSheetBehavior .STATE_HIDDEN ?
525+ BottomSheetBehavior .STATE_EXPANDED : BottomSheetBehavior .STATE_HIDDEN );
526+ }
527+ });
528+ }
529+
530+ private void setUpBottomSheet () {
531+ bottomSheetBehavior = BottomSheetBehavior .from (bottomSheet );
532+
533+ final SharedPreferences settings = this .getSharedPreferences (PREF_NAME , MODE_PRIVATE );
534+ Boolean isFirstTime = settings .getBoolean ("RoboticArmFirstTime" , true );
535+
536+ if (isFirstTime ) {
537+ bottomSheetBehavior .setState (BottomSheetBehavior .STATE_EXPANDED );
538+ parentLayout .setVisibility (View .VISIBLE );
539+ parentLayout .setAlpha (0.8f );
540+ arrowUpDown .setRotation (180 );
541+ bottomSheetSlideText .setText (R .string .hide_guide_text );
542+ SharedPreferences .Editor editor = settings .edit ();
543+ editor .putBoolean ("RoboticArmFirstTime" , false );
544+ editor .apply ();
545+ } else {
546+ bottomSheetBehavior .setState (BottomSheetBehavior .STATE_HIDDEN );
547+ }
548+
549+ bottomSheetBehavior .setBottomSheetCallback (new BottomSheetBehavior .BottomSheetCallback () {
550+ private Handler handler = new Handler ();
551+ private Runnable runnable = new Runnable () {
552+ @ Override
553+ public void run () {
554+ bottomSheetBehavior .setState (BottomSheetBehavior .STATE_HIDDEN );
555+ }
556+ };
557+
558+ @ Override
559+ public void onStateChanged (@ NonNull final View bottomSheet , int newState ) {
560+ switch (newState ) {
561+ case BottomSheetBehavior .STATE_EXPANDED :
562+ handler .removeCallbacks (runnable );
563+ bottomSheetSlideText .setText (R .string .hide_guide_text );
564+ break ;
565+
566+ case BottomSheetBehavior .STATE_COLLAPSED :
567+ handler .postDelayed (runnable , 2000 );
568+ break ;
569+
570+ default :
571+ handler .removeCallbacks (runnable );
572+ bottomSheetSlideText .setText (R .string .show_guide_text );
573+ break ;
574+ }
575+ }
576+
577+ @ Override
578+ public void onSlide (@ NonNull View bottomSheet , float slideOffset ) {
579+ Float value = (float ) MathUtils .map ((double ) slideOffset , 0.0 , 1.0 , 0.0 , 0.8 );
580+ parentLayout .setVisibility (View .VISIBLE );
581+ parentLayout .setAlpha (value );
582+ arrowUpDown .setRotation (slideOffset * 180 );
583+ }
584+ });
585+ gestureDetector = new GestureDetector (this , new SwipeGestureDetector (bottomSheetBehavior ));
586+ }
587+
588+ @ Override
589+ public boolean onTouchEvent (MotionEvent event ) {
590+ gestureDetector .onTouchEvent (event ); //Gesture detector need this to transfer touch event to the gesture detector.
591+ return super .onTouchEvent (event );
487592 }
488593
489594 private void toastInvalidValueMessage () {
0 commit comments