MVP maybe?

This commit is contained in:
2025-08-25 11:18:48 -05:00
committed by Jason Ross
parent 6da0dea2a5
commit aefafeb380
+115 -9
View File
@@ -135,9 +135,18 @@ class AndroidFileHandlerGUI(tk.Tk):
# Initially arrange for pull (Android on top)
self._arrange_path_sections()
# Status label
self.status_label = tk.Label(self, text="Status: Idle")
self.status_label.pack(anchor="w", padx=10, fill="x", pady=(20, 5))
# Status label (responsive with word wrapping)
self.status_label = tk.Label(
self,
text="Status: Idle",
wraplength=0, # Will be set dynamically
justify="center",
anchor="center"
)
self.status_label.pack(padx=10, fill="x", pady=(20, 5))
# Bind window resize event to update label wrapping
self.bind("<Configure>", self._on_window_configure)
# Start/Recheck button (will change based on device state)
self.start_btn = tk.Button(
@@ -183,6 +192,16 @@ class AndroidFileHandlerGUI(tk.Tk):
self.after(0, update_ui)
def _on_window_configure(self, event):
"""Handle window resize events to update label wrapping."""
# Only handle configure events for the main window, not child widgets
if event.widget == self:
# Calculate available width for the status label
# Account for padding (10px on each side) and some margin
available_width = self.winfo_width() - 40
if available_width > 100: # Minimum reasonable width
self.status_label.config(wraplength=available_width)
def _validate_paths_and_update_button(self):
"""Check if both paths are selected and update button state accordingly."""
remote_path = self.remote_path_var.get().strip()
@@ -276,7 +295,7 @@ class AndroidFileHandlerGUI(tk.Tk):
self.disable_controls()
self._disable_browse_buttons()
self._update_status(
"No device detected. Enable USB debugging and connect your device."
"No Android devices detected. Please check the USB connection at both ends is securely inserted, USB debugging is enabled, and that File Transfer mode is turned on."
)
self._switch_to_recheck_mode()
self.show_enable_debugging_instructions()
@@ -447,14 +466,62 @@ class AndroidFileHandlerGUI(tk.Tk):
def show_enable_debugging_instructions(self):
"""Show instructions to connect device, enable file transfer, and to enable USB debugging."""
msg = (
self.troubleshooting_steps + "\n\n"
# Create custom dialog window
dialog = tk.Toplevel(self)
dialog.title("Check device connection and enable USB Debugging")
dialog.geometry("700x450") # Increased height for better button spacing
dialog.minsize(700, 450) # Set minimum size to current default
dialog.resizable(True, True)
dialog.transient(self)
dialog.grab_set()
# Center the dialog on the parent window
dialog.update_idletasks()
x = self.winfo_x() + (self.winfo_width() // 2) - (700 // 2)
y = self.winfo_y() + (self.winfo_height() // 2) - (450 // 2)
dialog.geometry(f"700x450+{x}+{y}")
# Create main frame
main_frame = tk.Frame(dialog)
main_frame.pack(fill="both", expand=True, padx=20, pady=20)
# Create responsive text label
text_label = tk.Label(
main_frame,
text=self.troubleshooting_steps,
justify="left",
anchor="nw",
wraplength=0, # Will be set dynamically
font=("Arial", 10)
)
result = messagebox.showinfo(
"Check device connection and enable USB Debugging", msg
text_label.pack(fill="both", expand=True, pady=(0, 20))
# OK button
ok_button = tk.Button(
main_frame,
text="OK",
command=dialog.destroy,
width=10,
font=("Arial", 10)
)
ok_button.pack(pady=10)
# Configure text wrapping on dialog resize
def on_dialog_configure(event):
if event.widget == dialog:
# Calculate available width for text (account for padding and margins)
available_width = dialog.winfo_width() - 60 # 20px padding * 2 + some margin
if available_width > 200: # Minimum reasonable width
text_label.config(wraplength=available_width)
dialog.bind("<Configure>", on_dialog_configure)
# Set initial wrap length
dialog.after(10, lambda: on_dialog_configure(type('Event', (), {'widget': dialog})()))
# After user clicks OK, ensure recheck button is enabled
self.after(0, self._enable_recheck_after_dialog)
dialog.protocol("WM_DELETE_WINDOW", lambda: [dialog.destroy(), self.after(0, self._enable_recheck_after_dialog)])
ok_button.config(command=lambda: [dialog.destroy(), self.after(0, self._enable_recheck_after_dialog)])
def _enable_recheck_after_dialog(self):
"""Re-enable recheck button after user dismisses the dialog."""
@@ -477,6 +544,25 @@ class AndroidFileHandlerGUI(tk.Tk):
def start_transfer(self):
"""Start the file transfer operation."""
# Recheck device connectivity status before starting transfer
device = self.adb_manager.check_device()
if not device:
# Device is no longer connected, update status and reset to recheck mode
self.device_connected = False
self._disable_browse_buttons()
self._update_status(
"No Android devices detected. Please check the USB connection at both ends is securely inserted, USB debugging is enabled, and that File Transfer mode is turned on."
)
self._switch_to_recheck_mode()
self.show_enable_debugging_instructions()
return
else:
# Device is still connected, update status if needed
if not self.device_connected:
self.device_connected = True
self._enable_browse_buttons()
self._update_status(f"Device detected: {device}")
# Double-check device is still connected before starting transfer
if not self.device_connected:
msg = (
@@ -558,6 +644,15 @@ class AndroidFileHandlerGUI(tk.Tk):
if self.current_transfer_id != transfer_id:
return
# Recheck device connectivity before proceeding with transfer
device = self.adb_manager.check_device()
if not device:
# Device disconnected during transfer setup
if self.current_transfer_id == transfer_id:
self._stop_transfer_animation()
self.after(0, self._handle_device_disconnection)
return
# Get the appropriate transfer method
transfer_method, transfer_type = self._get_file_transfer_methods(direction, is_file)
@@ -646,6 +741,17 @@ class AndroidFileHandlerGUI(tk.Tk):
else:
self._switch_to_recheck_mode()
def _handle_device_disconnection(self):
"""Handle device disconnection during transfers."""
self.device_connected = False
self._disable_browse_buttons()
self._update_status(
"No Android devices detected. Please check the USB connection at both ends is securely inserted, USB debugging is enabled, and that File Transfer mode is turned on."
)
self._switch_to_recheck_mode()
self.enable_controls()
self.show_enable_debugging_instructions()
def _is_remote_file(self, remote_path: str) -> bool:
"""Check if the remote path points to a file (not a directory)."""
try: