@@ -321,37 +321,62 @@ public void onPageSelected(int position) {
321321 terminalController = new TerminalController (this , this );
322322 terminalController .bind ();
323323
324- // 3-second Ninja trigger & OTA Updater
324+ // ADFA-4595: version footer — three gestures:
325+ // single tap -> check version / updates (OTA)
326+ // long-press -> show the main.version help tooltip
327+ // double-tap + hold -> open the hidden full terminal (double-tap = key, hold = confirm)
325328 versionFooter .setOnTouchListener (new View .OnTouchListener () {
326329 private final Handler handler = new Handler (android .os .Looper .getMainLooper ());
327- private final Runnable longPressRunnable = () -> terminalController .openFullTerminal ();
328- private long touchStartTime ;
330+ private final int longPressMs = android .view .ViewConfiguration .getLongPressTimeout ();
331+ private final int doubleTapMs = android .view .ViewConfiguration .getDoubleTapTimeout ();
332+ private long downTime = 0L ;
333+ private long lastUpTime = 0L ;
334+ private boolean secondTap = false ;
335+ private boolean longFired = false ;
336+ private Runnable longPress ;
337+ private Runnable singleTap ;
329338
330339 @ Override
331340 public boolean onTouch (View v , MotionEvent event ) {
332- switch (event .getAction ()) {
341+ switch (event .getActionMasked ()) {
333342 case MotionEvent .ACTION_DOWN :
334- touchStartTime = System .currentTimeMillis ();
335- handler .postDelayed (longPressRunnable , 3000 );
343+ downTime = System .currentTimeMillis ();
344+ secondTap = (downTime - lastUpTime ) < doubleTapMs ;
345+ longFired = false ;
346+ if (singleTap != null ) handler .removeCallbacks (singleTap );
347+ final boolean armedForTerminal = secondTap ;
348+ longPress = () -> {
349+ longFired = true ;
350+ if (armedForTerminal ) {
351+ terminalController .openFullTerminal ();
352+ } else {
353+ org .iiab .controller .help .TooltipManager .showTooltip (
354+ MainActivity .this , versionFooter ,
355+ org .iiab .controller .help .TooltipCategory .K2GO ,
356+ org .iiab .controller .help .TooltipTag .MAIN_VERSION );
357+ }
358+ };
359+ handler .postDelayed (longPress , longPressMs );
336360 return true ;
337361 case MotionEvent .ACTION_UP :
338362 case MotionEvent .ACTION_CANCEL :
339- handler .removeCallbacks (longPressRunnable );
340-
341- // --- THE UPDATER (OTA LOGIC) ---
342- // If released early and it was a quick tap (<500ms), trigger normal OTA update
343- if (System .currentTimeMillis () - touchStartTime < 500 ) {
344- updateController .checkForUpdatesManual ();
363+ if (longPress != null ) handler .removeCallbacks (longPress );
364+ long now = System .currentTimeMillis ();
365+ boolean wasTap = !longFired && (now - downTime ) < longPressMs ;
366+ if (wasTap && !secondTap ) {
367+ // Might be a single tap; confirm updates only if no second tap follows.
368+ lastUpTime = now ;
369+ singleTap = () -> updateController .checkForUpdatesManual ();
370+ handler .postDelayed (singleTap , doubleTapMs );
371+ } else {
372+ lastUpTime = wasTap ? now : 0L ;
345373 }
346374 return true ;
347375 }
348376 return false ;
349377 }
350378 });
351379
352- // Check for version with 10s cooldown span
353- versionFooter .setOnClickListener (v -> updateController .checkForUpdatesManual ());
354-
355380 viewPager .setCurrentItem (0 , false );
356381
357382 // 1. Initialize Result Launchers
0 commit comments