From 327a22e00318712db64b21491c4f90febc10c9b5 Mon Sep 17 00:00:00 2001 From: Iurii Sergiichuk Date: Tue, 31 May 2016 01:23:42 +0300 Subject: [PATCH] close #19. lots of refactorings refactored whole project for simplier IDEA usage refactored project structure to be more maven-specific cleaned-up code added lib folder with adb.exe and related binaries --- .gitignore | 168 +- LICENSE | 2 +- README.md | 4 +- app.properties | 2 +- lib/AdbWinApi.dll | Bin 0 -> 96256 bytes lib/AdbWinUsbApi.dll | Bin 0 -> 60928 bytes lib/adb.exe | Bin 0 -> 908800 bytes lib/fastboot.exe | Bin 0 -> 168448 bytes pom.xml | 215 ++- .../xsavikx/android/screencast/Main.java | 24 - .../android/screencast/api/AndroidDevice.java | 18 - .../screencast/api/AndroidDeviceImpl.java | 161 -- .../screencast/api/command/Command.java | 5 - .../screencast/api/command/InputCommand.java | 12 - .../screencast/api/command/KeyCommand.java | 22 - .../screencast/api/command/SwipeCommand.java | 22 - .../screencast/api/command/TapCommand.java | 18 - .../AdbShellCommandExecutionException.java | 14 - .../exception/CommandExecutionException.java | 28 - .../api/command/executor/CommandExecutor.java | 7 - .../executor/ShellCommandExecutor.java | 40 - .../factory/AdbInputCommandFactory.java | 49 - .../android/screencast/api/file/FileInfo.java | 33 - .../screencast/api/injector/Injector.java | 41 - .../api/injector/InputKeyEvent.java | 355 ---- .../api/injector/KeyCodeConverter.java | 23 - .../injector/MultiLineReceiverPrinter.java | 22 - .../OutputStreamShellOutputReceiver.java | 39 - .../api/injector/ScreenCaptureThread.java | 195 -- .../api/recording/DataAtomOutputStream.java | 341 ---- .../recording/FilterImageOutputStream.java | 89 - .../api/recording/QuickTimeOutputStream.java | 1632 ----------------- .../app/AndroidScreencastApplication.java | 84 - .../android/screencast/app/Application.java | 12 - .../app/DeviceChooserApplication.java | 97 - .../screencast/app/GUIApplication.java | 27 - .../screencast/app/SwingApplication.java | 49 - .../screencast/constant/Constants.java | 14 - .../config/ApplicationConfiguration.java | 47 - .../config/ApplicationContextProvider.java | 26 - .../screencast/ui/JDialogDeviceList.java | 103 -- .../android/screencast/ui/JDialogError.java | 28 - .../screencast/ui/JDialogExecuteKeyEvent.java | 117 -- .../android/screencast/ui/JDialogUrl.java | 59 - .../android/screencast/ui/JFrameMain.java | 213 --- .../android/screencast/ui/JPanelScreen.java | 53 - .../android/screencast/ui/JSplashScreen.java | 34 - .../screencast/ui/MultiLineLabelUI.java | 288 --- .../ui/explorer/JFrameExplorer.java | 150 -- .../ui/explorer/LazyLoadingTreeNode.java | 291 --- .../ui/explorer/LazyMutableTreeNode.java | 44 - .../KeyEventDispatcherFactory.java | 10 - .../interaction/KeyEventDispatcherImpl.java | 47 - .../interaction/KeyboardActionListener.java | 38 - .../KeyboardActionListenerFactory.java | 9 - .../ui/interaction/MouseActionAdapter.java | 99 - .../MouseActionAdapterFactory.java | 14 - .../ui/model/InputKeyEventTable.java | 45 - .../ui/model/InputKeyEventTableModel.java | 54 - .../ui/worker/AccumulativeRunnable.java | 156 -- .../screencast/ui/worker/SwingWorker.java | 829 --------- .../xsavikx/androidscreencast/Main.java | 23 + .../androidscreencast/api/AndroidDevice.java | 18 + .../api/AndroidDeviceImpl.java | 157 ++ .../api/command/Command.java | 8 + .../api/command/InputCommand.java | 17 + .../api/command/KeyCommand.java | 41 + .../api/command/SwipeCommand.java | 36 + .../api/command/TapCommand.java | 18 + .../AdbShellCommandExecutionException.java | 14 + .../exception/CommandExecutionException.java | 28 + .../api/command/executor/CommandExecutor.java | 7 + .../executor/ShellCommandExecutor.java | 39 + .../factory/AdbInputCommandFactory.java | 56 + .../androidscreencast/api/file/FileInfo.java | 32 + .../api/injector/Injector.java | 38 + .../api/injector/InputKeyEvent.java | 355 ++++ .../api/injector/KeyCodeConverter.java | 23 + .../injector/MultiLineReceiverPrinter.java | 21 + .../OutputStreamShellOutputReceiver.java | 39 + .../api/injector/ScreenCaptureThread.java | 191 ++ .../api/recording/DataAtomOutputStream.java | 317 ++++ .../recording/FilterImageOutputStream.java | 80 + .../api/recording/QuickTimeOutputStream.java | 1596 ++++++++++++++++ .../app/AndroidScreencastApplication.java | 86 + .../androidscreencast/app/Application.java | 12 + .../app/DeviceChooserApplication.java | 96 + .../androidscreencast/app/GUIApplication.java | 27 + .../app/SwingApplication.java | 47 + .../androidscreencast/constant/Constants.java | 14 + .../config/ApplicationConfiguration.java | 45 + .../config/ApplicationContextProvider.java | 26 + .../ui/JDialogDeviceList.java | 94 + .../androidscreencast/ui/JDialogError.java | 26 + .../ui/JDialogExecuteKeyEvent.java | 109 ++ .../androidscreencast/ui/JDialogUrl.java | 55 + .../androidscreencast/ui/JFrameMain.java | 205 +++ .../androidscreencast/ui/JPanelScreen.java | 49 + .../androidscreencast/ui/JSplashScreen.java | 30 + .../ui/MultiLineLabelUI.java | 277 +++ .../ui/explorer/JFrameExplorer.java | 140 ++ .../ui/explorer/LazyLoadingTreeNode.java | 280 +++ .../ui/explorer/LazyMutableTreeNode.java | 44 + .../KeyEventDispatcherFactory.java | 9 + .../interaction/KeyEventDispatcherImpl.java | 45 + .../interaction/KeyboardActionListener.java | 37 + .../KeyboardActionListenerFactory.java | 9 + .../ui/interaction/MouseActionAdapter.java | 97 + .../MouseActionAdapterFactory.java | 14 + .../ui/model/InputKeyEventTable.java | 43 + .../ui/model/InputKeyEventTableModel.java | 53 + .../ui/worker/AccumulativeRunnable.java | 148 ++ .../ui/worker/SwingWorker.java | 789 ++++++++ src/{ => main/resources}/log4j.properties | 7 +- 114 files changed, 6313 insertions(+), 6372 deletions(-) create mode 100644 lib/AdbWinApi.dll create mode 100644 lib/AdbWinUsbApi.dll create mode 100644 lib/adb.exe create mode 100644 lib/fastboot.exe delete mode 100644 src/com/github/xsavikx/android/screencast/Main.java delete mode 100644 src/com/github/xsavikx/android/screencast/api/AndroidDevice.java delete mode 100644 src/com/github/xsavikx/android/screencast/api/AndroidDeviceImpl.java delete mode 100644 src/com/github/xsavikx/android/screencast/api/command/Command.java delete mode 100644 src/com/github/xsavikx/android/screencast/api/command/InputCommand.java delete mode 100644 src/com/github/xsavikx/android/screencast/api/command/KeyCommand.java delete mode 100644 src/com/github/xsavikx/android/screencast/api/command/SwipeCommand.java delete mode 100644 src/com/github/xsavikx/android/screencast/api/command/TapCommand.java delete mode 100644 src/com/github/xsavikx/android/screencast/api/command/exception/AdbShellCommandExecutionException.java delete mode 100644 src/com/github/xsavikx/android/screencast/api/command/exception/CommandExecutionException.java delete mode 100644 src/com/github/xsavikx/android/screencast/api/command/executor/CommandExecutor.java delete mode 100644 src/com/github/xsavikx/android/screencast/api/command/executor/ShellCommandExecutor.java delete mode 100644 src/com/github/xsavikx/android/screencast/api/command/factory/AdbInputCommandFactory.java delete mode 100644 src/com/github/xsavikx/android/screencast/api/file/FileInfo.java delete mode 100644 src/com/github/xsavikx/android/screencast/api/injector/Injector.java delete mode 100644 src/com/github/xsavikx/android/screencast/api/injector/InputKeyEvent.java delete mode 100644 src/com/github/xsavikx/android/screencast/api/injector/KeyCodeConverter.java delete mode 100644 src/com/github/xsavikx/android/screencast/api/injector/MultiLineReceiverPrinter.java delete mode 100644 src/com/github/xsavikx/android/screencast/api/injector/OutputStreamShellOutputReceiver.java delete mode 100644 src/com/github/xsavikx/android/screencast/api/injector/ScreenCaptureThread.java delete mode 100644 src/com/github/xsavikx/android/screencast/api/recording/DataAtomOutputStream.java delete mode 100644 src/com/github/xsavikx/android/screencast/api/recording/FilterImageOutputStream.java delete mode 100644 src/com/github/xsavikx/android/screencast/api/recording/QuickTimeOutputStream.java delete mode 100644 src/com/github/xsavikx/android/screencast/app/AndroidScreencastApplication.java delete mode 100644 src/com/github/xsavikx/android/screencast/app/Application.java delete mode 100644 src/com/github/xsavikx/android/screencast/app/DeviceChooserApplication.java delete mode 100644 src/com/github/xsavikx/android/screencast/app/GUIApplication.java delete mode 100644 src/com/github/xsavikx/android/screencast/app/SwingApplication.java delete mode 100644 src/com/github/xsavikx/android/screencast/constant/Constants.java delete mode 100644 src/com/github/xsavikx/android/screencast/spring/config/ApplicationConfiguration.java delete mode 100644 src/com/github/xsavikx/android/screencast/spring/config/ApplicationContextProvider.java delete mode 100644 src/com/github/xsavikx/android/screencast/ui/JDialogDeviceList.java delete mode 100644 src/com/github/xsavikx/android/screencast/ui/JDialogError.java delete mode 100644 src/com/github/xsavikx/android/screencast/ui/JDialogExecuteKeyEvent.java delete mode 100644 src/com/github/xsavikx/android/screencast/ui/JDialogUrl.java delete mode 100644 src/com/github/xsavikx/android/screencast/ui/JFrameMain.java delete mode 100644 src/com/github/xsavikx/android/screencast/ui/JPanelScreen.java delete mode 100644 src/com/github/xsavikx/android/screencast/ui/JSplashScreen.java delete mode 100644 src/com/github/xsavikx/android/screencast/ui/MultiLineLabelUI.java delete mode 100644 src/com/github/xsavikx/android/screencast/ui/explorer/JFrameExplorer.java delete mode 100644 src/com/github/xsavikx/android/screencast/ui/explorer/LazyLoadingTreeNode.java delete mode 100644 src/com/github/xsavikx/android/screencast/ui/explorer/LazyMutableTreeNode.java delete mode 100644 src/com/github/xsavikx/android/screencast/ui/interaction/KeyEventDispatcherFactory.java delete mode 100644 src/com/github/xsavikx/android/screencast/ui/interaction/KeyEventDispatcherImpl.java delete mode 100644 src/com/github/xsavikx/android/screencast/ui/interaction/KeyboardActionListener.java delete mode 100644 src/com/github/xsavikx/android/screencast/ui/interaction/KeyboardActionListenerFactory.java delete mode 100644 src/com/github/xsavikx/android/screencast/ui/interaction/MouseActionAdapter.java delete mode 100644 src/com/github/xsavikx/android/screencast/ui/interaction/MouseActionAdapterFactory.java delete mode 100644 src/com/github/xsavikx/android/screencast/ui/model/InputKeyEventTable.java delete mode 100644 src/com/github/xsavikx/android/screencast/ui/model/InputKeyEventTableModel.java delete mode 100644 src/com/github/xsavikx/android/screencast/ui/worker/AccumulativeRunnable.java delete mode 100644 src/com/github/xsavikx/android/screencast/ui/worker/SwingWorker.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/Main.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/api/AndroidDevice.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/api/AndroidDeviceImpl.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/api/command/Command.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/api/command/InputCommand.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/api/command/KeyCommand.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/api/command/SwipeCommand.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/api/command/TapCommand.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/api/command/exception/AdbShellCommandExecutionException.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/api/command/exception/CommandExecutionException.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/api/command/executor/CommandExecutor.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/api/command/executor/ShellCommandExecutor.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/api/command/factory/AdbInputCommandFactory.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/api/file/FileInfo.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/api/injector/Injector.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/api/injector/InputKeyEvent.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/api/injector/KeyCodeConverter.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/api/injector/MultiLineReceiverPrinter.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/api/injector/OutputStreamShellOutputReceiver.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/api/injector/ScreenCaptureThread.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/api/recording/DataAtomOutputStream.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/api/recording/FilterImageOutputStream.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/api/recording/QuickTimeOutputStream.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/app/AndroidScreencastApplication.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/app/Application.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/app/DeviceChooserApplication.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/app/GUIApplication.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/app/SwingApplication.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/constant/Constants.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/spring/config/ApplicationConfiguration.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/spring/config/ApplicationContextProvider.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/ui/JDialogDeviceList.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/ui/JDialogError.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/ui/JDialogExecuteKeyEvent.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/ui/JDialogUrl.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/ui/JFrameMain.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/ui/JPanelScreen.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/ui/JSplashScreen.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/ui/MultiLineLabelUI.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/ui/explorer/JFrameExplorer.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/ui/explorer/LazyLoadingTreeNode.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/ui/explorer/LazyMutableTreeNode.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/ui/interaction/KeyEventDispatcherFactory.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/ui/interaction/KeyEventDispatcherImpl.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/ui/interaction/KeyboardActionListener.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/ui/interaction/KeyboardActionListenerFactory.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/ui/interaction/MouseActionAdapter.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/ui/interaction/MouseActionAdapterFactory.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/ui/model/InputKeyEventTable.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/ui/model/InputKeyEventTableModel.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/ui/worker/AccumulativeRunnable.java create mode 100644 src/main/java/com/github/xsavikx/androidscreencast/ui/worker/SwingWorker.java rename src/{ => main/resources}/log4j.properties (89%) diff --git a/.gitignore b/.gitignore index f99201f..71cf04c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,47 +1,167 @@ -#logs -*.log* +# Created by .ignore support plugin (hsz.mobi) +### JetBrains template +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 +.idea +# User-specific stuff: +.idea/workspace.xml +.idea/tasks.xml +.idea/dictionaries +.idea/vcs.xml +.idea/jsLibraryMappings.xml -# Bin folder -bin +# Sensitive or high-churn files: +.idea/dataSources.ids +.idea/dataSources.xml +.idea/dataSources.local.xml +.idea/sqlDataSources.xml +.idea/dynamic.xml +.idea/uiDesigner.xml + +# Gradle: +.idea/gradle.xml +.idea/libraries + +# Mongo Explorer plugin: +.idea/mongoSettings.xml + +## File-based project format: +*.iws + +## Plugin-specific files: + +# IntelliJ +/out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties +### Java template *.class # Mobile Tools for Java (J2ME) .mtj.tmp/ -# Log Files -*.log - # Package Files # +*.jar *.war *.ear # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* +### NotepadPP template +# Notepad++ backups # +*.bak +### NetBeans template +nbproject/private/ +build/ +nbbuild/ +dist/ +nbdist/ +nbactions.xml +.nb-gradle/ +### Eclipse template - -# Build folders -dist - -###################### -# Eclipse -###################### -*.pydevproject -.project .metadata -bin/** -tmp/** -tmp/**/* +bin/ +tmp/ *.tmp -*.bak *.swp *~.nib local.properties -.classpath .settings/ .loadpath -/src/main/resources/rebel.xml +.recommenders + +# Eclipse Core +.project + # External tool builders .externalToolBuilders/ + # Locally stored "Eclipse launch configurations" -*.launch -/target/ +*.launch + +# PyDev specific (Python IDE for Eclipse) +*.pydevproject + +# CDT-specific (C/C++ Development Tooling) +.cproject + +# JDT-specific (Eclipse Java Development Tools) +.classpath + +# Java annotation processor (APT) +.factorypath + +# PDT-specific (PHP Development Tools) +.buildpath + +# sbteclipse plugin +.target + +# Tern plugin +.tern-project + +# TeXlipse plugin +.texlipse + +# STS (Spring Tool Suite) +.springBeans + +# Code Recommenders +.recommenders/ +### Android template +# Built application files +*.apk +*.ap_ + +# Files for the ART/Dalvik VM +*.dex + +# Java class files + +# Generated files +gen/ +out/ + +# Gradle files +.gradle/ + +# Local configuration file (sdk path, etc) + +# Proguard folder generated by Eclipse +proguard/ + +# Log Files +*.log + +# Android Studio Navigation editor temp files +.navigation/ + +# Android Studio captures folder +captures/ + +# Intellij +*.iml + +# Keystore files +*.jks +### Maven template +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties diff --git a/LICENSE b/LICENSE index a3bd98a..54bd737 100644 --- a/LICENSE +++ b/LICENSE @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright 2015 Iurii Sergiichuk + Copyright 2014-2016 Iurii Sergiichuk Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/README.md b/README.md index 6ac5f22..2374209 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,8 @@ AndroidScreencast ================= -[![Build Status DroneIO](https://drone.io/github.com/xSAVIKx/AndroidScreencast/status.png)](https://drone.io/github.com/xSAVIKx/AndroidScreencast/latest) - [![Build Status Travis-CI](https://travis-ci.org/xSAVIKx/AndroidScreencast.svg?branch=master)](https://travis-ci.org/xSAVIKx/AndroidScreencast) -AndroidScreencast - View and control your android device on PC. +AndroidScreencast - View and control your android iDevice on PC. This project gives you opportunity to use your phone even with broken screen. diff --git a/app.properties b/app.properties index cab3972..0b4cb24 100644 --- a/app.properties +++ b/app.properties @@ -1,3 +1,3 @@ -adb.path=/usr/bin/adb +adb.path=adb.exe default.window.width=1024 default.window.height=768 \ No newline at end of file diff --git a/lib/AdbWinApi.dll b/lib/AdbWinApi.dll new file mode 100644 index 0000000000000000000000000000000000000000..b5586eb50d853881b02681362b24ec7548b2c7e8 GIT binary patch literal 96256 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

SeXOG&{oluT-DQ8CRHq>h%8I$BOX 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 z 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Ⓢ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

QT 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 E0u3EtKL7v# literal 0 HcmV?d00001 diff --git a/lib/fastboot.exe b/lib/fastboot.exe new file mode 100644 index 0000000000000000000000000000000000000000..0e47b3d104a96c4f4f18b59a22436b6034b4bc66 GIT binary patch literal 168448 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 W3MnBo$Sm^j#@g@46@v30YyJz@Ef979 literal 0 HcmV?d00001 diff --git a/pom.xml b/pom.xml index 1dc8e0a..c65132b 100644 --- a/pom.xml +++ b/pom.xml @@ -1,114 +1,107 @@ - - 4.0.0 - AndroidScreencast - AndroidScreencast - 0.0.5.1S - Android Screencast - - 4.2.0.RELEASE - 24.3.1 - 1.2.17 - - - - com.android.tools.ddms - ddmlib - ${ddmlib-version} - - - log4j - log4j - ${log4j-version} - - - org.springframework - spring-core - ${spring-version} - - - org.springframework - spring-beans - ${spring-version} - - - org.springframework - spring-context - ${spring-version} - - - - src - - - src - - **/*.java - - - - - - maven-compiler-plugin - 3.3 - - 1.7 - 1.7 - - - - org.apache.maven.plugins - maven-jar-plugin - - - - com.github.xsavikx.android.screencast.Main - - - - - - org.dstovall - onejar-maven-plugin - 1.4.5 - - - - androidscreencast-${project.version}.jar - onejar - - - one-jar - - - - - - + + 4.0.0 + com.github.xsavikx + androidscreencast + 0.0.6 + Android Screencast + + 4.2.6.RELEASE + 25.1.0 + 1.2.17 + com.github.xsavikx.androidscreencast.Main + 1.7 + + + + com.android.tools.ddms + ddmlib + ${ddmlib-version} + + + log4j + log4j + ${log4j-version} + + + org.springframework + spring-core + ${spring-version} + + + org.springframework + spring-beans + ${spring-version} + + + org.springframework + spring-context + ${spring-version} + + + + + + maven-compiler-plugin + 3.5.1 + + ${jdk-version} + ${jdk-version} + + + + org.apache.maven.plugins + maven-jar-plugin + 2.6 + + + + com.github.xsavikx.androidscreencast.Main + + + + + + org.apache.maven.plugins + maven-shade-plugin + 2.4.3 + + + + shade + + + true + + + ${main-class} + + + + + + + + + http://xsavikx.github.io/AndroidScreencast + + https://travis-ci.org/xSAVIKx/AndroidScreencast + Travis-CI + + + GitHub + https://github.com/xSAVIKx/AndroidScreencast/issues + + AndroidScreencast - View and control your android iDevice on PC. - - - onejar-maven-plugin.googlecode.com - http://onejar-maven-plugin.googlecode.com/svn/mavenrepo - - - http://xsavikx.github.io/AndroidScreencast - - https://drone.io/github.com/xSAVIKx/AndroidScreencast - DroneIO - - - GitHub - https://github.com/xSAVIKx/AndroidScreencast/issues - - AndroidScreencast - View and control your android device on PC. + This project gives you opportunity to use your phone even with broken screen. -This project gives you opportunity to use your phone even with broken screen. - -Features: - No client needed - Support for Tap and Swipe gestures - Write messages using PC keyboard - Support for landscape mode - Browse your phone files on PC + Features: + No client needed + Support for Tap and Swipe gestures + Write messages using PC keyboard + Support for landscape mode + Browse your phone files on PC + \ No newline at end of file diff --git a/src/com/github/xsavikx/android/screencast/Main.java b/src/com/github/xsavikx/android/screencast/Main.java deleted file mode 100644 index 3b5c449..0000000 --- a/src/com/github/xsavikx/android/screencast/Main.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.github.xsavikx.android.screencast; - -import java.util.Arrays; - -import org.apache.log4j.Logger; - -import com.github.xsavikx.android.screencast.app.AndroidScreencastApplication; -import com.github.xsavikx.android.screencast.app.Application; -import com.github.xsavikx.android.screencast.spring.config.ApplicationContextProvider; - -public class Main { - private static final Logger LOGGER = Logger.getLogger(Main.class); - - public static void main(String args[]) { - LOGGER.debug("main(String[] args=" + Arrays.toString(args) + ") - start"); - Application application = ApplicationContextProvider.getApplicationContext() - .getBean(AndroidScreencastApplication.class); - application.init(); - application.start(); - - LOGGER.debug("main(String[] args=" + Arrays.toString(args) + ") - end"); - } - -} diff --git a/src/com/github/xsavikx/android/screencast/api/AndroidDevice.java b/src/com/github/xsavikx/android/screencast/api/AndroidDevice.java deleted file mode 100644 index 9223d6b..0000000 --- a/src/com/github/xsavikx/android/screencast/api/AndroidDevice.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.github.xsavikx.android.screencast.api; - -import java.io.File; -import java.util.List; - -import com.github.xsavikx.android.screencast.api.file.FileInfo; - -public interface AndroidDevice { - String executeCommand(String command); - - List list(String path); - - void openUrl(String url); - - void pullFile(String remoteFrom, File localTo); - - void pushFile(File localFrom, String remoteTo); -} diff --git a/src/com/github/xsavikx/android/screencast/api/AndroidDeviceImpl.java b/src/com/github/xsavikx/android/screencast/api/AndroidDeviceImpl.java deleted file mode 100644 index 14cfbb5..0000000 --- a/src/com/github/xsavikx/android/screencast/api/AndroidDeviceImpl.java +++ /dev/null @@ -1,161 +0,0 @@ -package com.github.xsavikx.android.screencast.api; - -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.lang.reflect.Method; -import java.util.List; -import java.util.Vector; - -import org.apache.log4j.Logger; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.android.ddmlib.IDevice; -import com.android.ddmlib.SyncService; -import com.android.ddmlib.SyncService.ISyncProgressMonitor; -import com.github.xsavikx.android.screencast.api.file.FileInfo; -import com.github.xsavikx.android.screencast.api.injector.OutputStreamShellOutputReceiver; - -@Component -public class AndroidDeviceImpl implements AndroidDevice { - /** - * Logger for this class - */ - private static final Logger logger = Logger.getLogger(AndroidDeviceImpl.class); - @Autowired(required = false) - private IDevice device; - - public AndroidDeviceImpl() { - - } - - public AndroidDeviceImpl(IDevice device) { - this.device = device; - } - - @Override - public String executeCommand(String cmd) { - if (logger.isDebugEnabled()) { - logger.debug("executeCommand(String) - start"); - } - - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - try { - device.executeShellCommand(cmd, new OutputStreamShellOutputReceiver(bos)); - String returnString = new String(bos.toByteArray(), "UTF-8"); - if (logger.isDebugEnabled()) { - logger.debug("executeCommand(String) - end"); - } - return returnString; - } catch (Exception ex) { - logger.error("executeCommand(String)", ex); - - throw new RuntimeException(ex); - } - } - - @Override - public List list(String path) { - if (logger.isDebugEnabled()) { - logger.debug("list(String) - start"); - } - - try { - String s = executeCommand("ls -l " + path); - String[] entries = s.split("\r\n"); - Vector liste = new Vector(); - for (int i = 0; i < entries.length; i++) { - String[] data = entries[i].split(" "); - if (data.length < 4) - continue; - /* - * for(int j=0; j eventsWithCharacters = fillEventsWithCharacters(); - private static Set eventsWithKeyCodes = fillEventsWithKeyCodes(); - - private InputKeyEvent(int code, String description){ - this.code = code; - this.description = description; - } - - private InputKeyEvent(int code, String description, char character){ - this(code,description); - this.characterToReplace = character; - } - - private InputKeyEvent(int code, String description, int keyCode){ - this(code,description); - this.keyCode = keyCode; - } - - public int getKeyCode() { - return keyCode; - } - - public int getCode(){ - return code; - } - - public String getDescription() { - return description; - } - - public char getCharacterToReplace() { - return characterToReplace; - } - - public static InputKeyEvent getByCharacter(char c){ - for(InputKeyEvent e : eventsWithCharacters){ - if (e.characterToReplace == c){ - return e; - } - } - return null; - } - - public static InputKeyEvent getByKeyCode(int keyCode){ - for(InputKeyEvent e : eventsWithKeyCodes){ - if (e.keyCode == keyCode){ - return e; - } - } - return null; - } - - public static InputKeyEvent getByCharacterOrKeyCode(char c, int keyCode){ - InputKeyEvent e = getByCharacter(c); - if (e==null) - e=getByKeyCode(keyCode); - return e; - } - - private static Set fillEventsWithCharacters(){ - Set eventsWithCharacters = EnumSet.allOf(InputKeyEvent.class); - for(InputKeyEvent e : values()){ - if (e.characterToReplace =='\u0000'){ - eventsWithCharacters.remove(e); - } - } - return eventsWithCharacters; - } - private static Set fillEventsWithKeyCodes(){ - Set eventsWithKeyCodes = EnumSet.allOf(InputKeyEvent.class); - for(InputKeyEvent e : values()){ - if (e.keyCode == 0){ - eventsWithKeyCodes.remove(e); - } - } - return eventsWithKeyCodes; - } - - -} diff --git a/src/com/github/xsavikx/android/screencast/api/injector/KeyCodeConverter.java b/src/com/github/xsavikx/android/screencast/api/injector/KeyCodeConverter.java deleted file mode 100644 index 13d5a00..0000000 --- a/src/com/github/xsavikx/android/screencast/api/injector/KeyCodeConverter.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.github.xsavikx.android.screencast.api.injector; - -import java.awt.event.KeyEvent; - -import org.apache.log4j.Logger; - -public class KeyCodeConverter { - private static final Logger LOGGER = Logger.getLogger(KeyCodeConverter.class); - - public static int getKeyCode(KeyEvent e) { - LOGGER.debug("getKeyCode(KeyEvent e=" + e + ") - start"); - int code = InputKeyEvent.KEYCODE_UNKNOWN.getCode(); - char c = e.getKeyChar(); - int keyCode = e.getKeyCode(); - InputKeyEvent inputKeyEvent = InputKeyEvent.getByCharacterOrKeyCode(Character.toLowerCase(c), keyCode); - if (inputKeyEvent != null) { - code = inputKeyEvent.getCode(); - } - LOGGER.debug("getKeyCode(KeyEvent e=" + e + ") - end"); - return code; - } - -} diff --git a/src/com/github/xsavikx/android/screencast/api/injector/MultiLineReceiverPrinter.java b/src/com/github/xsavikx/android/screencast/api/injector/MultiLineReceiverPrinter.java deleted file mode 100644 index e1d8ee9..0000000 --- a/src/com/github/xsavikx/android/screencast/api/injector/MultiLineReceiverPrinter.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.github.xsavikx.android.screencast.api.injector; - -import org.springframework.stereotype.Component; - -import com.android.ddmlib.MultiLineReceiver; - -@Component -public class MultiLineReceiverPrinter extends MultiLineReceiver { - - @Override - public boolean isCancelled() { - return false; - } - - @Override - public void processNewLines(String[] arg0) { - for (String elem : arg0) { - System.out.println(elem); - } - } - -} diff --git a/src/com/github/xsavikx/android/screencast/api/injector/OutputStreamShellOutputReceiver.java b/src/com/github/xsavikx/android/screencast/api/injector/OutputStreamShellOutputReceiver.java deleted file mode 100644 index 52cdcd8..0000000 --- a/src/com/github/xsavikx/android/screencast/api/injector/OutputStreamShellOutputReceiver.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.github.xsavikx.android.screencast.api.injector; - -import java.io.IOException; -import java.io.OutputStream; - -import com.android.ddmlib.IShellOutputReceiver; - -public class OutputStreamShellOutputReceiver implements IShellOutputReceiver { - - private OutputStream os; - - public OutputStreamShellOutputReceiver(OutputStream os) { - this.os = os; - } - - @Override - public void addOutput(byte[] buf, int off, int len) { - try { - os.write(buf, off, len); - } catch (IOException ex) { - throw new RuntimeException(ex); - } - } - - @Override - public void flush() { - try { - os.flush(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public boolean isCancelled() { - return false; - } - -} diff --git a/src/com/github/xsavikx/android/screencast/api/injector/ScreenCaptureThread.java b/src/com/github/xsavikx/android/screencast/api/injector/ScreenCaptureThread.java deleted file mode 100644 index e8e9ac4..0000000 --- a/src/com/github/xsavikx/android/screencast/api/injector/ScreenCaptureThread.java +++ /dev/null @@ -1,195 +0,0 @@ -package com.github.xsavikx.android.screencast.api.injector; - -import java.awt.Dimension; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; -import java.util.concurrent.TimeUnit; - -import javax.swing.SwingUtilities; - -import org.apache.log4j.Logger; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.android.ddmlib.AdbCommandRejectedException; -import com.android.ddmlib.IDevice; -import com.android.ddmlib.RawImage; -import com.android.ddmlib.TimeoutException; -import com.github.xsavikx.android.screencast.api.recording.QuickTimeOutputStream; - -@Component -public class ScreenCaptureThread extends Thread { - private static final Logger LOGGER = Logger.getLogger(ScreenCaptureThread.class); - - public interface ScreenCaptureListener { - public void handleNewImage(Dimension size, BufferedImage image, boolean landscape); - } - - private BufferedImage image; - private Dimension size; - @Autowired - private IDevice device; - private QuickTimeOutputStream qos = null; - private boolean landscape = false; - - private ScreenCaptureListener listener = null; - - public ScreenCaptureThread() { - super("Screen capture"); - image = null; - size = new Dimension(); - } - - public void display(RawImage rawImage) { - int width2 = landscape ? rawImage.height : rawImage.width; - int height2 = landscape ? rawImage.width : rawImage.height; - if (image == null) { - image = new BufferedImage(width2, height2, BufferedImage.TYPE_INT_RGB); - size.setSize(image.getWidth(), image.getHeight()); - } else { - if (image.getHeight() != height2 || image.getWidth() != width2) { - image = new BufferedImage(width2, height2, BufferedImage.TYPE_INT_RGB); - size.setSize(image.getWidth(), image.getHeight()); - } - } - int index = 0; - int indexInc = rawImage.bpp >> 3; - for (int y = 0; y < rawImage.height; y++) { - for (int x = 0; x < rawImage.width; x++, index += indexInc) { - int value = rawImage.getARGB(index); - if (landscape) - image.setRGB(y, rawImage.width - x - 1, value); - else - image.setRGB(x, y, value); - } - } - - try { - if (qos != null) - qos.writeFrame(image, 10); - } catch (IOException e) { - LOGGER.error("display(RawImage)", e); - - throw new RuntimeException(e); - } - - if (listener != null) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - listener.handleNewImage(size, image, landscape); - } - }); - } - - } - - private boolean fetchImage() throws IOException { - - if (device == null) { - // device not ready - try { - Thread.sleep(100); - } catch (InterruptedException e) { - LOGGER.error("fetchImage()", e); - return false; - } - return true; - } - RawImage rawImage = null; - synchronized (device) { - try { - rawImage = device.getScreenshot(5, TimeUnit.SECONDS); - } catch (TimeoutException | AdbCommandRejectedException e) { - LOGGER.error("fetchImage()", e); - } - } - if (rawImage != null) { - display(rawImage); - } else { - LOGGER.info("failed getting screenshot through ADB ok"); - } - try { - Thread.sleep(5); - } catch (InterruptedException e) { - LOGGER.error("fetchImage()", e); - return false; - } - return true; - } - - public ScreenCaptureListener getListener() { - return listener; - } - - public Dimension getPreferredSize() { - return size; - } - - @Override - public void run() { - do { - try { - boolean ok = fetchImage(); - if (!ok) - break; - } catch (java.nio.channels.ClosedByInterruptException ciex) { - LOGGER.error("run()", ciex); - - break; - } catch (IOException e) { - LOGGER.error("run()", e); - LOGGER.error((new StringBuilder()).append("Exception fetching image: ").append(e.toString()).toString()); - } - - } while (true); - } - - public void setListener(ScreenCaptureListener listener) { - this.listener = listener; - } - - public void startRecording(File f) { - LOGGER.debug("startRecording(File f=" + f + ") - start"); - - try { - if (!f.getName().toLowerCase().endsWith(".mov")) - f = new File(f.getAbsolutePath() + ".mov"); - qos = new QuickTimeOutputStream(f, QuickTimeOutputStream.VideoFormat.JPG); - } catch (IOException e) { - LOGGER.error("startRecording(File)", e); - - throw new RuntimeException(e); - } - qos.setVideoCompressionQuality(1f); - qos.setTimeScale(30); // 30 fps - - LOGGER.debug("startRecording(File f=" + f + ") - end"); - } - - public void stopRecording() { - LOGGER.debug("stopRecording() - start"); - - try { - QuickTimeOutputStream o = qos; - qos = null; - o.close(); - } catch (IOException e) { - LOGGER.error("stopRecording()", e); - - throw new RuntimeException(e); - } - - LOGGER.debug("stopRecording() - end"); - } - - public void toogleOrientation() { - LOGGER.debug("toogleOrientation() - start"); - - landscape = !landscape; - - LOGGER.debug("toogleOrientation() - end"); - } - -} diff --git a/src/com/github/xsavikx/android/screencast/api/recording/DataAtomOutputStream.java b/src/com/github/xsavikx/android/screencast/api/recording/DataAtomOutputStream.java deleted file mode 100644 index 5552fef..0000000 --- a/src/com/github/xsavikx/android/screencast/api/recording/DataAtomOutputStream.java +++ /dev/null @@ -1,341 +0,0 @@ -package com.github.xsavikx.android.screencast.api.recording; - -import java.io.FilterOutputStream; -import java.io.IOException; -import java.io.OutputStream; -import java.io.UnsupportedEncodingException; -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; - -public class DataAtomOutputStream extends FilterOutputStream { - - protected static final long MAC_TIMESTAMP_EPOCH = new GregorianCalendar(1904, Calendar.JANUARY, 1).getTimeInMillis(); - /** - * The number of bytes written to the data output stream so far. If this counter overflows, it will be wrapped to Integer.MAX_VALUE. - */ - protected long written; - - public DataAtomOutputStream(OutputStream out) { - super(out); - } - - /** - * Increases the written counter by the specified value until it reaches Long.MAX_VALUE. - */ - protected void incCount(int value) { - long temp = written + value; - if (temp < 0) { - temp = Long.MAX_VALUE; - } - written = temp; - } - - /** - * Returns the current value of the counter written, the number of bytes written to this data output stream so far. If the counter - * overflows, it will be wrapped to Integer.MAX_VALUE. - * - * @return the value of the written field. - * @see java.io.DataOutputStream#written - */ - public final long size() { - return written; - } - - /** - * Writes len bytes from the specified byte array starting at offset off to the underlying output stream. If no exception - * is thrown, the counter written is incremented by len . - * - * @param b - * the data. - * @param off - * the start offset in the data. - * @param len - * the number of bytes to write. - * @exception IOException - * if an I/O error occurs. - * @see java.io.FilterOutputStream#out - */ - @Override - public synchronized void write(byte b[], int off, int len) throws IOException { - out.write(b, off, len); - incCount(len); - } - - /** - * Writes the specified byte (the low eight bits of the argument b) to the underlying output stream. If no exception is thrown, the - * counter written is incremented by 1 . - *

- * Implements the write method of OutputStream. - * - * @param b - * the byte to be written. - * @exception IOException - * if an I/O error occurs. - * @see java.io.FilterOutputStream#out - */ - @Override - public synchronized void write(int b) throws IOException { - out.write(b); - incCount(1); - } - - /** - * Writes a BCD2 to the underlying output stream. - * - * @param v - * an int to be written. - * @exception IOException - * if an I/O error occurs. - * @see java.io.FilterOutputStream#out - */ - public void writeBCD2(int v) throws IOException { - out.write(((v % 100 / 10) << 4) | (v % 10)); - incCount(1); - } - - /** - * Writes a BCD4 to the underlying output stream. - * - * @param v - * an int to be written. - * @exception IOException - * if an I/O error occurs. - * @see java.io.FilterOutputStream#out - */ - public void writeBCD4(int v) throws IOException { - out.write(((v % 10000 / 1000) << 4) | (v % 1000 / 100)); - out.write(((v % 100 / 10) << 4) | (v % 10)); - incCount(2); - } - - /** - * Writes out a byte to the underlying output stream as a 1-byte value. If no exception is thrown, the counter written is - * incremented by 1. - * - * @param v - * a byte value to be written. - * @exception IOException - * if an I/O error occurs. - * @see java.io.FilterOutputStream#out - */ - public final void writeByte(int v) throws IOException { - out.write(v); - incCount(1); - } - - /** - * Writes 32-bit fixed-point number divided as 16.16. - * - * @param f - * an int to be written. - * @exception IOException - * if an I/O error occurs. - * @see java.io.FilterOutputStream#out - */ - public void writeFixed16D16(double f) throws IOException { - double v = (f >= 0) ? f : -f; - - int wholePart = (int) v; - int fractionPart = (int) ((v - wholePart) * 65536); - int t = (wholePart << 16) + fractionPart; - - if (f < 0) { - t = t - 1; - } - writeInt(t); - } - - /** - * Writes 32-bit fixed-point number divided as 2.30. - * - * @param f - * an int to be written. - * @exception IOException - * if an I/O error occurs. - * @see java.io.FilterOutputStream#out - */ - public void writeFixed2D30(double f) throws IOException { - double v = (f >= 0) ? f : -f; - - int wholePart = (int) v; - int fractionPart = (int) ((v - wholePart) * 1073741824); - int t = (wholePart << 30) + fractionPart; - - if (f < 0) { - t = t - 1; - } - writeInt(t); - } - - /** - * Writes 16-bit fixed-point number divided as 8.8. - * - * @param f - * an int to be written. - * @exception IOException - * if an I/O error occurs. - * @see java.io.FilterOutputStream#out - */ - public void writeFixed8D8(float f) throws IOException { - float v = (f >= 0) ? f : -f; - - int wholePart = (int) v; - int fractionPart = (int) ((v - wholePart) * 256); - int t = (wholePart << 8) + fractionPart; - - if (f < 0) { - t = t - 1; - } - writeUShort(t); - } - - /** - * Writes an int to the underlying output stream as four bytes, high byte first. If no exception is thrown, the counter - * written is incremented by 4. - * - * @param v - * an int to be written. - * @exception IOException - * if an I/O error occurs. - * @see java.io.FilterOutputStream#out - */ - public void writeInt(int v) throws IOException { - out.write((v >>> 24) & 0xff); - out.write((v >>> 16) & 0xff); - out.write((v >>> 8) & 0xff); - out.write((v >>> 0) & 0xff); - incCount(4); - } - - public void writeLong(long v) throws IOException { - out.write((int) (v >>> 56) & 0xff); - out.write((int) (v >>> 48) & 0xff); - out.write((int) (v >>> 40) & 0xff); - out.write((int) (v >>> 32) & 0xff); - out.write((int) (v >>> 24) & 0xff); - out.write((int) (v >>> 16) & 0xff); - out.write((int) (v >>> 8) & 0xff); - out.write((int) (v >>> 0) & 0xff); - incCount(8); - } - - /** - * Writes a 32-bit Mac timestamp (seconds since 1902). - * - * @param date - * @throws java.io.IOException - */ - public void writeMacTimestamp(Date date) throws IOException { - long millis = date.getTime(); - long qtMillis = millis - MAC_TIMESTAMP_EPOCH; - long qtSeconds = qtMillis / 1000; - writeUInt(qtSeconds); - } - - /** - * Writes a Pascal String. - * - * @param s - * @throws java.io.IOException - */ - public void writePString(String s) throws IOException { - if (s.length() > 0xffff) { - throw new IllegalArgumentException("String too long for PString"); - } - if (s.length() < 256) { - out.write(s.length()); - } else { - out.write(0); - writeShort(s.length()); // increments +2 - } - for (int i = 0; i < s.length(); i++) { - out.write(s.charAt(i)); - } - incCount(1 + s.length()); - } - - /** - * Writes a Pascal String padded to the specified fixed size in bytes - * - * @param s - * @param length - * the fixed size in bytes - * @throws java.io.IOException - */ - public void writePString(String s, int length) throws IOException { - if (s.length() > length) { - throw new IllegalArgumentException("String too long for PString of length " + length); - } - if (s.length() < 256) { - out.write(s.length()); - } else { - out.write(0); - writeShort(s.length()); // increments +2 - } - for (int i = 0; i < s.length(); i++) { - out.write(s.charAt(i)); - } - - // write pad bytes - for (int i = 1 + s.length(); i < length; i++) { - out.write(0); - } - - incCount(length); - } - - /** - * Writes a signed 16 bit integer value. - * - * @param v - * The value - * @throws java.io.IOException - */ - public void writeShort(int v) throws IOException { - out.write((v >> 8) & 0xff); - out.write((v >>> 0) & 0xff); - incCount(2); - } - - /** - * Writes an Atom Type identifier (4 bytes). - * - * @param s - * A string with a length of 4 characters. - */ - public void writeType(String s) throws IOException { - if (s.length() != 4) { - throw new IllegalArgumentException("type string must have 4 characters"); - } - - try { - out.write(s.getBytes("ASCII"), 0, 4); - incCount(4); - } catch (UnsupportedEncodingException e) { - throw new InternalError(e.toString()); - } - } - - /** - * Writes an unsigned 32 bit integer value. - * - * @param v - * The value - * @throws java.io.IOException - */ - public void writeUInt(long v) throws IOException { - out.write((int) ((v >>> 24) & 0xff)); - out.write((int) ((v >>> 16) & 0xff)); - out.write((int) ((v >>> 8) & 0xff)); - out.write((int) ((v >>> 0) & 0xff)); - incCount(4); - } - - public void writeUShort(int v) throws IOException { - out.write((v >> 8) & 0xff); - out.write((v >>> 0) & 0xff); - incCount(2); - } - -} diff --git a/src/com/github/xsavikx/android/screencast/api/recording/FilterImageOutputStream.java b/src/com/github/xsavikx/android/screencast/api/recording/FilterImageOutputStream.java deleted file mode 100644 index 7baaaac..0000000 --- a/src/com/github/xsavikx/android/screencast/api/recording/FilterImageOutputStream.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.github.xsavikx.android.screencast.api.recording; - -import java.io.FilterOutputStream; -import java.io.IOException; - -import javax.imageio.stream.ImageOutputStream; - -public class FilterImageOutputStream extends FilterOutputStream { - private ImageOutputStream imgOut; - - public FilterImageOutputStream(ImageOutputStream iOut) { - super(null); - this.imgOut = iOut; - } - - /** - * Closes this output stream and releases any system resources associated with the stream. - *

- * The close method of FilterOutputStream calls its flush method, and then calls the close - * method of its underlying output stream. - * - * @exception IOException - * if an I/O error occurs. - * @see java.io.FilterOutputStream#flush() - * @see java.io.FilterOutputStream#out - */ - @Override - public void close() throws IOException { - flush(); - imgOut.close(); - } - - /** - * Flushes this output stream and forces any buffered output bytes to be written out to the stream. - *

- * The flush method of FilterOutputStream calls the flush method of its underlying output stream. - * - * @exception IOException - * if an I/O error occurs. - * @see java.io.FilterOutputStream#out - */ - @Override - public void flush() { - // System.err.println(this+" discarded flush"); - // imgOut.flush(); - } - - /** - * Writes len bytes from the specified byte array starting at offset off to this output stream. - *

- * The write method of FilterOutputStream calls the write method of one argument on each byte to - * output. - *

- * Note that this method does not call the write method of its underlying input stream with the same arguments. Subclasses of - * FilterOutputStream should provide a more efficient implementation of this method. - * - * @param b - * the data. - * @param off - * the start offset in the data. - * @param len - * the number of bytes to write. - * @exception IOException - * if an I/O error occurs. - * @see java.io.FilterOutputStream#write(int) - */ - @Override - public void write(byte b[], int off, int len) throws IOException { - imgOut.write(b, off, len); - } - - /** - * Writes the specified byte to this output stream. - *

- * The write method of FilterOutputStream calls the write method of its underlying output stream, that is, it - * performs out.write(b). - *

- * Implements the abstract write method of OutputStream. - * - * @param b - * the byte. - * @exception IOException - * if an I/O error occurs. - */ - @Override - public void write(int b) throws IOException { - imgOut.write(b); - } -} diff --git a/src/com/github/xsavikx/android/screencast/api/recording/QuickTimeOutputStream.java b/src/com/github/xsavikx/android/screencast/api/recording/QuickTimeOutputStream.java deleted file mode 100644 index 3da662d..0000000 --- a/src/com/github/xsavikx/android/screencast/api/recording/QuickTimeOutputStream.java +++ /dev/null @@ -1,1632 +0,0 @@ -package com.github.xsavikx.android.screencast.api.recording; - -import java.awt.image.BufferedImage; -import java.awt.image.WritableRaster; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.util.Date; -import java.util.LinkedList; - -import javax.imageio.IIOImage; -import javax.imageio.ImageIO; -import javax.imageio.ImageWriteParam; -import javax.imageio.ImageWriter; -import javax.imageio.stream.FileImageOutputStream; -import javax.imageio.stream.ImageOutputStream; -import javax.imageio.stream.MemoryCacheImageOutputStream; - -public class QuickTimeOutputStream { - - /** - * Atom base class. - */ - private abstract class Atom { - - /** - * The type of the atom. A String with the length of 4 characters. - */ - protected String type; - /** - * The offset of the atom relative to the start of the ImageOutputStream. - */ - protected long offset; - - /** - * Creates a new Atom at the current position of the ImageOutputStream. - * - * @param type - * The type of the atom. A string with a length of 4 characters. - */ - public Atom(String type) throws IOException { - this.type = type; - offset = out.getStreamPosition(); - } - - /** - * Writes the atom to the ImageOutputStream and disposes it. - */ - public abstract void finish() throws IOException; - - /** - * Returns the size of the atom including the size of the atom header. - * - * @return The size of the atom. - */ - public abstract long size(); - } - - /** - * A CompositeAtom contains an ordered list of Atoms. - */ - private class CompositeAtom extends Atom { - - private LinkedList children; - private boolean finished; - - /** - * Creates a new CompositeAtom at the current position of the ImageOutputStream. - * - * @param type - * The type of the atom. - */ - public CompositeAtom(String type) throws IOException { - super(type); - out.writeLong(0); // make room for the atom header - children = new LinkedList(); - } - - public void add(Atom child) throws IOException { - if (children.size() > 0) { - children.getLast().finish(); - } - children.add(child); - } - - /** - * Writes the atom and all its children to the ImageOutputStream and disposes of all resources held by the atom. - * - * @throws java.io.IOException - */ - @Override - public void finish() throws IOException { - if (!finished) { - if (size() > 0xffffffffL) { - throw new IOException("CompositeAtom \"" + type + "\" is too large: " + size()); - } - - long pointer = out.getStreamPosition(); - out.seek(offset); - try (DataAtomOutputStream headerData = new DataAtomOutputStream(new FilterImageOutputStream(out));) { - - headerData.writeInt((int) size()); - headerData.writeType(type); - for (Atom child : children) { - child.finish(); - } - out.seek(pointer); - finished = true; - } - } - } - - @Override - public long size() { - long length = 8; - for (Atom child : children) { - length += child.size(); - } - return length; - } - } - - /** - * Data Atom. - */ - protected class DataAtom extends Atom { - - private DataAtomOutputStream data; - private boolean finished; - - /** - * Creates a new DataAtom at the current position of the ImageOutputStream. - * - * @param type - * The type of the atom. - */ - public DataAtom(String name) throws IOException { - super(name); - out.writeLong(0); // make room for the atom header - data = new DataAtomOutputStream(new FilterImageOutputStream(out)); - } - - @Override - public void finish() throws IOException { - if (!finished) { - long sizeBefore = size(); - - if (size() > 0xffffffffL) { - throw new IOException("DataAtom \"" + type + "\" is too large: " + size()); - } - - long pointer = out.getStreamPosition(); - out.seek(offset); - try (DataAtomOutputStream headerData = new DataAtomOutputStream(new FilterImageOutputStream(out));) { - headerData.writeUInt(size()); - headerData.writeType(type); - out.seek(pointer); - finished = true; - long sizeAfter = size(); - if (sizeBefore != sizeAfter) { - System.err.println("size mismatch " + sizeBefore + ".." + sizeAfter); - } - } - } - } - - /** - * Returns the offset of this atom to the beginning of the random access file - * - * @return - */ - public long getOffset() { - return offset; - } - - public DataAtomOutputStream getOutputStream() { - if (finished) { - throw new IllegalStateException("DataAtom is finished"); - } - return data; - } - - @Override - public long size() { - return 8 + data.size(); - } - } - - /** - * QuickTime stores media data in samples. A sample is a single element in a sequence of time-ordered data. Samples are stored in the mdat atom. - */ - private static class Sample { - - /** - * Offset of the sample relative to the start of the QuickTime file. - */ - long offset; - /** Data length of the sample. */ - long length; - /** - * The duration of the sample in time scale units. - */ - int duration; - - /** - * Creates a new sample. - * - * @param duration - * @param offset - * @param length - */ - public Sample(int duration, long offset, long length) { - this.duration = duration; - this.offset = offset; - this.length = length; - } - } - - /** - * The states of the movie output stream. - */ - private static enum States { - - STARTED, FINISHED, CLOSED; - } - - /** - * Supported video formats. - */ - public static enum VideoFormat { - - RAW, JPG, PNG; - } - - /** - * WideDataAtom can grow larger then 4 gigabytes. - */ - protected class WideDataAtom extends Atom { - - private DataAtomOutputStream data; - private boolean finished; - - /** - * Creates a new DataAtom at the current position of the ImageOutputStream. - * - * @param type - * The type of the atom. - */ - public WideDataAtom(String type) throws IOException { - super(type); - out.writeLong(0); // make room for the atom header - out.writeLong(0); // make room for the atom header - data = new DataAtomOutputStream(new FilterImageOutputStream(out)); - } - - @Override - public void finish() throws IOException { - if (!finished) { - long pointer = out.getStreamPosition(); - out.seek(offset); - try (DataAtomOutputStream headerData = new DataAtomOutputStream(new FilterImageOutputStream(out));) { - - if (size() <= 0xffffffffL) { - headerData.writeUInt(8); - headerData.writeType("wide"); - headerData.writeUInt(size()); - headerData.writeType(type); - } else { - headerData.writeInt(1); // special value for extended - // size - // atoms - headerData.writeType(type); - headerData.writeLong(size()); - } - - out.seek(pointer); - finished = true; - } - } - } - - /** - * Returns the offset of this atom to the beginning of the random access file - * - * @return - */ - public long getOffset() { - return offset; - } - - public DataAtomOutputStream getOutputStream() { - if (finished) { - throw new IllegalStateException("Atom is finished"); - } - return data; - } - - @Override - public long size() { - long size = 8 + data.size(); - return (size > 0xffffffffL) ? size + 8 : size; - } - } - - /** - * Output stream of the QuickTimeOutputStream. - */ - private ImageOutputStream out; - - /** - * Current video format. - */ - private VideoFormat videoFormat; - - /** - * Quality of JPEG encoded video frames. - */ - private float quality = 0.9f; - - /** - * Creation time of the movie output stream. - */ - private Date creationTime; - - /** - * Width of the video frames. All frames must have the same width. The value -1 is used to mark unspecified width. - */ - private int imgWidth = -1; - /** - * Height of the video frames. All frames must have the same height. The value -1 is used to mark unspecified height. - */ - private int imgHeight = -1; - - /** - * The timeScale of the movie. A time value that indicates the time scale for this media-that is, the number of time units that pass per second in - * its time coordinate system. - */ - private int timeScale = 600; - - /** - * The current state of the movie output stream. - */ - private States state = States.FINISHED; - - /** - * List of video frames. - */ - private LinkedList videoFrames; - - /** - * This atom holds the movie frames. - */ - private WideDataAtom mdatAtom; - - /** - * Creates a new output stream with the specified image videoFormat and framerate. - * - * @param file - * the output file - * @param format - * Selects an encoder for the video format "JPG" or "PNG". - * @exception IllegalArgumentException - * if videoFormat is null or if framerate is <= 0 - */ - public QuickTimeOutputStream(File file, VideoFormat format) throws IOException { - if (file.exists()) { - file.delete(); - } - out = new FileImageOutputStream(file); - - if (format == null) { - throw new IllegalArgumentException("format must not be null"); - } - - this.videoFormat = format; - - this.videoFrames = new LinkedList(); - } - - /** - * Closes the movie file as well as the stream being filtered. - * - * @exception IOException - * if an I/O error has occurred - */ - public void close() throws IOException { - if (state == States.STARTED) { - finish(); - } - if (state != States.CLOSED) { - out.close(); - state = States.CLOSED; - } - } - - /** - * Check to make sure that this stream has not been closed - */ - private void ensureOpen() throws IOException { - if (state == States.CLOSED) { - throw new IOException("Stream closed"); - } - } - - /** - * Sets the state of the QuickTimeOutpuStream to started. - *

- * If the state is changed by this method, the prolog is written. - */ - private void ensureStarted() throws IOException { - if (state != States.STARTED) { - creationTime = new Date(); - writeProlog(); - mdatAtom = new WideDataAtom("mdat"); - state = States.STARTED; - } - } - - /** - * Finishes writing the contents of the QuickTime output stream without closing the underlying stream. Use this method when applying multiple - * filters in succession to the same output stream. - * - * @exception IllegalStateException - * if the dimension of the video track has not been specified or determined yet. - * @exception IOException - * if an I/O exception has occurred - */ - public void finish() throws IOException { - ensureOpen(); - if (state != States.FINISHED) { - if (imgWidth == -1 || imgHeight == -1) { - throw new IllegalStateException("image width and height must be specified"); - } - mdatAtom.finish(); - writeEpilog(); - state = States.FINISHED; - imgWidth = imgHeight = -1; - } - } - - /** - * Returns the time scale of this media. - * - * @return time scale - */ - public int getTimeScale() { - return timeScale; - } - - /** - * Returns the video compression quality. - * - * @return video compression quality - */ - public float getVideoCompressionQuality() { - return quality; - } - - /** - * Sets the time scale for this media, that is, the number of time units that pass per second in its time coordinate system. - *

- * The default value is 600. - * - * @param newValue - */ - public void setTimeScale(int newValue) { - if (newValue <= 0) { - throw new IllegalArgumentException("timeScale must be greater 0"); - } - this.timeScale = newValue; - } - - /** - * Sets the compression quality of the video track. A value of 0 stands for "high compression is important" a value of 1 for - * "high image quality is important". - *

- * Changing this value affects frames which are subsequently written to the QuickTimeOutputStream. Frames which have already been written are not - * changed. - *

- * This value has no effect on videos encoded with the PNG format. - *

- * The default value is 0.9. - * - * @param newValue - */ - public void setVideoCompressionQuality(float newValue) { - this.quality = newValue; - } - - /** - * Sets the dimension of the video track. - *

- * You need to explicitly set the dimension, if you add all frames from files or input streams. - *

- * If you add frames from buffered images, then QuickTimeOutputStream can determine the video dimension from the image width and height. - * - * @param width - * @param height - */ - public void setVideoDimension(int width, int height) { - if (width < 1 || height < 1) { - throw new IllegalArgumentException("width and height must be greater zero."); - } - this.imgWidth = width; - this.imgHeight = height; - } - - private void writeEpilog() throws IOException { - Date modificationTime = new Date(); - int duration = 0; - for (Sample s : videoFrames) { - duration += s.duration; - } - - DataAtom leaf; - - /* Movie Atom ========= */ - CompositeAtom moovAtom = new CompositeAtom("moov"); - - /* - * Movie Header Atom ------------- The data contained in this atom defines characteristics of the entire QuickTime movie, such as time scale and - * duration. It has an atom type value of 'mvhd'. - * - * typedef struct { byte version; byte[3] flags; mactimestamp creationTime; mactimestamp modificationTime; int timeScale; int duration; int - * preferredRate; short preferredVolume; byte[10] reserved; int[9] matrix; int previewTime; int previewDuration; int posterTime; int - * selectionTime; int selectionDuration; int currentTime; int nextTrackId; } movieHeaderAtom; - */ - leaf = new DataAtom("mvhd"); - moovAtom.add(leaf); - DataAtomOutputStream d = leaf.getOutputStream(); - d.writeByte(0); // version - // A 1-byte specification of the version of this movie header atom. - - d.writeByte(0); // flags[0] - d.writeByte(0); // flags[1] - d.writeByte(0); // flags[2] - // Three bytes of space for future movie header flags. - - d.writeMacTimestamp(creationTime); // creationTime - // A 32-bit integer that specifies the calendar date and time (in - // seconds since midnight, January 1, 1904) when the movie atom was - // created. It is strongly recommended that this value should be - // specified using coordinated universal time (UTC). - - d.writeMacTimestamp(modificationTime); // modificationTime - // A 32-bit integer that specifies the calendar date and time (in - // seconds since midnight, January 1, 1904) when the movie atom was - // changed. BooleanIt is strongly recommended that this value should be - // specified using coordinated universal time (UTC). - - d.writeInt(timeScale); // timeScale - // A time value that indicates the time scale for this movie-that is, - // the number of time units that pass per second in its time coordinate - // system. A time coordinate system that measures time in sixtieths of a - // second, for example, has a time scale of 60. - - d.writeInt(duration); // duration - // A time value that indicates the duration of the movie in time scale - // units. Note that this property is derived from the movie's tracks. - // The value of this field corresponds to the duration of the longest - // track in the movie. - - d.writeFixed16D16(1d); // preferredRate - // A 32-bit fixed-point number that specifies the rate at which to play - // this movie. A value of 1.0 indicates normal rate. - - d.writeShort(256); // preferredVolume - // A 16-bit fixed-point number that specifies how loud to play this - // movie's sound. A value of 1.0 indicates full volume. - - d.write(new byte[10]); // reserved; - // Ten bytes reserved for use by Apple. Set to 0. - - d.writeFixed16D16(1f); // matrix[0] - d.writeFixed16D16(0f); // matrix[1] - d.writeFixed2D30(0f); // matrix[2] - d.writeFixed16D16(0f); // matrix[3] - d.writeFixed16D16(1f); // matrix[4] - d.writeFixed2D30(0); // matrix[5] - d.writeFixed16D16(0); // matrix[6] - d.writeFixed16D16(0); // matrix[7] - d.writeFixed2D30(1f); // matrix[8] - // The matrix structure associated with this movie. A matrix shows how - // to map points from one coordinate space into another. See "Matrices" - // for a discussion of how display matrices are used in QuickTime: - // http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap4/chapter_5_section_4.html#//apple_ref/doc/uid/TP40000939-CH206-18737 - - d.writeInt(0); // previewTime - // The time value in the movie at which the preview begins. - - d.writeInt(0); // previewDuration - // The duration of the movie preview in movie time scale units. - - d.writeInt(0); // posterTime - // The time value of the time of the movie poster. - - d.writeInt(0); // selectionTime - // The time value for the start time of the current selection. - - d.writeInt(0); // selectionDuration - // The duration of the current selection in movie time scale units. - - d.writeInt(0); // currentTime; - // The time value for current time position within the movie. - - d.writeInt(2); // nextTrackId - // A 32-bit integer that indicates a value to use for the track ID - // number of the next track added to this movie. Note that 0 is not a - // valid track ID value. - - /* Track Atom ======== */ - CompositeAtom trakAtom = new CompositeAtom("trak"); - moovAtom.add(trakAtom); - - /* - * Track Header Atom ----------- The track header atom specifies the characteristics of a single track within a movie. A track header atom - * contains a size field that specifies the number of bytes and a type field that indicates the format of the data (defined by the atom type - * 'tkhd'). - * - * typedef struct { byte version; byte flag0; byte flag1; byte set TrackHeaderFlags flag2; mactimestamp creationTime; mactimestamp - * modificationTime; int trackId; byte[4] reserved; int duration; byte[8] reserved; short layer; short alternateGroup; short volume; byte[2] - * reserved; int[9] matrix; int trackWidth; int trackHeight; } trackHeaderAtom; - */ - leaf = new DataAtom("tkhd"); - trakAtom.add(leaf); - d = leaf.getOutputStream(); - d.write(0); // version - // A 1-byte specification of the version of this track header. - - d.write(0); // flag[0] - d.write(0); // flag[1] - d.write(0xf); // flag[2] - // Three bytes that are reserved for the track header flags. These flags - // indicate how the track is used in the movie. The following flags are - // valid (all flags are enabled when set to 1): - // - // Track enabled - // Indicates that the track is enabled. Flag value is 0x0001. - // Track in movie - // Indicates that the track is used in the movie. Flag value is - // 0x0002. - // Track in preview - // Indicates that the track is used in the movie's preview. Flag - // value is 0x0004. - // Track in poster - // Indicates that the track is used in the movie's poster. Flag - // value is 0x0008. - - d.writeMacTimestamp(creationTime); // creationTime - // A 32-bit integer that indicates the calendar date and time (expressed - // in seconds since midnight, January 1, 1904) when the track header was - // created. It is strongly recommended that this value should be - // specified using coordinated universal time (UTC). - - d.writeMacTimestamp(modificationTime); // modificationTime - // A 32-bit integer that indicates the calendar date and time (expressed - // in seconds since midnight, January 1, 1904) when the track header was - // changed. It is strongly recommended that this value should be - // specified using coordinated universal time (UTC). - - d.writeInt(1); // trackId - // A 32-bit integer that uniquely identifies the track. The value 0 - // cannot be used. - - d.writeInt(0); // reserved; - // A 32-bit integer that is reserved for use by Apple. Set this field to - // 0. - - d.writeInt(duration); // duration - // A time value that indicates the duration of this track (in the - // movie's time coordinate system). Note that this property is derived - // from the track's edits. The value of this field is equal to the sum - // of the durations of all of the track's edits. If there is no edit - // list, then the duration is the sum of the sample durations, converted - // into the movie timescale. - - d.writeLong(0); // reserved - // An 8-byte value that is reserved for use by Apple. Set this field to - // 0. - - d.writeShort(0); // layer; - // A 16-bit integer that indicates this track's spatial priority in its - // movie. The QuickTime Movie Toolbox uses this value to determine how - // tracks overlay one another. Tracks with lower layer values are - // displayed in front of tracks with higher layer values. - - d.writeShort(0); // alternate group - // A 16-bit integer that specifies a collection of movie tracks that - // contain alternate data for one another. QuickTime chooses one track - // from the group to be used when the movie is played. The choice may be - // based on such considerations as playback quality, language, or the - // capabilities of the computer. - - d.writeShort(0); // volume - // A 16-bit fixed-point value that indicates how loudly this track's - // sound is to be played. A value of 1.0 indicates normal volume. - - d.writeShort(0); // reserved - // A 16-bit integer that is reserved for use by Apple. Set this field to - // 0. - - d.writeFixed16D16(1f); // matrix[0] - d.writeFixed16D16(0f); // matrix[1] - d.writeFixed2D30(0f); // matrix[2] - d.writeFixed16D16(0f); // matrix[3] - d.writeFixed16D16(1f); // matrix[4] - d.writeFixed2D30(0); // matrix[5] - d.writeFixed16D16(0); // matrix[6] - d.writeFixed16D16(0); // matrix[7] - d.writeFixed2D30(1f); // matrix[8] - // The matrix structure associated with this track. - // See Figure 2-8 for an illustration of a matrix structure: - // http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap2/chapter_3_section_3.html#//apple_ref/doc/uid/TP40000939-CH204-32967 - - d.writeFixed16D16(imgWidth); // width - // A 32-bit fixed-point number that specifies the width of this track in - // pixels. - - d.writeFixed16D16(imgHeight); // height - // A 32-bit fixed-point number that indicates the height of this track - // in pixels. - - /* Media Atom ========= */ - CompositeAtom mdiaAtom = new CompositeAtom("mdia"); - trakAtom.add(mdiaAtom); - - /* - * Media Header atom ------- typedef struct { byte version; byte[3] flags; mactimestamp creationTime; mactimestamp modificationTime; int - * timeScale; int duration; short language; short quality; } mediaHeaderAtom; - */ - leaf = new DataAtom("mdhd"); - mdiaAtom.add(leaf); - d = leaf.getOutputStream(); - d.write(0); // version - // One byte that specifies the version of this header atom. - - d.write(0); // flag[0] - d.write(0); // flag[1] - d.write(0); // flag[2] - // Three bytes of space for media header flags. Set this field to 0. - - d.writeMacTimestamp(creationTime); // creationTime - // A 32-bit integer that specifies (in seconds since midnight, January - // 1, 1904) when the media atom was created. It is strongly recommended - // that this value should be specified using coordinated universal time - // (UTC). - - d.writeMacTimestamp(modificationTime); // modificationTime - // A 32-bit integer that specifies (in seconds since midnight, January - // 1, 1904) when the media atom was changed. It is strongly recommended - // that this value should be specified using coordinated universal time - // (UTC). - - d.writeInt(timeScale); // timeScale - // A time value that indicates the time scale for this media-that is, - // the number of time units that pass per second in its time coordinate - // system. - - d.writeInt(duration); // duration - // The duration of this media in units of its time scale. - - d.writeShort(0); // language; - // A 16-bit integer that specifies the language code for this media. - // See "Language Code Values" for valid language codes: - // http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap4/chapter_5_section_2.html#//apple_ref/doc/uid/TP40000939-CH206-27005 - - d.writeShort(0); // quality - // A 16-bit integer that specifies the media's playback quality-that is, - // its suitability for playback in a given environment. - - /** Media Handler Atom ------- */ - leaf = new DataAtom("hdlr"); - mdiaAtom.add(leaf); - /* - * typedef struct { byte version; byte[3] flags; magic componentType; magic componentSubtype; magic componentManufacturer; int componentFlags; int - * componentFlagsMask; cstring componentName; } handlerReferenceAtom; - */ - d = leaf.getOutputStream(); - d.write(0); // version - // A 1-byte specification of the version of this handler information. - - d.write(0); // flag[0] - d.write(0); // flag[1] - d.write(0); // flag[2] - // A 3-byte space for handler information flags. Set this field to 0. - - d.writeType("mhlr"); // componentType - // A four-character code that identifies the type of the handler. Only - // two values are valid for this field: 'mhlr' for media handlers and - // 'dhlr' for data handlers. - - d.writeType("vide"); // componentSubtype - // A four-character code that identifies the type of the media handler - // or data handler. For media handlers, this field defines the type of - // data-for example, 'vide' for video data or 'soun' for sound data. - // - // For data handlers, this field defines the data reference type-for - // example, a component subtype value of 'alis' identifies a file alias. - - d.writeInt(0); // componentManufacturer - // Reserved. Set to 0. - - d.writeInt(0); // componentFlags - // Reserved. Set to 0. - - d.writeInt(0); // componentFlagsMask - // Reserved. Set to 0. - - d.write(0); // componentName (empty string) - // A (counted) string that specifies the name of the component-that is, - // the media handler used when this media was created. This field may - // contain a zero-length (empty) string. - - /* Media Information atom ========= */ - CompositeAtom minfAtom = new CompositeAtom("minf"); - mdiaAtom.add(minfAtom); - - /* Video media information atom -------- */ - leaf = new DataAtom("vmhd"); - minfAtom.add(leaf); - /* - * typedef struct { byte version; byte flag1; byte flag2; byte set vmhdFlags flag3; short graphicsMode; ushort[3] opcolor; } - * videoMediaInformationHeaderAtom; - */ - d = leaf.getOutputStream(); - d.write(0); // version - // One byte that specifies the version of this header atom. - - d.write(0); // flag[0] - d.write(0); // flag[1] - d.write(0x1); // flag[2] - // Three bytes of space for media header flags. - // This is a compatibility flag that allows QuickTime to distinguish - // between movies created with QuickTime 1.0 and newer movies. You - // should always set this flag to 1, unless you are creating a movie - // intended for playback using version 1.0 of QuickTime. This flag's - // value is 0x0001. - - d.writeShort(0x40); // graphicsMode (0x40 = ditherCopy) - // A 16-bit integer that specifies the transfer mode. The transfer mode - // specifies which Boolean operation QuickDraw should perform when - // drawing or transferring an image from one location to another. - // See "Graphics Modes" for a list of graphics modes supported by - // QuickTime: - // http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap4/chapter_5_section_5.html#//apple_ref/doc/uid/TP40000939-CH206-18741 - - d.writeUShort(0); // opcolor[0] - d.writeUShort(0); // opcolor[1] - d.writeUShort(0); // opcolor[2] - // Three 16-bit values that specify the red, green, and blue colors for - // the transfer mode operation indicated in the graphics mode field. - - /* Handle reference atom -------- */ - // The handler reference atom specifies the media handler component that - // is to be used to interpret the media's data. The handler reference - // atom has an atom type value of 'hdlr'. - leaf = new DataAtom("hdlr"); - minfAtom.add(leaf); - /* - * typedef struct { byte version; byte[3] flags; magic componentType; magic componentSubtype; magic componentManufacturer; int componentFlags; int - * componentFlagsMask; cstring componentName; } handlerReferenceAtom; - */ - d = leaf.getOutputStream(); - d.write(0); // version - // A 1-byte specification of the version of this handler information. - - d.write(0); // flag[0] - d.write(0); // flag[1] - d.write(0); // flag[2] - // A 3-byte space for handler information flags. Set this field to 0. - - d.writeType("dhlr"); // componentType - // A four-character code that identifies the type of the handler. Only - // two values are valid for this field: 'mhlr' for media handlers and - // 'dhlr' for data handlers. - - d.writeType("alis"); // componentSubtype - // A four-character code that identifies the type of the media handler - // or data handler. For media handlers, this field defines the type of - // data-for example, 'vide' for video data or 'soun' for sound data. - // For data handlers, this field defines the data reference type-for - // example, a component subtype value of 'alis' identifies a file alias. - - d.writeInt(0); // componentManufacturer - // Reserved. Set to 0. - - d.writeInt(0); // componentFlags - // Reserved. Set to 0. - - d.writeInt(0); // componentFlagsMask - // Reserved. Set to 0. - - d.write(0); // componentName (empty string) - // A (counted) string that specifies the name of the component-that is, - // the media handler used when this media was created. This field may - // contain a zero-length (empty) string. - - /* Data information atom ===== */ - CompositeAtom dinfAtom = new CompositeAtom("dinf"); - minfAtom.add(dinfAtom); - - /* Data reference atom ----- */ - // Data reference atoms contain tabular data that instructs the data - // handler component how to access the media's data. - leaf = new DataAtom("dref"); - dinfAtom.add(leaf); - /* - * typedef struct { ubyte version; ubyte[3] flags; int numberOfEntries; dataReferenceEntry dataReference[numberOfEntries]; } dataReferenceAtom; - * - * set { dataRefSelfReference=1 // I am not shure if this is the correct value for this flag } drefEntryFlags; - * - * typedef struct { int size; magic type; byte version; ubyte flag1; ubyte flag2; ubyte set drefEntryFlags flag3; byte[size - 12] data; } - * dataReferenceEntry; - */ - d = leaf.getOutputStream(); - d.write(0); // version - // A 1-byte specification of the version of this data reference atom. - - d.write(0); // flag[0] - d.write(0); // flag[1] - d.write(0); // flag[2] - // A 3-byte space for data reference flags. Set this field to 0. - - d.writeInt(1); // numberOfEntries - // A 32-bit integer containing the count of data references that follow. - - d.writeInt(12); // dataReference.size - // A 32-bit integer that specifies the number of bytes in the data - // reference. - - d.writeType("alis"); // dataReference.type - // A 32-bit integer that specifies the type of the data in the data - // reference. Table 2-4 lists valid type values: - // http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap2/chapter_3_section_4.html#//apple_ref/doc/uid/TP40000939-CH204-38840 - - d.write(0); // dataReference.version - // A 1-byte specification of the version of the data reference. - - d.write(0); // dataReference.flag1 - d.write(0); // dataReference.flag2 - d.write(0x1); // dataReference.flag3 - // A 3-byte space for data reference flags. There is one defined flag. - // - // Self reference - // This flag indicates that the media's data is in the same file as - // the movie atom. On the Macintosh, and other file systems with - // multifork files, set this flag to 1 even if the data resides in - // a different fork from the movie atom. This flag's value is - // 0x0001. - - /* Sample Table atom ========= */ - CompositeAtom stblAtom = new CompositeAtom("stbl"); - minfAtom.add(stblAtom); - - /* Sample Description atom ------- */ - // The sample description atom stores information that allows you to - // decode samples in the media. The data stored in the sample - // description varies, depending on the media type. For example, in the - // case of video media, the sample descriptions are image description - // structures. The sample description information for each media type is - // explained in "Media Data Atom Types": - // http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap3/chapter_4_section_1.html#//apple_ref/doc/uid/TP40000939-CH205-SW1 - leaf = new DataAtom("stsd"); - stblAtom.add(leaf); - /* - * typedef struct { byte version; byte[3] flags; int numberOfEntries; sampleDescriptionEntry sampleDescriptionTable[numberOfEntries]; } - * sampleDescriptionAtom; - * - * typedef struct { int size; magic type; byte[6] reserved; // six bytes that must be zero short dataReferenceIndex; // A 16-bit integer that - * contains the index of the data reference to use to retrieve data associated with samples that use this sample description. Data references are - * stored in data reference atoms. byte[size - 16] data; } sampleDescriptionEntry; - */ - d = leaf.getOutputStream(); - d.write(0); // version - // A 1-byte specification of the version of this sample description - // atom. - - d.write(0); // flag[0] - d.write(0); // flag[1] - d.write(0); // flag[2] - // A 3-byte space for sample description flags. Set this field to 0. - - d.writeInt(1); // number of Entries - // A 32-bit integer containing the number of sample descriptions that - // follow. - - // A 32-bit integer indicating the number of bytes in the sample - // description. - switch (videoFormat) { - case RAW: { - d.writeInt(86); // sampleDescriptionTable[0].size - d.writeType("raw "); // sampleDescriptionTable[0].type - - // A 32-bit integer indicating the format of the stored data. - // This depends on the media type, but is usually either the - // compression format or the media type. - - d.write(new byte[6]); // sampleDescriptionTable[0].reserved - // Six bytes that must be set to 0. - - d.writeShort(1); // sampleDescriptionTable[0].dataReferenceIndex - // A 16-bit integer that contains the index of the data - // reference to use to retrieve data associated with samples - // that use this sample description. Data references are stored - // in data reference atoms. - - // Video Sample Description - // ------------------------ - // The format of the following fields is described here: - // http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap3/chapter_4_section_2.html#//apple_ref/doc/uid/TP40000939-CH205-BBCGICBJ - - d.writeShort(0); // sampleDescriptionTable.videoSampleDescription.version - // A 16-bit integer indicating the version number of the - // compressed data. This is set to 0, unless a compressor has - // changed its data format. - - d.writeShort(0); // sampleDescriptionTable.videoSampleDescription.revisionLevel - // A 16-bit integer that must be set to 0. - - d.writeType("java"); // sampleDescriptionTable.videoSampleDescription.manufacturer - // A 32-bit integer that specifies the developer of the - // compressor that generated the compressed data. Often this - // field contains 'appl' to indicate Apple Computer, Inc. - - d.writeInt(0); // sampleDescriptionTable.videoSampleDescription.temporalQuality - // A 32-bit integer containing a value from 0 to 1023 indicating - // the degree of temporal compression. - - d.writeInt(512); // sampleDescriptionTable.videoSampleDescription.spatialQuality - // A 32-bit integer containing a value from 0 to 1024 indicating - // the degree of spatial compression. - - d.writeUShort(imgWidth); // sampleDescriptionTable.videoSampleDescription.width - // A 16-bit integer that specifies the width of the source image - // in pixels. - - d.writeUShort(imgHeight); // sampleDescriptionTable.videoSampleDescription.height - // A 16-bit integer that specifies the height of the source image in - // pixels. - - d.writeFixed16D16(72.0); // sampleDescriptionTable.videoSampleDescription.horizontalResolution - // A 32-bit fixed-point number containing the horizontal - // resolution of the image in pixels per inch. - - d.writeFixed16D16(72.0); // sampleDescriptionTable.videoSampleDescription.verticalResolution - // A 32-bit fixed-point number containing the vertical - // resolution of the image in pixels per inch. - - d.writeInt(0); // sampleDescriptionTable.videoSampleDescription.dataSize - // A 32-bit integer that must be set to 0. - - d.writeShort(1); // sampleDescriptionTable.videoSampleDescription.frameCount - // A 16-bit integer that indicates how many frames of compressed - // data are stored in each sample. Usually set to 1. - - d.writePString("None", 32); // sampleDescriptionTable.videoSampleDescription.compressorName - // A 32-byte Pascal string containing the name of the compressor - // that created the image, such as "jpeg". - - d.writeShort(24); // sampleDescriptionTable.videoSampleDescription.depth - // A 16-bit integer that indicates the pixel depth of the - // compressed image. Values of 1, 2, 4, 8 ,16, 24, and 32 - // indicate the depth of color images. The value 32 should be - // used only if the image contains an alpha channel. Values of - // 34, 36, and 40 indicate 2-, 4-, and 8-bit grayscale, - // respectively, for grayscale images. - - d.writeShort(-1); // sampleDescriptionTable.videoSampleDescription.colorTableID - // A 16-bit integer that identifies which color table to use. - // If this field is set to -1, the default color table should be - // used for the specified depth. For all depths below 16 bits - // per pixel, this indicates a standard Macintosh color table - // for the specified depth. Depths of 16, 24, and 32 have no - // color table. - - break; - } - case JPG: { - d.writeInt(86); // sampleDescriptionTable[0].size - d.writeType("jpeg"); // sampleDescriptionTable[0].type - - // A 32-bit integer indicating the format of the stored data. - // This depends on the media type, but is usually either the - // compression format or the media type. - - d.write(new byte[6]); // sampleDescriptionTable[0].reserved - // Six bytes that must be set to 0. - - d.writeShort(1); // sampleDescriptionTable[0].dataReferenceIndex - // A 16-bit integer that contains the index of the data - // reference to use to retrieve data associated with samples - // that use this sample description. Data references are stored - // in data reference atoms. - - // Video Sample Description - // ------------------------ - // The format of the following fields is described here: - // http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap3/chapter_4_section_2.html#//apple_ref/doc/uid/TP40000939-CH205-BBCGICBJ - - d.writeShort(0); // sampleDescriptionTable.videoSampleDescription.version - // A 16-bit integer indicating the version number of the - // compressed data. This is set to 0, unless a compressor has - // changed its data format. - - d.writeShort(0); // sampleDescriptionTable.videoSampleDescription.revisionLevel - // A 16-bit integer that must be set to 0. - - d.writeType("java"); // sampleDescriptionTable.videoSampleDescription.manufacturer - // A 32-bit integer that specifies the developer of the - // compressor that generated the compressed data. Often this - // field contains 'appl' to indicate Apple Computer, Inc. - - d.writeInt(0); // sampleDescriptionTable.videoSampleDescription.temporalQuality - // A 32-bit integer containing a value from 0 to 1023 indicating - // the degree of temporal compression. - - d.writeInt(512); // sampleDescriptionTable.videoSampleDescription.spatialQuality - // A 32-bit integer containing a value from 0 to 1024 indicating - // the degree of spatial compression. - - d.writeUShort(imgWidth); // sampleDescriptionTable.videoSampleDescription.width - // A 16-bit integer that specifies the width of the source image - // in pixels. - - d.writeUShort(imgHeight); // sampleDescriptionTable.videoSampleDescription.height - // A 16-bit integer that specifies the height of the source image in - // pixels. - - d.writeFixed16D16(72.0); // sampleDescriptionTable.videoSampleDescription.horizontalResolution - // A 32-bit fixed-point number containing the horizontal - // resolution of the image in pixels per inch. - - d.writeFixed16D16(72.0); // sampleDescriptionTable.videoSampleDescription.verticalResolution - // A 32-bit fixed-point number containing the vertical - // resolution of the image in pixels per inch. - - d.writeInt(0); // sampleDescriptionTable.videoSampleDescription.dataSize - // A 32-bit integer that must be set to 0. - - d.writeShort(1); // sampleDescriptionTable.videoSampleDescription.frameCount - // A 16-bit integer that indicates how many frames of compressed - // data are stored in each sample. Usually set to 1. - - d.writePString("Photo - JPEG", 32); // sampleDescriptionTable.videoSampleDescription.compressorName - // A 32-byte Pascal string containing the name of the compressor - // that created the image, such as "jpeg". - - d.writeShort(24); // sampleDescriptionTable.videoSampleDescription.depth - // A 16-bit integer that indicates the pixel depth of the - // compressed image. Values of 1, 2, 4, 8 ,16, 24, and 32 - // indicate the depth of color images. The value 32 should be - // used only if the image contains an alpha channel. Values of - // 34, 36, and 40 indicate 2-, 4-, and 8-bit grayscale, - // respectively, for grayscale images. - - d.writeShort(-1); // sampleDescriptionTable.videoSampleDescription.colorTableID - // A 16-bit integer that identifies which color table to use. - // If this field is set to -1, the default color table should be - // used for the specified depth. For all depths below 16 bits - // per pixel, this indicates a standard Macintosh color table - // for the specified depth. Depths of 16, 24, and 32 have no - // color table. - - break; - } - case PNG: { - d.writeInt(86); // sampleDescriptionTable[0].size - d.writeType("png "); // sampleDescriptionTable[0].type - // A 32-bit integer indicating the format of the stored data. - // This depends on the media type, but is usually either the - // compression format or the media type. - - d.write(new byte[6]); // sampleDescriptionTable[0].reserved - // Six bytes that must be set to 0. - - d.writeShort(1); // sampleDescriptionTable[0].dataReferenceIndex - // A 16-bit integer that contains the index of the data - // reference to use to retrieve data associated with samples - // that use this sample description. Data references are stored - // in data reference atoms. - - // Video Sample Description - // ------------------------ - // The format of the following fields is described here: - // http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap3/chapter_4_section_2.html#//apple_ref/doc/uid/TP40000939-CH205-BBCGICBJ - - d.writeShort(0); // sampleDescriptionTable.videoSampleDescription.version - // A 16-bit integer indicating the version number of the - // compressed data. This is set to 0, unless a compressor has - // changed its data format. - - d.writeShort(0); // sampleDescriptionTable.videoSampleDescription.revisionLevel - // A 16-bit integer that must be set to 0. - - d.writeType("java"); // sampleDescriptionTable.videoSampleDescription.manufacturer - // A 32-bit integer that specifies the developer of the - // compressor that generated the compressed data. Often this - // field contains 'appl' to indicate Apple Computer, Inc. - - d.writeInt(0); // sampleDescriptionTable.videoSampleDescription.temporalQuality - // A 32-bit integer containing a value from 0 to 1023 indicating - // the degree of temporal compression. - - d.writeInt(512); // sampleDescriptionTable.videoSampleDescription.spatialQuality - // A 32-bit integer containing a value from 0 to 1024 indicating - // the degree of spatial compression. - - d.writeUShort(imgWidth); // sampleDescriptionTable.videoSampleDescription.width - // A 16-bit integer that specifies the width of the source image - // in pixels. - - d.writeUShort(imgHeight); // sampleDescriptionTable.videoSampleDescription.height - // A 16-bit integer that specifies the height of the source image in - // pixels. - - d.writeFixed16D16(72.0); // sampleDescriptionTable.videoSampleDescription.horizontalResolution - // A 32-bit fixed-point number containing the horizontal - // resolution of the image in pixels per inch. - - d.writeFixed16D16(72.0); // sampleDescriptionTable.videoSampleDescription.verticalResolution - // A 32-bit fixed-point number containing the vertical - // resolution of the image in pixels per inch. - - d.writeInt(0); // sampleDescriptionTable.videoSampleDescription.dataSize - // A 32-bit integer that must be set to 0. - - d.writeShort(1); // sampleDescriptionTable.videoSampleDescription.frameCount - // A 16-bit integer that indicates how many frames of compressed - // data are stored in each sample. Usually set to 1. - - d.writePString("PNG", 32); // sampleDescriptionTable.videoSampleDescription.compressorName - // A 32-byte Pascal string containing the name of the compressor - // that created the image, such as "jpeg". - - d.writeShort(24); // sampleDescriptionTable.videoSampleDescription.depth - // A 16-bit integer that indicates the pixel depth of the - // compressed image. Values of 1, 2, 4, 8 ,16, 24, and 32 - // indicate the depth of color images. The value 32 should be - // used only if the image contains an alpha channel. Values of - // 34, 36, and 40 indicate 2-, 4-, and 8-bit grayscale, - // respectively, for grayscale images. - - d.writeShort(-1); // sampleDescriptionTable.videoSampleDescription.colorTableID - // A 16-bit integer that identifies which color table to use. - // If this field is set to -1, the default color table should be - // used for the specified depth. For all depths below 16 bits - // per pixel, this indicates a standard Macintosh color table - // for the specified depth. Depths of 16, 24, and 32 have no - // color table. - - break; - } - } - - /* Time to Sample atom ---- */ - // Time-to-sample atoms store duration information for a media's - // samples, providing a mapping from a time in a media to the - // corresponding data sample. The time-to-sample atom has an atom type - // of 'stts'. - leaf = new DataAtom("stts"); - stblAtom.add(leaf); - /* - * typedef struct { byte version; byte[3] flags; int numberOfEntries; timeToSampleTable timeToSampleTable[numberOfEntries]; } timeToSampleAtom; - * - * typedef struct { int sampleCount; int sampleDuration; } timeToSampleTable; - */ - d = leaf.getOutputStream(); - d.write(0); // version - // A 1-byte specification of the version of this time-to-sample atom. - - d.write(0); // flag[0] - d.write(0); // flag[1] - d.write(0); // flag[2] - // A 3-byte space for time-to-sample flags. Set this field to 0. - - // count runs of video frame durations - int runCount = 1; - int prevDuration = videoFrames.size() == 0 ? 0 : videoFrames.get(0).duration; - for (Sample s : videoFrames) { - if (s.duration != prevDuration) { - runCount++; - prevDuration = s.duration; - } - } - d.writeInt(runCount); // numberOfEntries - // A 32-bit integer containing the count of entries in the - // time-to-sample table. - - int runLength = 0; - prevDuration = videoFrames.size() == 0 ? 0 : videoFrames.get(0).duration; - for (Sample s : videoFrames) { - if (s.duration != prevDuration) { - if (runLength > 0) { - d.writeInt(runLength); // timeToSampleTable[0].sampleCount - // A 32-bit integer that specifies the number of consecutive - // samples that have the same duration. - - d.writeInt(prevDuration); // timeToSampleTable[0].sampleDuration - // A 32-bit integer that specifies the duration of each - // sample. - } - prevDuration = s.duration; - runLength = 1; - } else { - runLength++; - } - } - if (runLength > 0) { - d.writeInt(runLength); // timeToSampleTable[0].sampleCount - // A 32-bit integer that specifies the number of consecutive - // samples that have the same duration. - - d.writeInt(prevDuration); // timeToSampleTable[0].sampleDuration - // A 32-bit integer that specifies the duration of each - // sample. - } - /* sample to chunk atom -------- */ - // The sample-to-chunk atom contains a table that maps samples to chunks - // in the media data stream. By examining the sample-to-chunk atom, you - // can determine the chunk that contains a specific sample. - leaf = new DataAtom("stsc"); - stblAtom.add(leaf); - /* - * typedef struct { byte version; byte[3] flags; int numberOfEntries; sampleToChunkTable sampleToChunkTable[numberOfEntries]; } sampleToChunkAtom; - * - * typedef struct { int firstChunk; int samplesPerChunk; int sampleDescription; } sampleToChunkTable; - */ - d = leaf.getOutputStream(); - d.write(0); // version - // A 1-byte specification of the version of this time-to-sample atom. - - d.write(0); // flag[0] - d.write(0); // flag[1] - d.write(0); // flag[2] - // A 3-byte space for time-to-sample flags. Set this field to 0. - - d.writeInt(1); // number of entries - // A 32-bit integer containing the count of entries in the - // sample-to-chunk table. - - d.writeInt(1); // first chunk - // The first chunk number using this table entry. - - d.writeInt(1); // samples per chunk - // The number of samples in each chunk. - - d.writeInt(1); // sample description - // The identification number associated with the sample description for - // the sample. For details on sample description atoms, see "Sample - // Description Atoms.": - // http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap2/chapter_3_section_5.html#//apple_ref/doc/uid/TP40000939-CH204-25691 - - /* sample size atom -------- */ - // The sample size atom contains the sample count and a table giving the - // size of each sample. This allows the media data itself to be - // unframed. The total number of samples in the media is always - // indicated in the sample count. If the default size is indicated, then - // no table follows. - leaf = new DataAtom("stsz"); - stblAtom.add(leaf); - /* - * typedef struct { byte version; byte[3] flags; int sampleSize; int numberOfEntries; sampleSizeTable sampleSizeTable[numberOfEntries]; } - * sampleSizeAtom; - * - * typedef struct { int size; } sampleSizeTable; - */ - d = leaf.getOutputStream(); - d.write(0); // version - // A 1-byte specification of the version of this time-to-sample atom. - - d.write(0); // flag[0] - d.write(0); // flag[1] - d.write(0); // flag[2] - // A 3-byte space for time-to-sample flags. Set this field to 0. - - d.writeUInt(0); // sample size - // A 32-bit integer specifying the sample size. If all the samples are - // the same size, this field contains that size value. If this field is - // set to 0, then the samples have different sizes, and those sizes are - // stored in the sample size table. - - d.writeUInt(videoFrames.size()); // number of entries - // A 32-bit integer containing the count of entries in the sample size - // table. - - for (Sample s : videoFrames) { - d.writeUInt(s.length); // sample size - // The size field contains the size, in bytes, of the sample in - // question. The table is indexed by sample number-the first entry - // corresponds to the first sample, the second entry is for the - // second sample, and so on. - } - // - /* chunk offset atom -------- */ - // The chunk-offset table gives the index of each chunk into the - // containing file. There are two variants, permitting the use of - // 32-bit or 64-bit offsets. The latter is useful when managing very - // large movies. Only one of these variants occurs in any single - // instance of a sample table atom. - if (videoFrames.size() == 0 || videoFrames.getLast().offset <= 0xffffffffL) { - /* 32-bit chunk offset atom -------- */ - leaf = new DataAtom("stco"); - stblAtom.add(leaf); - /* - * typedef struct { byte version; byte[3] flags; int numberOfEntries; chunkOffsetTable chunkOffsetTable[numberOfEntries]; } chunkOffsetAtom; - * - * typedef struct { int offset; } chunkOffsetTable; - */ - d = leaf.getOutputStream(); - d.write(0); // version - // A 1-byte specification of the version of this time-to-sample - // atom. - - d.write(0); // flag[0] - d.write(0); // flag[1] - d.write(0); // flag[2] - // A 3-byte space for time-to-sample flags. Set this field to 0. - - d.writeUInt(videoFrames.size()); // number of entries - // A 32-bit integer containing the count of entries in the chunk - // offset table. - - for (Sample s : videoFrames) { - d.writeUInt(s.offset); // offset - // The offset contains the byte offset from the beginning of the - // data stream to the chunk. The table is indexed by chunk - // number-the first table entry corresponds to the first chunk, - // the second table entry is for the second chunk, and so on. - } - } else { - /* 64-bit chunk offset atom -------- */ - leaf = new DataAtom("co64"); - stblAtom.add(leaf); - /* - * typedef struct { byte version; byte[3] flags; int numberOfEntries; chunkOffsetTable chunkOffset64Table[numberOfEntries]; } chunkOffset64Atom; - * - * typedef struct { long offset; } chunkOffset64Table; - */ - d = leaf.getOutputStream(); - d.write(0); // version - // A 1-byte specification of the version of this time-to-sample - // atom. - - d.write(0); // flag[0] - d.write(0); // flag[1] - d.write(0); // flag[2] - // A 3-byte space for time-to-sample flags. Set this field to 0. - - d.writeUInt(videoFrames.size()); // number of entries - // A 32-bit integer containing the count of entries in the chunk - // offset table. - - for (Sample s : videoFrames) { - d.writeLong(s.offset); // offset - // The offset contains the byte offset from the beginning of the - // data stream to the chunk. The table is indexed by chunk - // number-the first table entry corresponds to the first chunk, - // the second table entry is for the second chunk, and so on. - } - } - // - moovAtom.finish(); - } - - /** - * Writes a frame to the video track. - *

- * If the dimension of the video track has not been specified yet, it is derived from the first buffered image added to the QuickTimeOutputStream. - * - * @param image - * The frame image. - * @param duration - * The duration of the frame in time scale units. - * - * @throws IllegalArgumentException - * if the duration is less than 1, or if the dimension of the frame does not match the dimension of the video track. - * @throws IOException - * if writing the image failed. - */ - public void writeFrame(BufferedImage image, int duration) throws IOException { - if (duration <= 0) { - throw new IllegalArgumentException("duration must be greater 0"); - } - ensureOpen(); - ensureStarted(); - - // Get the dimensions of the first image - if (imgWidth == -1) { - imgWidth = image.getWidth(); - imgHeight = image.getHeight(); - } else { - // The dimension of the image must match the dimension of the video - // track - if (imgWidth != image.getWidth() || imgHeight != image.getHeight()) { - throw new IllegalArgumentException("Dimensions of image[" + videoFrames.size() + "] (width=" + image.getWidth() - + ", height=" + image.getHeight() + ") differs from image[0] (width=" + imgWidth + ", height=" + imgHeight); - } - } - - long offset = out.getStreamPosition(); - - switch (videoFormat) { - case RAW: { - WritableRaster raster = image.getRaster(); - int[] raw = new int[imgWidth * 3]; // holds a scanline of raw image - // data with 3 channels of 32 - // bit data - byte[] bytes = new byte[imgWidth * 3]; // holds a scanline of raw - // image data with 3 - // channels of 8 bit data - for (int y = 0; y < imgHeight; y++) { - raster.getPixels(0, y, imgWidth, 1, raw); - for (int k = 0, n = imgWidth * 3; k < n; k++) { - bytes[k] = (byte) raw[k]; - } - mdatAtom.getOutputStream().write(bytes); - } - break; - } - case JPG: { - ImageWriter iw = ImageIO.getImageWritersByMIMEType("image/jpeg").next(); - ImageWriteParam iwParam = iw.getDefaultWriteParam(); - iwParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); - iwParam.setCompressionQuality(quality); - MemoryCacheImageOutputStream imgOut = new MemoryCacheImageOutputStream(mdatAtom.getOutputStream()); - iw.setOutput(imgOut); - IIOImage img = new IIOImage(image, null, null); - iw.write(null, img, iwParam); - iw.dispose(); - break; - } - case PNG: - default: { - ImageWriter iw = ImageIO.getImageWritersByMIMEType("image/png").next(); - ImageWriteParam iwParam = iw.getDefaultWriteParam(); - MemoryCacheImageOutputStream imgOut = new MemoryCacheImageOutputStream(mdatAtom.getOutputStream()); - iw.setOutput(imgOut); - IIOImage img = new IIOImage(image, null, null); - iw.write(null, img, iwParam); - iw.dispose(); - break; - } - } - long length = out.getStreamPosition() - offset; - videoFrames.add(new Sample(duration, offset, length)); - } - - /** - * Writes a frame from a file to the video track. - *

- * This method does not inspect the contents of the file. The contents has to match the video format. For example, it is your responsibility to only - * add JPG files if you have chosen the JPEG video format. - *

- * If you add all frames from files or from input streams, then you have to explicitly set the dimension of the video track before you call finish() - * or close(). - * - * @param file - * The file which holds the image data. - * @param duration - * The duration of the frame in time scale units. - * - * @throws IllegalStateException - * if the duration is less than 1. - * @throws IOException - * if writing the image failed. - */ - public void writeFrame(File file, int duration) throws IOException { - - try (FileInputStream in = new FileInputStream(file);) { - writeFrame(in, duration); - } - } - - /** - * Writes a frame to the video track. - *

- * This method does not inspect the contents of the input stream. The contents has to match the video format. For example, it is your responsibility - * to only add JPG files if you have chosen the JPEG video format. - *

- * If you add all frames from files or from input streams, then you have to explicitly set the dimension of the video track before you call finish() - * or close(). - * - * @param in - * The input stream which holds the image data. - * @param duration - * The duration of the frame in time scale units. - * - * @throws IllegalArgumentException - * if the duration is less than 1. - * @throws IOException - * if writing the image failed. - */ - public void writeFrame(InputStream in, int duration) throws IOException { - if (duration <= 0) { - throw new IllegalArgumentException("duration must be greater 0"); - } - ensureOpen(); - ensureStarted(); - - long offset = out.getStreamPosition(); - try (OutputStream mdatOut = mdatAtom.getOutputStream();) { - byte[] buf = new byte[512]; - int len; - while ((len = in.read(buf)) != -1) { - mdatOut.write(buf, 0, len); - } - long length = out.getStreamPosition() - offset; - videoFrames.add(new Sample(duration, offset, length)); - } - } - - private void writeProlog() throws IOException { - /* - * File type atom - * - * typedef struct { magic brand; bcd4 versionYear; bcd2 versionMonth; bcd2 versionMinor; magic[4] compatibleBrands; } ftypAtom; - */ - DataAtom ftypAtom = new DataAtom("ftyp"); - DataAtomOutputStream d = ftypAtom.getOutputStream(); - d.writeType("qt "); // brand - d.writeBCD4(2005); // versionYear - d.writeBCD2(3); // versionMonth - d.writeBCD2(0); // versionMinor - d.writeType("qt "); // compatibleBrands - d.writeInt(0); // compatibleBrands (0 is used to denote no value) - d.writeInt(0); // compatibleBrands (0 is used to denote no value) - d.writeInt(0); // compatibleBrands (0 is used to denote no value) - ftypAtom.finish(); - } -} diff --git a/src/com/github/xsavikx/android/screencast/app/AndroidScreencastApplication.java b/src/com/github/xsavikx/android/screencast/app/AndroidScreencastApplication.java deleted file mode 100644 index 426499a..0000000 --- a/src/com/github/xsavikx/android/screencast/app/AndroidScreencastApplication.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.github.xsavikx.android.screencast.app; - -import javax.swing.SwingUtilities; - -import org.apache.log4j.Logger; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.env.Environment; -import org.springframework.stereotype.Component; - -import com.android.ddmlib.AndroidDebugBridge; -import com.android.ddmlib.IDevice; -import com.github.xsavikx.android.screencast.api.injector.Injector; -import com.github.xsavikx.android.screencast.constant.Constants; -import com.github.xsavikx.android.screencast.ui.JFrameMain; - -@Component -public class AndroidScreencastApplication extends SwingApplication { - - @Autowired - private Environment env; - - private static final Logger LOGGER = Logger.getLogger(AndroidScreencastApplication.class); - @Autowired - private JFrameMain jf; - @Autowired - private Injector injector; - @Autowired - private IDevice device; - - @Override - public void close() { - LOGGER.debug("close() - start"); - - if (injector != null) - injector.close(); - - if (device != null) { - synchronized (device) { - if (hasFilledAdbPath()) - AndroidDebugBridge.disconnectBridge(); - AndroidDebugBridge.terminate(); - } - } - - LOGGER.debug("close() - end"); - } - - @Override - public void start() { - LOGGER.debug("start() - start"); - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - // Start showing the device screen - jf.setTitle("" + device); - - // Show window - jf.setVisible(true); - - jf.launchInjector(); - } - }); - LOGGER.debug("start() - end"); - } - - @SuppressWarnings("boxing") - @Override - protected boolean isNativeLook() { - LOGGER.debug("isNativeLook() - start"); - - boolean returnboolean = env.getProperty(Constants.APP_NATIVE_LOOK_PROPERTY, Boolean.class, - Constants.DEFAULT_APP_NATIVE_LOOK); - LOGGER.debug("isNativeLook() - end"); - return returnboolean; - } - - private boolean hasFilledAdbPath() { - LOGGER.debug("hasFilledAdbPath() - start"); - - boolean returnboolean = env.getProperty(Constants.ADB_PATH_PROPERTY) != null; - LOGGER.debug("hasFilledAdbPath() - end"); - return returnboolean; - } -} diff --git a/src/com/github/xsavikx/android/screencast/app/Application.java b/src/com/github/xsavikx/android/screencast/app/Application.java deleted file mode 100644 index 8feedd6..0000000 --- a/src/com/github/xsavikx/android/screencast/app/Application.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.github.xsavikx.android.screencast.app; - -public interface Application { - - public void close(); - - public void handleException(Thread thread, Throwable ex); - - public void start(); - - public void init(); -} diff --git a/src/com/github/xsavikx/android/screencast/app/DeviceChooserApplication.java b/src/com/github/xsavikx/android/screencast/app/DeviceChooserApplication.java deleted file mode 100644 index 8d5e60d..0000000 --- a/src/com/github/xsavikx/android/screencast/app/DeviceChooserApplication.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.github.xsavikx.android.screencast.app; - -import org.apache.log4j.Logger; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.env.Environment; -import org.springframework.stereotype.Component; - -import com.android.ddmlib.AndroidDebugBridge; -import com.android.ddmlib.IDevice; -import com.github.xsavikx.android.screencast.constant.Constants; -import com.github.xsavikx.android.screencast.ui.JDialogDeviceList; - -@Component -public class DeviceChooserApplication extends SwingApplication { - private static final Logger LOGGER = Logger.getLogger(DeviceChooserApplication.class); - - @Autowired - private Environment env; - @Autowired - private AndroidDebugBridge bridge; - - private IDevice device; - - @Override - public void close() { - // ignore - } - - @Override - public void start() { - LOGGER.debug("start() - start"); - initialize(); - - LOGGER.debug("start() - end"); - } - - @SuppressWarnings("boxing") - @Override - protected boolean isNativeLook() { - LOGGER.debug("isNativeLook() - start"); - - boolean returnboolean = env.getProperty(Constants.APP_NATIVE_LOOK_PROPERTY, Boolean.class, - Constants.DEFAULT_APP_NATIVE_LOOK); - LOGGER.debug("isNativeLook() - end"); - return returnboolean; - } - - private void waitDeviceList(AndroidDebugBridge bridge) { - LOGGER.debug("waitDeviceList(AndroidDebugBridge bridge=" + bridge + ") - start"); - - int count = 0; - while (bridge.hasInitialDeviceList() == false) { - try { - Thread.sleep(100); - count++; - } catch (InterruptedException e) { - LOGGER.warn("waitDeviceList(AndroidDebugBridge) - exception ignored", e); - - } - // let's not wait > 10 sec. - if (count > 300) { - throw new RuntimeException("Timeout getting device list!"); - } - } - - LOGGER.debug("waitDeviceList(AndroidDebugBridge bridge=" + bridge + ") - end"); - } - - private void initialize() { - LOGGER.debug("initialize() - start"); - - waitDeviceList(bridge); - - IDevice devices[] = bridge.getDevices(); - // Let the user choose the device - if (devices.length == 1) { - device = devices[0]; - } else { - JDialogDeviceList jd = new JDialogDeviceList(devices); - jd.setVisible(true); - - device = jd.getDevice(); - } - if (device == null) { - System.exit(0); - - LOGGER.debug("initialize() - end"); - return; - } - - LOGGER.debug("initialize() - end"); - } - - public IDevice getDevice() { - return device; - } -} diff --git a/src/com/github/xsavikx/android/screencast/app/GUIApplication.java b/src/com/github/xsavikx/android/screencast/app/GUIApplication.java deleted file mode 100644 index 3473def..0000000 --- a/src/com/github/xsavikx/android/screencast/app/GUIApplication.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.github.xsavikx.android.screencast.app; - -import java.lang.Thread.UncaughtExceptionHandler; - -public abstract class GUIApplication implements Application { - - public GUIApplication() { - Runtime.getRuntime().addShutdownHook(new Thread() { - @Override - public void run() { - close(); - } - }); - Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { - @Override - public void uncaughtException(Thread arg0, Throwable ex) { - try { - handleException(arg0, ex); - } catch (Exception ex2) { - // ignored - ex2.printStackTrace(); - } - } - }); - } - -} diff --git a/src/com/github/xsavikx/android/screencast/app/SwingApplication.java b/src/com/github/xsavikx/android/screencast/app/SwingApplication.java deleted file mode 100644 index c354b3f..0000000 --- a/src/com/github/xsavikx/android/screencast/app/SwingApplication.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.github.xsavikx.android.screencast.app; - -import java.io.PrintWriter; -import java.io.StringWriter; - -import javax.swing.SwingUtilities; -import javax.swing.UIManager; - -import com.github.xsavikx.android.screencast.ui.JDialogError; - -public abstract class SwingApplication extends GUIApplication { - private JDialogError jd = null; - - protected abstract boolean isNativeLook(); - - @Override - public void init() { - try { - if (isNativeLook()) - UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); - } catch (Exception ex) { - throw new RuntimeException(ex); - } - } - - @Override - public void handleException(Thread thread, Throwable ex) { - try { - StringWriter sw = new StringWriter(); - ex.printStackTrace(new PrintWriter(sw)); - if (sw.toString().contains("SynthTreeUI")) - return; - ex.printStackTrace(System.err); - if (jd != null && jd.isVisible()) - return; - jd = new JDialogError(ex); - SwingUtilities.invokeLater(new Runnable() { - - @Override - public void run() { - jd.setVisible(true); - } - }); - } catch (Exception ex2) { - // ignored - } - } - -} diff --git a/src/com/github/xsavikx/android/screencast/constant/Constants.java b/src/com/github/xsavikx/android/screencast/constant/Constants.java deleted file mode 100644 index 7fa2373..0000000 --- a/src/com/github/xsavikx/android/screencast/constant/Constants.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.github.xsavikx.android.screencast.constant; - -import javax.annotation.Resource; - -@Resource -public final class Constants { - public static final String APP_NATIVE_LOOK_PROPERTY = "app.nativeLook"; - public static final String ADB_PATH_PROPERTY = "adb.path"; - public static final String DEFAULT_WINDOW_WIDTH = "default.window.width"; - public static final String DEFAULT_WINDOW_HEIGHT = "default.window.height"; - - public static final boolean DEFAULT_APP_NATIVE_LOOK = true; - public static final int DEFAULT_ADB_PORT = 2345; -} diff --git a/src/com/github/xsavikx/android/screencast/spring/config/ApplicationConfiguration.java b/src/com/github/xsavikx/android/screencast/spring/config/ApplicationConfiguration.java deleted file mode 100644 index 01d9007..0000000 --- a/src/com/github/xsavikx/android/screencast/spring/config/ApplicationConfiguration.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.github.xsavikx.android.screencast.spring.config; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.support.DefaultListableBeanFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.PropertySource; -import org.springframework.core.env.Environment; - -import com.android.ddmlib.AndroidDebugBridge; -import com.android.ddmlib.IDevice; -import com.github.xsavikx.android.screencast.app.DeviceChooserApplication; -import com.github.xsavikx.android.screencast.constant.Constants; - -@Configuration -@ComponentScan(basePackages = "com.github.xsavikx.android.screencast") -@PropertySource(value = "file:${user.dir}/app.properties", ignoreResourceNotFound = true) -public class ApplicationConfiguration { - @Autowired - private Environment env; - - @Bean - public AndroidDebugBridge initAndroidDebugBridge() { - AndroidDebugBridge.initIfNeeded(false); - if (env.containsProperty(Constants.ADB_PATH_PROPERTY)) { - return AndroidDebugBridge.createBridge(env.getProperty(Constants.ADB_PATH_PROPERTY), false); - } - return AndroidDebugBridge.createBridge(); - } - - @Bean - public DefaultListableBeanFactory initBeanFactory() { - DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); - return factory; - } - - @Bean - @Autowired - public IDevice initDevice(DeviceChooserApplication application) { - application.init(); - application.start(); - application.close(); - return application.getDevice(); - } - -} diff --git a/src/com/github/xsavikx/android/screencast/spring/config/ApplicationContextProvider.java b/src/com/github/xsavikx/android/screencast/spring/config/ApplicationContextProvider.java deleted file mode 100644 index 5ca5974..0000000 --- a/src/com/github/xsavikx/android/screencast/spring/config/ApplicationContextProvider.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.github.xsavikx.android.screencast.spring.config; - -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; - -public class ApplicationContextProvider implements ApplicationContextAware { - private static ApplicationContext applicationContext; - - private ApplicationContextProvider() { - // - } - - public static ApplicationContext getApplicationContext() { - if (applicationContext == null) - applicationContext = new AnnotationConfigApplicationContext(ApplicationConfiguration.class); - return applicationContext; - } - - @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - ApplicationContextProvider.applicationContext = applicationContext; - } - -} diff --git a/src/com/github/xsavikx/android/screencast/ui/JDialogDeviceList.java b/src/com/github/xsavikx/android/screencast/ui/JDialogDeviceList.java deleted file mode 100644 index ded501f..0000000 --- a/src/com/github/xsavikx/android/screencast/ui/JDialogDeviceList.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.github.xsavikx.android.screencast.ui; - -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.FlowLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; - -import javax.swing.BorderFactory; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JFormattedTextField; -import javax.swing.JList; -import javax.swing.JPanel; -import javax.swing.JTextField; - -import com.android.ddmlib.IDevice; - -public class JDialogDeviceList extends JDialog implements ActionListener { - - private static final long serialVersionUID = -3719844308147203239L; - private static final String DEFAULT_HOST = "127.0.0.1"; - private static final int DEFAULT_PORT = 1324; - - private JTextField jtfHost = new JTextField(DEFAULT_HOST); - private JFormattedTextField jftfPort = new JFormattedTextField(DEFAULT_PORT); - private JList jlDevices = new JList(); - private JPanel jpAgent = new JPanel(); - private JPanel jpButtons = new JPanel(); - private JButton jbOk = new JButton("OK"); - private JButton jbQuit = new JButton("Quit"); - - private boolean cancelled = false; - private IDevice[] devices; - - public JDialogDeviceList(IDevice[] devices) { - super(); - setModal(true); - this.devices = devices; - initialize(); - } - - @Override - public void actionPerformed(ActionEvent arg0) { - cancelled = arg0.getSource() == jbQuit; - - setVisible(false); - } - - public IDevice getDevice() { - if (cancelled) - return null; - return jlDevices.getSelectedValue(); - } - - private void initialize() { - setTitle("Please select a device"); - jlDevices.setListData(devices); - jlDevices.setPreferredSize(new Dimension(400, 300)); - if (devices.length != 0) - jlDevices.setSelectedIndex(0); - jbOk.setEnabled(!jlDevices.isSelectionEmpty()); - - jpAgent.setBorder(BorderFactory.createTitledBorder("Agent")); - jpAgent.setLayout(new BorderLayout(10, 10)); - jpAgent.add(jtfHost, BorderLayout.CENTER); - jpAgent.add(jftfPort, BorderLayout.EAST); - - jpButtons.setLayout(new FlowLayout(FlowLayout.RIGHT)); - jpButtons.add(jbOk, BorderLayout.CENTER); - jpButtons.add(jbQuit, BorderLayout.SOUTH); - - JPanel jpBottom = new JPanel(); - jpBottom.setLayout(new BorderLayout()); - jpBottom.add(jpAgent, BorderLayout.CENTER); - jpBottom.add(jpButtons, BorderLayout.SOUTH); - - setLayout(new BorderLayout()); - add(jlDevices, BorderLayout.CENTER); - add(jpBottom, BorderLayout.SOUTH); - - pack(); - setLocationRelativeTo(null); - - jbOk.addActionListener(this); - jbQuit.addActionListener(this); - jlDevices.addMouseListener(new MouseAdapter() { - - @Override - public void mouseClicked(MouseEvent e) { - if (e.getClickCount() == 2) { - int index = jlDevices.locationToIndex(e.getPoint()); - jlDevices.ensureIndexIsVisible(index); - cancelled = false; - setVisible(false); - } - } - - }); - } -} diff --git a/src/com/github/xsavikx/android/screencast/ui/JDialogError.java b/src/com/github/xsavikx/android/screencast/ui/JDialogError.java deleted file mode 100644 index cb84114..0000000 --- a/src/com/github/xsavikx/android/screencast/ui/JDialogError.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.github.xsavikx.android.screencast.ui; - -import java.awt.BorderLayout; -import java.io.PrintWriter; -import java.io.StringWriter; - -import javax.swing.JDialog; -import javax.swing.JTextArea; - -public class JDialogError extends JDialog { - - private static final long serialVersionUID = -2562084286663149628L; - - public JDialogError(Throwable ex) { - getRootPane().setLayout(new BorderLayout()); - JTextArea l = new JTextArea(); - StringWriter w = new StringWriter(); - if (ex.getClass() == RuntimeException.class && ex.getCause() != null) - ex = ex.getCause(); - ex.printStackTrace(new PrintWriter(w)); - l.setText(w.toString()); - getRootPane().add(l, BorderLayout.CENTER); - pack(); - setLocationRelativeTo(null); - setAlwaysOnTop(true); - } - -} diff --git a/src/com/github/xsavikx/android/screencast/ui/JDialogExecuteKeyEvent.java b/src/com/github/xsavikx/android/screencast/ui/JDialogExecuteKeyEvent.java deleted file mode 100644 index 7bfd7cf..0000000 --- a/src/com/github/xsavikx/android/screencast/ui/JDialogExecuteKeyEvent.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.github.xsavikx.android.screencast.ui; - -import java.awt.Dimension; -import java.awt.GridLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.BorderFactory; -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JOptionPane; -import javax.swing.JPanel; -import javax.swing.JScrollPane; -import javax.swing.JSplitPane; -import javax.swing.ScrollPaneConstants; -import javax.swing.SwingUtilities; -import javax.swing.WindowConstants; -import javax.swing.border.TitledBorder; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.github.xsavikx.android.screencast.api.command.executor.CommandExecutor; -import com.github.xsavikx.android.screencast.api.command.factory.AdbInputCommandFactory; -import com.github.xsavikx.android.screencast.api.injector.InputKeyEvent; -import com.github.xsavikx.android.screencast.ui.model.InputKeyEventTable; -import com.github.xsavikx.android.screencast.ui.model.InputKeyEventTableModel; - -@Component -public class JDialogExecuteKeyEvent extends JDialog { - private static final long serialVersionUID = -4152020879675916776L; - private static final int HEIGHT = 600; - private static final int WIDTH = 800; - private static final int BUTTON_HEIGHT = 20; - private static final int BUTTON_WIDTH = WIDTH >> 1 - 5; - - private static final int TITLE_COLUMN_INDEX = 1; - - private static final String EXECUTE_BUTTON_TEXT = "Execute"; - private static final String CANCEL_BUTTON_TEXT = "Cancel"; - private static final String COMMAND_LIST_TITLE_TEXT = "Commands to execute"; - private static final String NO_COMMAND_CHOSEN_WARNING_MESSAGE = "Please, select command from the list"; - private static final String NO_COMMAND_CHOSEN_WARNING_DIALOG_TITLE = "Warning"; - - @Autowired - private CommandExecutor commandExecutor; - - /** - * Launch the application. - */ - public static void main(String[] args) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - new JDialogExecuteKeyEvent().setVisible(true); - } - }); - } - - /** - * Create the dialog. - */ - public JDialogExecuteKeyEvent() { - setResizable(false); - setTitle("Execute key event"); - setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); - final InputKeyEventTableModel commandList = new InputKeyEventTableModel(InputKeyEvent.values()); - final InputKeyEventTable commandListTable = new InputKeyEventTable(commandList); - - JButton executeCommandButton = new JButton(EXECUTE_BUTTON_TEXT); - executeCommandButton.setSize(new Dimension(BUTTON_WIDTH, BUTTON_HEIGHT)); - executeCommandButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - int rowIndex = commandListTable.getSelectedRow(); - if (rowIndex > 0) { - final String title = (String) commandList.getValueAt(rowIndex, TITLE_COLUMN_INDEX); - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - commandExecutor.execute(AdbInputCommandFactory.getKeyCommand(InputKeyEvent.valueOf(title))); - } - }); - closeDialog(); - } else { - JOptionPane.showMessageDialog(null, NO_COMMAND_CHOSEN_WARNING_MESSAGE, NO_COMMAND_CHOSEN_WARNING_DIALOG_TITLE, - JOptionPane.WARNING_MESSAGE); - } - } - }); - JButton cancelButton = new JButton(CANCEL_BUTTON_TEXT); - cancelButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - closeDialog(); - } - }); - JScrollPane listScrollPane = new JScrollPane(commandListTable, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, - ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); - listScrollPane.setPreferredSize(new Dimension(WIDTH, HEIGHT)); - listScrollPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), - COMMAND_LIST_TITLE_TEXT, TitledBorder.CENTER, TitledBorder.TOP)); - JPanel buttonPane = new JPanel(); - buttonPane.add(executeCommandButton); - buttonPane.add(cancelButton); - buttonPane.setLayout(new GridLayout(1, 2)); - JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, listScrollPane, buttonPane); - splitPane.setEnabled(false); - getContentPane().add(splitPane); - pack(); - setLocationRelativeTo(null); - } - - private void closeDialog() { - setVisible(false); - } -} diff --git a/src/com/github/xsavikx/android/screencast/ui/JDialogUrl.java b/src/com/github/xsavikx/android/screencast/ui/JDialogUrl.java deleted file mode 100644 index a1b0198..0000000 --- a/src/com/github/xsavikx/android/screencast/ui/JDialogUrl.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.github.xsavikx.android.screencast.ui; - -import java.awt.BorderLayout; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.JButton; -import javax.swing.JDialog; -import javax.swing.JTextField; - -public class JDialogUrl extends JDialog { - - private static final long serialVersionUID = -331017582679776599L; - private JTextField jtfUrl = new JTextField(); - - public JTextField getJtfUrl() { - return jtfUrl; - } - - public void setJtfUrl(JTextField jtfUrl) { - this.jtfUrl = jtfUrl; - } - - private JButton jbOk = new JButton("Ok"); - private boolean result = false; - - public JDialogUrl() { - setModal(true); - setTitle("Open url"); - - setLayout(new BorderLayout()); - add(jbOk, BorderLayout.SOUTH); - add(jtfUrl, BorderLayout.CENTER); - jtfUrl.setColumns(50); - - jbOk.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent arg0) { - setResult(true); - JDialogUrl.this.setVisible(false); - } - }); - - jbOk.setDefaultCapable(true); - getRootPane().setDefaultButton(jbOk); - pack(); - setLocationRelativeTo(null); - - } - - public boolean isResult() { - return result; - } - - public void setResult(boolean result) { - this.result = result; - } -} diff --git a/src/com/github/xsavikx/android/screencast/ui/JFrameMain.java b/src/com/github/xsavikx/android/screencast/ui/JFrameMain.java deleted file mode 100644 index 2e10acd..0000000 --- a/src/com/github/xsavikx/android/screencast/ui/JFrameMain.java +++ /dev/null @@ -1,213 +0,0 @@ -package com.github.xsavikx.android.screencast.ui; - -import java.awt.BorderLayout; -import java.awt.Dimension; -import java.awt.KeyboardFocusManager; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.awt.event.MouseAdapter; -import java.awt.image.BufferedImage; - -import javax.swing.JButton; -import javax.swing.JFileChooser; -import javax.swing.JFrame; -import javax.swing.JScrollPane; -import javax.swing.JToolBar; -import javax.swing.filechooser.FileNameExtensionFilter; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.core.env.Environment; -import org.springframework.stereotype.Component; - -import com.github.xsavikx.android.screencast.api.AndroidDevice; -import com.github.xsavikx.android.screencast.api.injector.Injector; -import com.github.xsavikx.android.screencast.api.injector.InputKeyEvent; -import com.github.xsavikx.android.screencast.api.injector.ScreenCaptureThread.ScreenCaptureListener; -import com.github.xsavikx.android.screencast.constant.Constants; -import com.github.xsavikx.android.screencast.spring.config.ApplicationContextProvider; -import com.github.xsavikx.android.screencast.ui.explorer.JFrameExplorer; -import com.github.xsavikx.android.screencast.ui.interaction.KeyEventDispatcherFactory; -import com.github.xsavikx.android.screencast.ui.interaction.KeyboardActionListenerFactory; -import com.github.xsavikx.android.screencast.ui.interaction.MouseActionAdapterFactory; - -@Component -public class JFrameMain extends JFrame { - - private static final long serialVersionUID = -2085909236767692371L; - private JPanelScreen jp = new JPanelScreen(); - private JToolBar jtb = new JToolBar(); - private JToolBar jtbHardkeys = new JToolBar(); - // private JToggleButton jtbRecord = new JToggleButton("Record"); - - // private JButton jbOpenUrl = new JButton("Open Url"); - private JScrollPane jsp; - private JButton jbExplorer = new JButton("Explore"); - private JButton jbRestartClient = new JButton("Restart client"); - private JButton jbExecuteKeyEvent = new JButton("Execute keycode"); - - private JButton jbKbHome = new JButton("Home"); - private JButton jbKbMenu = new JButton("Menu"); - private JButton jbKbBack = new JButton("Back"); - private JButton jbKbSearch = new JButton("Search"); - - private JButton jbKbPhoneOn = new JButton("Call"); - - private JButton jbKbPhoneOff = new JButton("End call"); - private AndroidDevice androidDevice; - private Injector injector; - private Environment env; - private Dimension oldImageDimension; - - @Autowired - public JFrameMain(Environment env, Injector injector, AndroidDevice androidDevice) { - this.injector = injector; - this.env = env; - this.androidDevice = androidDevice; - initialize(); - KeyboardFocusManager.getCurrentKeyboardFocusManager() - .addKeyEventDispatcher(KeyEventDispatcherFactory.getKeyEventDispatcher(this)); - } - - private void setPrefferedWindowSize() { - if (env.containsProperty(Constants.DEFAULT_WINDOW_HEIGHT) && env.containsProperty(Constants.DEFAULT_WINDOW_WIDTH)) { - Integer height = env.getProperty(Constants.DEFAULT_WINDOW_HEIGHT, Integer.class); - Integer width = env.getProperty(Constants.DEFAULT_WINDOW_WIDTH, Integer.class); - if (height != null && width != null) - getContentPane().setPreferredSize(new Dimension(width.intValue(), height.intValue())); - } - pack(); - } - - public void initialize() { - - jtb.setFocusable(false); - jbExplorer.setFocusable(false); - // jtbRecord.setFocusable(false); - // jbOpenUrl.setFocusable(false); - jbKbHome.setFocusable(false); - jbKbMenu.setFocusable(false); - jbKbBack.setFocusable(false); - jbKbSearch.setFocusable(false); - jbKbPhoneOn.setFocusable(false); - jbKbPhoneOff.setFocusable(false); - jbRestartClient.setFocusable(false); - jbExecuteKeyEvent.setFocusable(false); - - jbKbHome.addActionListener(KeyboardActionListenerFactory.getInstance(InputKeyEvent.KEYCODE_HOME)); - jbKbMenu.addActionListener(KeyboardActionListenerFactory.getInstance(InputKeyEvent.KEYCODE_MENU)); - jbKbBack.addActionListener(KeyboardActionListenerFactory.getInstance(InputKeyEvent.KEYCODE_BACK)); - jbKbSearch.addActionListener(KeyboardActionListenerFactory.getInstance(InputKeyEvent.KEYCODE_SEARCH)); - jbKbPhoneOn.addActionListener(KeyboardActionListenerFactory.getInstance(InputKeyEvent.KEYCODE_CALL)); - jbKbPhoneOff.addActionListener(KeyboardActionListenerFactory.getInstance(InputKeyEvent.KEYCODE_ENDCALL)); - - jtbHardkeys.add(jbKbHome); - jtbHardkeys.add(jbKbMenu); - jtbHardkeys.add(jbKbBack); - jtbHardkeys.add(jbKbSearch); - jtbHardkeys.add(jbKbPhoneOn); - jtbHardkeys.add(jbKbPhoneOff); - - // setIconImage(Toolkit.getDefaultToolkit().getImage( - // getClass().getResource("icon.png"))); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - setLayout(new BorderLayout()); - add(jtb, BorderLayout.NORTH); - add(jtbHardkeys, BorderLayout.SOUTH); - jsp = new JScrollPane(jp); - add(jsp, BorderLayout.CENTER); - jsp.setPreferredSize(new Dimension(100, 100)); - pack(); - setLocationRelativeTo(null); - setPrefferedWindowSize(); - MouseAdapter ma = MouseActionAdapterFactory.getInstance(jp, injector); - - jp.addMouseMotionListener(ma); - jp.addMouseListener(ma); - jp.addMouseWheelListener(ma); - - // jtbRecord.addActionListener(new ActionListener() { - // - // @Override - // public void actionPerformed(ActionEvent arg0) { - // if (jtbRecord.isSelected()) { - // startRecording(); - // } else { - // stopRecording(); - // } - // } - // - // }); - // jtb.add(jtbRecord); - - jbExplorer.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent arg0) { - JFrameExplorer jf = ApplicationContextProvider.getApplicationContext().getBean(JFrameExplorer.class); - jf.setIconImage(getIconImage()); - jf.launch(); - jf.setVisible(true); - } - }); - jtb.add(jbExplorer); - - jtb.add(jbRestartClient); - - jbExecuteKeyEvent.addActionListener(new ActionListener() { - - @Override - public void actionPerformed(ActionEvent e) { - JDialogExecuteKeyEvent jdExecuteKeyEvent = ApplicationContextProvider.getApplicationContext() - .getBean(JDialogExecuteKeyEvent.class); - jdExecuteKeyEvent.setVisible(true); - } - }); - - jtb.add(jbExecuteKeyEvent); - - // jbOpenUrl.addActionListener(new ActionListener() { - // @Override - // public void actionPerformed(ActionEvent arg0) { - // JDialogUrl jdUrl = new JDialogUrl(); - // jdUrl.setVisible(true); - // if (!jdUrl.isResult()) - // return; - // String url = jdUrl.getJtfUrl().getText(); - // androidDevice.openUrl(url); - // } - // }); - // jtb.add(jbOpenUrl); - - } - - public void launchInjector() { - injector.screencapture.setListener(new ScreenCaptureListener() { - - @Override - public void handleNewImage(Dimension size, BufferedImage image, boolean landscape) { - if (oldImageDimension == null || !size.equals(oldImageDimension)) { - jsp.setPreferredSize(size); - JFrameMain.this.pack(); - oldImageDimension = size; - } - jp.handleNewImage(size, image); - } - }); - injector.start(); - } - - private void startRecording() { - JFileChooser jFileChooser = new JFileChooser(); - FileNameExtensionFilter filter = new FileNameExtensionFilter("Video file", "mov"); - jFileChooser.setFileFilter(filter); - int returnVal = jFileChooser.showSaveDialog(this); - if (returnVal == JFileChooser.APPROVE_OPTION) { - injector.screencapture.startRecording(jFileChooser.getSelectedFile()); - } - } - - private void stopRecording() { - injector.screencapture.stopRecording(); - } - -} diff --git a/src/com/github/xsavikx/android/screencast/ui/JPanelScreen.java b/src/com/github/xsavikx/android/screencast/ui/JPanelScreen.java deleted file mode 100644 index 81533a2..0000000 --- a/src/com/github/xsavikx/android/screencast/ui/JPanelScreen.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.github.xsavikx.android.screencast.ui; - -import java.awt.Dimension; -import java.awt.Graphics; -import java.awt.Graphics2D; -import java.awt.Point; -import java.awt.image.BufferedImage; - -import javax.swing.JPanel; - -public class JPanelScreen extends JPanel { - - private static final long serialVersionUID = -2034873107028503004L; - private float coef = 1; - private double origX; - private double origY; - private Dimension size = null; - private BufferedImage image = null; - - public JPanelScreen() { - this.setFocusable(true); - } - - public Point getRawPoint(Point p1) { - Point p2 = new Point(); - p2.x = (int) ((p1.x - origX) / coef); - p2.y = (int) ((p1.y - origY) / coef); - return p2; - } - - public void handleNewImage(Dimension size, BufferedImage image) { - this.size = size; - this.image = image; - repaint(); - } - - @Override - protected void paintComponent(Graphics g) { - if (size == null) - return; - if (size.height == 0) - return; - Graphics2D g2 = (Graphics2D) g; - g2.clearRect(0, 0, getWidth(), getHeight()); - double width = Math.min(getWidth(), size.width * getHeight() / size.height); - coef = (float) width / size.width; - double height = width * size.height / size.width; - origX = (getWidth() - width) / 2; - origY = (getHeight() - height) / 2; - g2.drawImage(image, (int) origX, (int) origY, (int) width, (int) height, this); - } - -} diff --git a/src/com/github/xsavikx/android/screencast/ui/JSplashScreen.java b/src/com/github/xsavikx/android/screencast/ui/JSplashScreen.java deleted file mode 100644 index ef4620d..0000000 --- a/src/com/github/xsavikx/android/screencast/ui/JSplashScreen.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.github.xsavikx.android.screencast.ui; - -import java.awt.BorderLayout; -import java.awt.Component; - -import javax.swing.BorderFactory; -import javax.swing.JLabel; -import javax.swing.JWindow; - -public class JSplashScreen extends JWindow { - - private static final long serialVersionUID = -4537199368044671301L; - private JLabel label; - - public JSplashScreen(String text) { - label = new JLabel("Loading...", (int) Component.CENTER_ALIGNMENT); - initialize(); - setText(text); - } - - private void initialize() { - setLayout(new BorderLayout()); - label.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); - // createLineBorder(Color.BLACK)); - add(label, BorderLayout.CENTER); - } - - public void setText(String text) { - label.setText(text); - pack(); - setLocationRelativeTo(null); - } - -} diff --git a/src/com/github/xsavikx/android/screencast/ui/MultiLineLabelUI.java b/src/com/github/xsavikx/android/screencast/ui/MultiLineLabelUI.java deleted file mode 100644 index 861ae32..0000000 --- a/src/com/github/xsavikx/android/screencast/ui/MultiLineLabelUI.java +++ /dev/null @@ -1,288 +0,0 @@ -package com.github.xsavikx.android.screencast.ui; - -import java.awt.Dimension; -import java.awt.FontMetrics; -import java.awt.Graphics; -import java.awt.Rectangle; -import java.util.StringTokenizer; - -import javax.swing.Icon; -import javax.swing.JComponent; -import javax.swing.JLabel; -import javax.swing.SwingConstants; -import javax.swing.SwingUtilities; -import javax.swing.plaf.basic.BasicGraphicsUtils; -import javax.swing.plaf.basic.BasicLabelUI; - -public class MultiLineLabelUI extends BasicLabelUI { - public static Dimension computeMultiLineDimension(FontMetrics fm, String[] strs) { - int i, c, width = 0; - for (i = 0, c = strs.length; i < c; i++) - width = Math.max(width, SwingUtilities.computeStringWidth(fm, strs[i])); - return new Dimension(width, fm.getHeight() * strs.length); - } - - /** - * Compute and return the location of the icons origin, the location of origin of the text baseline, and a possibly clipped version of the compound - * labels string. Locations are computed relative to the viewR rectangle. This layoutCompoundLabel() does not know how to handle LEADING/TRAILING - * values in horizontalTextPosition (they will default to RIGHT) and in horizontalAlignment (they will default to CENTER). Use the other version of - * layoutCompoundLabel() instead. - */ - public static String layoutCompoundLabel(FontMetrics fm, String[] text, Icon icon, int verticalAlignment, - int horizontalAlignment, int verticalTextPosition, int horizontalTextPosition, Rectangle viewR, Rectangle iconR, - Rectangle textR, int textIconGap) { - /* - * Initialize the icon bounds rectangle iconR. - */ - - if (icon != null) { - iconR.width = icon.getIconWidth(); - iconR.height = icon.getIconHeight(); - } else { - iconR.width = iconR.height = 0; - } - - /* - * Initialize the text bounds rectangle textR. If a null or and empty String was specified we substitute "" here and use 0,0,0,0 for textR. - */ - - // Fix for textIsEmpty sent by Paulo Santos - boolean textIsEmpty = (text == null) || (text.length == 0) - || (text.length == 1 && ((text[0] == null) || text[0].equals(""))); - - String rettext = ""; - if (textIsEmpty) { - textR.width = textR.height = 0; - } else { - Dimension dim = computeMultiLineDimension(fm, text); - textR.width = dim.width; - textR.height = dim.height; - } - - /* - * Unless both text and icon are non-null, we effectively ignore the value of textIconGap. The code that follows uses the value of gap instead of - * textIconGap. - */ - - int gap = (textIsEmpty || (icon == null)) ? 0 : textIconGap; - - if (!textIsEmpty) { - - /* - * If the label text string is too wide to fit within the available space "..." and as many characters as will fit will be displayed instead. - */ - - int availTextWidth; - - if (horizontalTextPosition == CENTER) { - availTextWidth = viewR.width; - } else { - availTextWidth = viewR.width - (iconR.width + gap); - } - - if (textR.width > availTextWidth && text.length == 1) { - String clipString = "..."; - int totalWidth = SwingUtilities.computeStringWidth(fm, clipString); - int nChars; - for (nChars = 0; nChars < text[0].length(); nChars++) { - totalWidth += fm.charWidth(text[0].charAt(nChars)); - if (totalWidth > availTextWidth) { - break; - } - } - rettext = text[0].substring(0, nChars) + clipString; - textR.width = SwingUtilities.computeStringWidth(fm, rettext); - } - } - - /* - * Compute textR.x,y given the verticalTextPosition and horizontalTextPosition properties - */ - - if (verticalTextPosition == TOP) { - if (horizontalTextPosition != CENTER) { - textR.y = 0; - } else { - textR.y = -(textR.height + gap); - } - } else if (verticalTextPosition == CENTER) { - textR.y = (iconR.height / 2) - (textR.height / 2); - } else { // (verticalTextPosition == BOTTOM) - if (horizontalTextPosition != CENTER) { - textR.y = iconR.height - textR.height; - } else { - textR.y = (iconR.height + gap); - } - } - - if (horizontalTextPosition == LEFT) { - textR.x = -(textR.width + gap); - } else if (horizontalTextPosition == CENTER) { - textR.x = (iconR.width / 2) - (textR.width / 2); - } else { // (horizontalTextPosition == RIGHT) - textR.x = (iconR.width + gap); - } - - /* - * labelR is the rectangle that contains iconR and textR. Move it to its proper position given the labelAlignment properties. - * - * To avoid actually allocating a Rectangle, Rectangle.union has been inlined below. - */ - int labelR_x = Math.min(iconR.x, textR.x); - int labelR_width = Math.max(iconR.x + iconR.width, textR.x + textR.width) - labelR_x; - int labelR_y = Math.min(iconR.y, textR.y); - int labelR_height = Math.max(iconR.y + iconR.height, textR.y + textR.height) - labelR_y; - - int dx, dy; - - if (verticalAlignment == TOP) { - dy = viewR.y - labelR_y; - } else if (verticalAlignment == CENTER) { - dy = (viewR.y + (viewR.height / 2)) - (labelR_y + (labelR_height / 2)); - } else { // (verticalAlignment == BOTTOM) - dy = (viewR.y + viewR.height) - (labelR_y + labelR_height); - } - - if (horizontalAlignment == LEFT) { - dx = viewR.x - labelR_x; - } else if (horizontalAlignment == RIGHT) { - dx = (viewR.x + viewR.width) - (labelR_x + labelR_width); - } else { // (horizontalAlignment == CENTER) - dx = (viewR.x + (viewR.width / 2)) - (labelR_x + (labelR_width / 2)); - } - - /* - * Translate textR and glypyR by dx,dy. - */ - - textR.x += dx; - textR.y += dy; - - iconR.x += dx; - iconR.y += dy; - - return rettext; - } - - /** - * Compute and return the location of the icons origin, the location of origin of the text baseline, and a possibly clipped version of the compound - * labels string. Locations are computed relative to the viewR rectangle. The JComponents orientation (LEADING/TRAILING) will also be taken into - * account and translated into LEFT/RIGHT values accordingly. - */ - public static String layoutCompoundLabel(JComponent c, FontMetrics fm, String[] text, Icon icon, - int verticalAlignment, int horizontalAlignment, int verticalTextPosition, int horizontalTextPosition, - Rectangle viewR, Rectangle iconR, Rectangle textR, int textIconGap) { - boolean orientationIsLeftToRight = true; - int hAlign = horizontalAlignment; - int hTextPos = horizontalTextPosition; - - if (c != null) { - if (!(c.getComponentOrientation().isLeftToRight())) { - orientationIsLeftToRight = false; - } - } - - // Translate LEADING/TRAILING values in horizontalAlignment - // to LEFT/RIGHT values depending on the components orientation - switch (horizontalAlignment) { - case LEADING: - hAlign = (orientationIsLeftToRight) ? LEFT : RIGHT; - break; - case TRAILING: - hAlign = (orientationIsLeftToRight) ? RIGHT : LEFT; - break; - } - - // Translate LEADING/TRAILING values in horizontalTextPosition - // to LEFT/RIGHT values depending on the components orientation - switch (horizontalTextPosition) { - case LEADING: - hTextPos = (orientationIsLeftToRight) ? LEFT : RIGHT; - break; - case TRAILING: - hTextPos = (orientationIsLeftToRight) ? RIGHT : LEFT; - break; - } - - return layoutCompoundLabel(fm, text, icon, verticalAlignment, hAlign, verticalTextPosition, hTextPos, viewR, iconR, - textR, textIconGap); - } - - static { - labelUI = new MultiLineLabelUI(); - } - - static final int LEADING = SwingConstants.LEADING; - static final int TRAILING = SwingConstants.TRAILING; - static final int LEFT = SwingConstants.LEFT; - static final int RIGHT = SwingConstants.RIGHT; - - static final int TOP = SwingConstants.TOP; - - static final int CENTER = SwingConstants.CENTER; - - protected String str; - - protected String[] strs; - - protected void drawString(Graphics g, String s, int accChar, int textX, int textY) { - if (s.indexOf('\n') == -1) - BasicGraphicsUtils.drawString(g, s, accChar, textX, textY); - else { - String[] strs = splitStringByLines(s); - int height = g.getFontMetrics().getHeight(); - // Only the first line can have the accel char - BasicGraphicsUtils.drawString(g, strs[0], accChar, textX, textY); - for (int i = 1; i < strs.length; i++) - g.drawString(strs[i], textX, textY + (height * i)); - } - } - - @Override - protected String layoutCL(JLabel label, FontMetrics fontMetrics, String text, Icon icon, Rectangle viewR, - Rectangle iconR, Rectangle textR) { - String s = layoutCompoundLabel(label, fontMetrics, splitStringByLines(text), icon, label.getVerticalAlignment(), - label.getHorizontalAlignment(), label.getVerticalTextPosition(), label.getHorizontalTextPosition(), viewR, - iconR, textR, label.getIconTextGap()); - - if (s.equals("")) - return text; - return s; - } - - @Override - protected void paintDisabledText(JLabel l, Graphics g, String s, int textX, int textY) { - int accChar = l.getDisplayedMnemonic(); - g.setColor(l.getBackground()); - drawString(g, s, accChar, textX, textY); - } - - @Override - protected void paintEnabledText(JLabel l, Graphics g, String s, int textX, int textY) { - int accChar = l.getDisplayedMnemonic(); - g.setColor(l.getForeground()); - drawString(g, s, accChar, textX, textY); - } - - public String[] splitStringByLines(String str) { - if (str.equals(this.str)) - return strs; - - this.str = str; - - int lines = 1; - int i, c; - for (i = 0, c = str.length(); i < c; i++) { - if (str.charAt(i) == '\n') - lines++; - } - strs = new String[lines]; - StringTokenizer st = new StringTokenizer(str, "\n"); - - int line = 0; - while (st.hasMoreTokens()) - strs[line++] = st.nextToken(); - - return strs; - } -} diff --git a/src/com/github/xsavikx/android/screencast/ui/explorer/JFrameExplorer.java b/src/com/github/xsavikx/android/screencast/ui/explorer/JFrameExplorer.java deleted file mode 100644 index b24c569..0000000 --- a/src/com/github/xsavikx/android/screencast/ui/explorer/JFrameExplorer.java +++ /dev/null @@ -1,150 +0,0 @@ -package com.github.xsavikx.android.screencast.ui.explorer; - -import java.awt.BorderLayout; -import java.awt.Desktop; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.io.File; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Vector; - -import javax.swing.JFrame; -import javax.swing.JList; -import javax.swing.JScrollPane; -import javax.swing.JSplitPane; -import javax.swing.JTree; -import javax.swing.ListModel; -import javax.swing.event.TreeSelectionEvent; -import javax.swing.event.TreeSelectionListener; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.TreePath; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import com.github.xsavikx.android.screencast.api.AndroidDevice; -import com.github.xsavikx.android.screencast.api.file.FileInfo; - -@Component -public class JFrameExplorer extends JFrame { - - private class FolderTreeNode extends LazyMutableTreeNode { - private static final long serialVersionUID = 9131974430354670263L; - String name; - String path; - - public FolderTreeNode(String name, String path) { - this.name = name; - this.path = path; - } - - @Override - public void initChildren() { - List fileInfos = cache.get(path); - if (fileInfos == null) - fileInfos = androidDevice.list(path); - for (FileInfo fi : fileInfos) { - if (fi.directory) - add(new FolderTreeNode(fi.name, path + fi.name + "/")); - // else - // add(new FileTreeNode(fi)); - } - } - - @Override - public String toString() { - return name; - } - - } - - private static final long serialVersionUID = -5209265873286028854L; - private JTree jt; - private JSplitPane jSplitPane; - @Autowired - private AndroidDevice androidDevice; - - private JList jListFichiers; - - private Map> cache = new LinkedHashMap>(); - - public JFrameExplorer() { - - setTitle("Explorer"); - setLayout(new BorderLayout()); - - jt = new JTree(new DefaultMutableTreeNode("Test")); - } - - public void launch() { - - jt.setModel(new DefaultTreeModel(new FolderTreeNode("Device", "/"))); - jt.setRootVisible(true); - jt.addTreeSelectionListener(new TreeSelectionListener() { - - @Override - public void valueChanged(TreeSelectionEvent e) { - TreePath tp = e.getPath(); - if (tp == null) - return; - if (!(tp.getLastPathComponent() instanceof FolderTreeNode)) - return; - FolderTreeNode node = (FolderTreeNode) tp.getLastPathComponent(); - displayFolder(node.path); - } - }); - - JScrollPane jsp = new JScrollPane(jt); - - jListFichiers = new JList(); - jListFichiers.setListData(new Object[] {}); - - jSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, jsp, new JScrollPane(jListFichiers)); - - add(jSplitPane, BorderLayout.CENTER); - setSize(640, 480); - setLocationRelativeTo(null); - - jListFichiers.addMouseListener(new MouseAdapter() { - - @Override - public void mouseClicked(MouseEvent e) { - if (e.getClickCount() == 2) { - int index = jListFichiers.locationToIndex(e.getPoint()); - ListModel dlm = jListFichiers.getModel(); - FileInfo item = (FileInfo) dlm.getElementAt(index); - launchFile(item); - } - } - - }); - } - - private void displayFolder(String path) { - List fileInfos = cache.get(path); - if (fileInfos == null) - fileInfos = androidDevice.list(path); - - List files = new Vector(); - for (FileInfo fi2 : fileInfos) { - if (fi2.directory) - continue; - files.add(fi2); - } - jListFichiers.setListData(files.toArray()); - - } - - private void launchFile(FileInfo node) { - try { - File tempFile = node.downloadTemporary(); - Desktop.getDesktop().open(tempFile); - } catch (Exception ex) { - throw new RuntimeException(ex); - } - } - -} diff --git a/src/com/github/xsavikx/android/screencast/ui/explorer/LazyLoadingTreeNode.java b/src/com/github/xsavikx/android/screencast/ui/explorer/LazyLoadingTreeNode.java deleted file mode 100644 index bd886dc..0000000 --- a/src/com/github/xsavikx/android/screencast/ui/explorer/LazyLoadingTreeNode.java +++ /dev/null @@ -1,291 +0,0 @@ -package com.github.xsavikx.android.screencast.ui.explorer; - -import java.awt.event.ActionEvent; -import java.awt.event.KeyEvent; -import java.util.Iterator; -import java.util.Vector; -import java.util.concurrent.ExecutionException; - -import javax.swing.AbstractAction; -import javax.swing.Action; -import javax.swing.JTree; -import javax.swing.KeyStroke; -import javax.swing.SwingUtilities; -import javax.swing.event.TreeExpansionEvent; -import javax.swing.event.TreeWillExpandListener; -import javax.swing.tree.DefaultMutableTreeNode; -import javax.swing.tree.DefaultTreeModel; -import javax.swing.tree.MutableTreeNode; -import javax.swing.tree.TreeModel; - -import com.github.xsavikx.android.screencast.ui.worker.SwingWorker; - -public abstract class LazyLoadingTreeNode extends DefaultMutableTreeNode implements TreeWillExpandListener { - - /** - * ActionMap can only store one Action for the same key, This Action Stores the list of SwingWorker to be canceled if the escape key is pressed. - * - * @author Thierry LEFORT 3 mars 08 - * - */ - protected static class CancelWorkersAction extends AbstractAction { - /** - * - */ - private static final long serialVersionUID = 3173288834368915117L; - /** the SwingWorkers */ - private Vector> workers = new Vector>(); - - /** Default constructor */ - private CancelWorkersAction() { - super(ESCAPE_ACTION_NAME); - } - - /** Do the Cancel */ - @Override - public void actionPerformed(ActionEvent e) { - Iterator> it = workers.iterator(); - while (it.hasNext()) { - SwingWorker worker = it.next(); - worker.cancel(true); - } - - } - - /** Add a Cancelable SwingWorker */ - public void addSwingWorker(SwingWorker worker) { - workers.add(worker); - } - - /** Remove a SwingWorker */ - public void removeSwingWorker(SwingWorker worker) { - workers.remove(worker); - } - - } - - /** - * - */ - private static final long serialVersionUID = -4981073521761764327L; - - private static final String ESCAPE_ACTION_NAME = "escape"; - - private static final KeyStroke ESCAPE_KEY = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0); - - /** The JTree containing this Node */ - private JTree tree; - /** Can the worker be Canceled ? */ - private boolean cancelable; - - /** - * Default Constructor - * - * @param userObject - * an Object provided by the user that constitutes the node's data - * @param tree - * the JTree containing this Node - * @param cancelable - */ - public LazyLoadingTreeNode(Object userObject, JTree tree, boolean cancelable) { - super(userObject); - tree.addTreeWillExpandListener(this); - this.tree = tree; - this.cancelable = cancelable; - setAllowsChildren(true); - } - - /** - * - * @return true if there are some childrens - */ - protected boolean areChildrenLoaded() { - return getChildCount() > 0 && getAllowsChildren(); - } - - /** - * - * @return a new Loading please wait node - */ - protected MutableTreeNode createLoadingNode() { - return new DefaultMutableTreeNode("Loading Please Wait ...", false); - } - - /** - * Create worker that will load the nodes - * - * @param tree - * the tree - * @return the newly created SwingWorker - */ - protected SwingWorker createSwingWorker(final JTree tree) { - - SwingWorker worker = new SwingWorker() { - - @Override - protected MutableTreeNode[] doInBackground() { - return loadChildren(tree); - } - - @Override - protected void done() { - try { - if (!isCancelled()) { - MutableTreeNode[] nodes = get(); - setAllowsChildren(nodes.length > 0); - setChildren(nodes); - unRegisterSwingWorkerForCancel(tree, this); - } else { - reset(); - } - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (ExecutionException e) { - e.printStackTrace(); - } - - } - - }; - registerSwingWorkerForCancel(tree, worker); - return worker; - } - - /** - * If the - * - * @see #getAllowsChildren() - * @return false, this node can't be a leaf - */ - @Override - public boolean isLeaf() { - return !getAllowsChildren(); - } - - /** - * This method will be executed in a background thread. If you have to do some GUI stuff use {@link SwingUtilities#invokeLater(Runnable)} - * - * @param tree - * the tree - * @return the Created nodes - */ - public abstract MutableTreeNode[] loadChildren(JTree tree); - - /** - * If the node is cancelable an escape Action is registered in the tree's InputMap and ActionMap that will cancel the execution - * - * @param tree - * the tree - * @param worker - * the worker to cancel - */ - protected void registerSwingWorkerForCancel(JTree tree, SwingWorker worker) { - if (!cancelable) { - return; - } - tree.getInputMap().put(ESCAPE_KEY, ESCAPE_ACTION_NAME); - Action action = tree.getActionMap().get(ESCAPE_ACTION_NAME); - if (action == null) { - CancelWorkersAction cancelWorkerAction = new CancelWorkersAction(); - cancelWorkerAction.addSwingWorker(worker); - tree.getActionMap().put(ESCAPE_ACTION_NAME, cancelWorkerAction); - } else { - if (action instanceof CancelWorkersAction) { - CancelWorkersAction cancelAction = (CancelWorkersAction) action; - cancelAction.addSwingWorker(worker); - } - } - } - - /** - * Need some improvement ... This method should restore the Node initial state if the worker if canceled - */ - protected void reset() { - DefaultTreeModel defaultModel = (DefaultTreeModel) tree.getModel(); - int childCount = getChildCount(); - if (childCount > 0) { - for (int i = 0; i < childCount; i++) { - defaultModel.removeNodeFromParent((MutableTreeNode) getChildAt(0)); - } - } - setAllowsChildren(true); - } - - /** - * Define nodes children - * - * @param nodes - * new nodes - */ - protected void setChildren(MutableTreeNode... nodes) { - TreeModel model = tree.getModel(); - if (model instanceof DefaultTreeModel) { - DefaultTreeModel defaultModel = (DefaultTreeModel) model; - int childCount = getChildCount(); - if (childCount > 0) { - for (int i = 0; i < childCount; i++) { - defaultModel.removeNodeFromParent((MutableTreeNode) getChildAt(0)); - } - } - for (int i = 0; i < nodes.length; i++) { - defaultModel.insertNodeInto(nodes[i], this, i); - } - } - } - - /** - * set the loading state - */ - private void setLoading() { - setChildren(createLoadingNode()); - TreeModel model = tree.getModel(); - if (model instanceof DefaultTreeModel) { - DefaultTreeModel defaultModel = (DefaultTreeModel) model; - int[] indices = new int[getChildCount()]; - for (int i = 0; i < indices.length; i++) { - indices[i] = i; - } - defaultModel.nodesWereInserted(LazyLoadingTreeNode.this, indices); - } - } - - /** - * Default empty implementation, do nothing on collapse event. - */ - @Override - public void treeWillCollapse(TreeExpansionEvent event) { - // ignore - } - - /** - * Node will expand, it's time to retrieve nodes - */ - @Override - public void treeWillExpand(TreeExpansionEvent event) { - if (this.equals(event.getPath().getLastPathComponent())) { - if (areChildrenLoaded()) { - return; - } - setLoading(); - SwingWorker worker = createSwingWorker(tree); - worker.execute(); - } - } - - /** - * Remove the swingWorker from the cancellable task of the tree - * - * @param tree - * @param worker - */ - protected void unRegisterSwingWorkerForCancel(JTree tree, SwingWorker worker) { - if (!cancelable) { - return; - } - Action action = tree.getActionMap().get(ESCAPE_ACTION_NAME); - if (action != null && action instanceof CancelWorkersAction) { - CancelWorkersAction cancelWorkerAction = new CancelWorkersAction(); - cancelWorkerAction.removeSwingWorker(worker); - } - } -} diff --git a/src/com/github/xsavikx/android/screencast/ui/explorer/LazyMutableTreeNode.java b/src/com/github/xsavikx/android/screencast/ui/explorer/LazyMutableTreeNode.java deleted file mode 100644 index d83c9e3..0000000 --- a/src/com/github/xsavikx/android/screencast/ui/explorer/LazyMutableTreeNode.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.github.xsavikx.android.screencast.ui.explorer; - -import javax.swing.tree.DefaultMutableTreeNode; - -public abstract class LazyMutableTreeNode extends DefaultMutableTreeNode { - - private static final long serialVersionUID = -6383034137965603498L; - protected boolean _loaded = false; - - public LazyMutableTreeNode() { - super(); - } - - public LazyMutableTreeNode(Object userObject) { - super(userObject); - } - - public LazyMutableTreeNode(Object userObject, boolean allowsChildren) { - super(userObject, allowsChildren); - } - - public void clear() { - removeAllChildren(); - _loaded = false; - } - - @Override - public int getChildCount() { - synchronized (this) { - if (!_loaded) { - _loaded = true; - initChildren(); - } - } - return super.getChildCount(); - } - - protected abstract void initChildren(); - - public boolean isLoaded() { - return _loaded; - } - -} \ No newline at end of file diff --git a/src/com/github/xsavikx/android/screencast/ui/interaction/KeyEventDispatcherFactory.java b/src/com/github/xsavikx/android/screencast/ui/interaction/KeyEventDispatcherFactory.java deleted file mode 100644 index 9a111cd..0000000 --- a/src/com/github/xsavikx/android/screencast/ui/interaction/KeyEventDispatcherFactory.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.github.xsavikx.android.screencast.ui.interaction; - -import java.awt.KeyEventDispatcher; -import java.awt.Window; - -public final class KeyEventDispatcherFactory { - public static KeyEventDispatcher getKeyEventDispatcher(Window frame) { - return new KeyEventDispatcherImpl(frame); - } -} diff --git a/src/com/github/xsavikx/android/screencast/ui/interaction/KeyEventDispatcherImpl.java b/src/com/github/xsavikx/android/screencast/ui/interaction/KeyEventDispatcherImpl.java deleted file mode 100644 index d4f3b4c..0000000 --- a/src/com/github/xsavikx/android/screencast/ui/interaction/KeyEventDispatcherImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.github.xsavikx.android.screencast.ui.interaction; - -import java.awt.KeyEventDispatcher; -import java.awt.Window; -import java.awt.event.KeyEvent; - -import javax.swing.SwingUtilities; - -import com.github.xsavikx.android.screencast.api.command.executor.CommandExecutor; -import com.github.xsavikx.android.screencast.api.command.factory.AdbInputCommandFactory; -import com.github.xsavikx.android.screencast.api.injector.KeyCodeConverter; -import com.github.xsavikx.android.screencast.spring.config.ApplicationContextProvider; - -public class KeyEventDispatcherImpl implements KeyEventDispatcher { - private CommandExecutor commandExecutor; - private Window window; - - public KeyEventDispatcherImpl(Window frame) { - this.window = frame; - } - - @Override - public boolean dispatchKeyEvent(KeyEvent e) { - if (!window.isActive()) - return false; - if (e.getID() == KeyEvent.KEY_TYPED) { - final int code = KeyCodeConverter.getKeyCode(e); - SwingUtilities.invokeLater(new Runnable() { - - @Override - public void run() { - getCommandExecutor().execute(AdbInputCommandFactory.getKeyCommand(code)); - - } - }); - - } - return false; - } - - private CommandExecutor getCommandExecutor() { - if (commandExecutor == null) { - commandExecutor = ApplicationContextProvider.getApplicationContext().getBean(CommandExecutor.class); - } - return commandExecutor; - } -} diff --git a/src/com/github/xsavikx/android/screencast/ui/interaction/KeyboardActionListener.java b/src/com/github/xsavikx/android/screencast/ui/interaction/KeyboardActionListener.java deleted file mode 100644 index 05db73b..0000000 --- a/src/com/github/xsavikx/android/screencast/ui/interaction/KeyboardActionListener.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.github.xsavikx.android.screencast.ui.interaction; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; - -import javax.swing.SwingUtilities; - -import com.github.xsavikx.android.screencast.api.command.executor.CommandExecutor; -import com.github.xsavikx.android.screencast.api.command.factory.AdbInputCommandFactory; -import com.github.xsavikx.android.screencast.spring.config.ApplicationContextProvider; - -public class KeyboardActionListener implements ActionListener { - private CommandExecutor commandExecutor; - private int key; - - public KeyboardActionListener(int key) { - this.key = key; - } - - @Override - public void actionPerformed(ActionEvent e) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - getCommandExecutor().execute(AdbInputCommandFactory.getKeyCommand(key)); - } - }); - - } - - private CommandExecutor getCommandExecutor() { - if (commandExecutor == null) { - commandExecutor = ApplicationContextProvider.getApplicationContext().getBean(CommandExecutor.class); - } - return commandExecutor; - } - -} diff --git a/src/com/github/xsavikx/android/screencast/ui/interaction/KeyboardActionListenerFactory.java b/src/com/github/xsavikx/android/screencast/ui/interaction/KeyboardActionListenerFactory.java deleted file mode 100644 index a6061fb..0000000 --- a/src/com/github/xsavikx/android/screencast/ui/interaction/KeyboardActionListenerFactory.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.github.xsavikx.android.screencast.ui.interaction; - -import com.github.xsavikx.android.screencast.api.injector.InputKeyEvent; - -public final class KeyboardActionListenerFactory { - public static KeyboardActionListener getInstance(InputKeyEvent inputKeyEvent) { - return new KeyboardActionListener(inputKeyEvent.getCode()); - } -} diff --git a/src/com/github/xsavikx/android/screencast/ui/interaction/MouseActionAdapter.java b/src/com/github/xsavikx/android/screencast/ui/interaction/MouseActionAdapter.java deleted file mode 100644 index 1022adf..0000000 --- a/src/com/github/xsavikx/android/screencast/ui/interaction/MouseActionAdapter.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.github.xsavikx.android.screencast.ui.interaction; - -import java.awt.Point; -import java.awt.event.MouseAdapter; -import java.awt.event.MouseEvent; -import java.awt.event.MouseWheelEvent; - -import javax.swing.SwingUtilities; - -import com.github.xsavikx.android.screencast.api.command.executor.CommandExecutor; -import com.github.xsavikx.android.screencast.api.command.factory.AdbInputCommandFactory; -import com.github.xsavikx.android.screencast.api.injector.Injector; -import com.github.xsavikx.android.screencast.spring.config.ApplicationContextProvider; -import com.github.xsavikx.android.screencast.ui.JPanelScreen; - -public class MouseActionAdapter extends MouseAdapter { - private CommandExecutor commandExecutor; - private final JPanelScreen jp; - private Injector injector; - private int dragFromX = -1; - - private int dragFromY = -1; - private long timeFromPress = -1; - private final static long ONE_SECOND = 1000L; - - public MouseActionAdapter(JPanelScreen jPanelScreen) { - this.jp = jPanelScreen; - } - - public MouseActionAdapter(JPanelScreen jPanelScreen, Injector injector) { - this(jPanelScreen); - this.injector = injector; - } - - @Override - public void mouseClicked(MouseEvent e) { - if (injector != null && e.getButton() == MouseEvent.BUTTON3) { - injector.screencapture.toogleOrientation(); - e.consume(); - return; - } - final Point p2 = jp.getRawPoint(e.getPoint()); - if (p2.x > 0 && p2.y > 0) { - SwingUtilities.invokeLater(new Runnable() { - @Override - public void run() { - getCommandExecutor().execute(AdbInputCommandFactory.getTapCommand(p2.x, p2.y)); - - } - }); - } - } - - @Override - public void mouseDragged(MouseEvent e) { - if (dragFromX == -1 && dragFromY == -1) { - Point p2 = jp.getRawPoint(e.getPoint()); - dragFromX = p2.x; - dragFromY = p2.y; - timeFromPress = System.currentTimeMillis(); - } - } - - @Override - public void mouseReleased(MouseEvent e) { - if (timeFromPress >= ONE_SECOND) { - final Point p2 = jp.getRawPoint(e.getPoint()); - final int xFrom = dragFromX; - final int yFrom = dragFromY; - final int xTo = p2.x; - final int yTo = p2.y; - SwingUtilities.invokeLater(new Runnable() { - - @Override - public void run() { - getCommandExecutor().execute(AdbInputCommandFactory.getSwipeCommand(xFrom, yFrom, xTo, yTo)); - } - }); - dragFromX = -1; - dragFromY = -1; - timeFromPress = -1; - } - } - - @Override - public void mouseWheelMoved(MouseWheelEvent arg0) { - // if (JFrameMain.this.injector == null) - // return; - // JFrameMain.this.injector.injectTrackball(arg0.getWheelRotation() < 0 ? - // -1f : 1f); - } - - private CommandExecutor getCommandExecutor() { - if (commandExecutor == null) { - commandExecutor = ApplicationContextProvider.getApplicationContext().getBean(CommandExecutor.class); - } - return commandExecutor; - } -} diff --git a/src/com/github/xsavikx/android/screencast/ui/interaction/MouseActionAdapterFactory.java b/src/com/github/xsavikx/android/screencast/ui/interaction/MouseActionAdapterFactory.java deleted file mode 100644 index 407526b..0000000 --- a/src/com/github/xsavikx/android/screencast/ui/interaction/MouseActionAdapterFactory.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.github.xsavikx.android.screencast.ui.interaction; - -import com.github.xsavikx.android.screencast.api.injector.Injector; -import com.github.xsavikx.android.screencast.ui.JPanelScreen; - -public final class MouseActionAdapterFactory { - public static MouseActionAdapter getInstance(JPanelScreen jPanelScreen) { - return new MouseActionAdapter(jPanelScreen); - } - - public static MouseActionAdapter getInstance(JPanelScreen jPanelScreen, Injector injector) { - return new MouseActionAdapter(jPanelScreen, injector); - } -} diff --git a/src/com/github/xsavikx/android/screencast/ui/model/InputKeyEventTable.java b/src/com/github/xsavikx/android/screencast/ui/model/InputKeyEventTable.java deleted file mode 100644 index efb0d19..0000000 --- a/src/com/github/xsavikx/android/screencast/ui/model/InputKeyEventTable.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.github.xsavikx.android.screencast.ui.model; - -import java.awt.Component; - -import javax.swing.JTable; -import javax.swing.ListSelectionModel; -import javax.swing.table.TableCellRenderer; -import javax.swing.table.TableColumn; -import javax.swing.table.TableColumnModel; - -public class InputKeyEventTable extends JTable { - private static final long serialVersionUID = 3978642864003531967L; - - private final static int MIN_COLUMN_WIDTH = 20; - - public InputKeyEventTable(InputKeyEventTableModel tableModel) { - super(tableModel); - setTableColumnsNames(tableModel.columnNames); - setAutoResizeMode(JTable.AUTO_RESIZE_OFF); - setTableColumnsPrefferedSize(); - setSelectionMode(ListSelectionModel.SINGLE_SELECTION); - } - - private void setTableColumnsNames(String[] columnNames) { - TableColumnModel columnModel = getColumnModel(); - for (int i = 0; i < columnNames.length; i++) { - TableColumn column = columnModel.getColumn(i); - column.setHeaderValue(columnNames[i]); - } - } - - private void setTableColumnsPrefferedSize() { - final TableColumnModel columnModel = getColumnModel(); - for (int column = 0; column < getColumnCount(); column++) { - int width = MIN_COLUMN_WIDTH; // Min width - for (int row = 0; row < getRowCount(); row++) { - TableCellRenderer renderer = getCellRenderer(row, column); - Component comp = prepareRenderer(renderer, row, column); - width = Math.max(comp.getPreferredSize().width + 5, width); - } - columnModel.getColumn(column).setPreferredWidth(width); - } - } - -} diff --git a/src/com/github/xsavikx/android/screencast/ui/model/InputKeyEventTableModel.java b/src/com/github/xsavikx/android/screencast/ui/model/InputKeyEventTableModel.java deleted file mode 100644 index 3be911f..0000000 --- a/src/com/github/xsavikx/android/screencast/ui/model/InputKeyEventTableModel.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.github.xsavikx.android.screencast.ui.model; - -import java.util.ArrayList; -import java.util.List; - -import javax.swing.table.AbstractTableModel; - -import com.github.xsavikx.android.screencast.api.injector.InputKeyEvent; - -public class InputKeyEventTableModel extends AbstractTableModel { - private static final long serialVersionUID = 1553313932570896541L; - private final static String INDEX_COLUMN_NAME = "#"; - private final static String TITLE_COLUMN_NAME = "title"; - private final static String DESCRIPTION_COLUMN_NAME = "description"; - public final String[] columnNames = { - INDEX_COLUMN_NAME, TITLE_COLUMN_NAME, DESCRIPTION_COLUMN_NAME - }; - private List> data = new ArrayList<>(); - private int rowCount = 1; - - public InputKeyEventTableModel(InputKeyEvent[] initialData) { - initData(initialData); - } - - private void initData(InputKeyEvent[] inputKeyEvents) { - for (InputKeyEvent e : inputKeyEvents) { - data.add(getDataRow(e)); - } - } - - private List getDataRow(InputKeyEvent e) { - List row = new ArrayList<>(); - row.add(rowCount++); - row.add(e.name()); - row.add(e.getDescription()); - return row; - } - - @Override - public int getRowCount() { - return data.size(); - } - - @Override - public int getColumnCount() { - return columnNames.length; - } - - @Override - public Object getValueAt(int rowIndex, int columnIndex) { - return data.get(rowIndex).get(columnIndex); - } - -} diff --git a/src/com/github/xsavikx/android/screencast/ui/worker/AccumulativeRunnable.java b/src/com/github/xsavikx/android/screencast/ui/worker/AccumulativeRunnable.java deleted file mode 100644 index e9654a3..0000000 --- a/src/com/github/xsavikx/android/screencast/ui/worker/AccumulativeRunnable.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.github.xsavikx.android.screencast.ui.worker; - -/* - * $Id: AccumulativeRunnable.java,v 1.3 2008/07/25 19:32:29 idk Exp $ - * - * Copyright @ 2005 Sun Microsystems, Inc. All rights - * reserved. Use is subject to license terms. - */ - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import javax.swing.SwingUtilities; - -/** - * An abstract class to be used in the cases where we need {@code Runnable} to perform some actions on an appendable set of data. The set of data - * might be appended after the {@code Runnable} is sent for the execution. Usually such {@code Runnables} are sent to the EDT. - * - *

- * Usage example: - * - *

- * Say we want to implement JLabel.setText(String text) which sends {@code text} string to the JLabel.setTextImpl(String text) on the EDT. In the - * event JLabel.setText is called rapidly many times off the EDT we will get many updates on the EDT but only the last one is important. (Every next - * updates overrides the previous one.) We might want to implement this {@code setText} in a way that only the last update is delivered. - *

- * Here is how one can do this using {@code AccumulativeRunnable}: - * - *

- * AccumulativeRunnable doSetTextImpl = 
- * new  AccumulativeRunnable() {
- *     @Override 
- *     protected void run(List<String> args) {
- *         //set to the last string being passed
- *         setTextImpl(args.get(args.size() - 1);
- *     }
- * }
- * void setText(String text) {
- *     //add text and send for the execution if needed.
- *     doSetTextImpl.add(text);
- * }
- * 
- * - *

- * Say we want want to implement addDirtyRegion(Rectangle rect) which sends this region to the handleDirtyRegions(List regions) on the EDT. - * addDirtyRegions better be accumulated before handling on the EDT. - * - *

- * Here is how it can be implemented using AccumulativeRunnable: - * - *

- * AccumulativeRunnable<Rectangle> doHandleDirtyRegions = new AccumulativeRunnable<Rectangle>() {
- *   @Override
- *   protected void run(List<Rectangle> args) {
- *     handleDirtyRegions(args);
- *   }
- * };
- * 
- * void addDirtyRegion(Rectangle rect) {
- *   doHandleDirtyRegions.add(rect);
- * }
- * 
- * - * @author Igor Kushnirskiy - * @version $Revision: 1.3 $ $Date: 2008/07/25 19:32:29 $ - * - * @param - * the type this {@code Runnable} accumulates - * - */ -abstract class AccumulativeRunnable implements Runnable { - private List arguments = null; - - /** - * prepends or appends arguments and sends this {@code Runnable} for the execution if needed. - *

- * This implementation uses {@see #submit} to send this {@code Runnable} for execution. - * - * @param isPrepend - * prepend or append - * @param args - * the arguments to add - */ - public final synchronized void add(boolean isPrepend, T... args) { - boolean isSubmitted = true; - if (arguments == null) { - isSubmitted = false; - arguments = new ArrayList(); - } - if (isPrepend) { - arguments.addAll(0, Arrays.asList(args)); - } else { - Collections.addAll(arguments, args); - } - if (!isSubmitted) { - submit(); - } - } - - /** - * appends arguments and sends this {@code Runnable} for the execution if needed. - *

- * This implementation uses {@see #submit} to send this {@code Runnable} for execution. - * - * @param args - * the arguments to accumulate - */ - public final void add(T... args) { - add(false, args); - } - - /** - * Returns accumulated arguments and flashes the arguments storage. - * - * @return accumulated arguments - */ - private final synchronized List flush() { - List list = arguments; - arguments = null; - return list; - } - - /** - * {@inheritDoc} - * - *

- * This implementation calls {@code run(List args)} method with the list of accumulated arguments. - */ - @Override - public final void run() { - run(flush()); - } - - /** - * Equivalent to {@code Runnable.run} method with the accumulated arguments to process. - * - * @param args - * accumulated arguments to process. - */ - protected abstract void run(List args); - - /** - * Sends this {@code Runnable} for the execution - * - *

- * This method is to be executed only from {@code add} method. - * - *

- * This implementation uses {@code SwingWorker.invokeLater}. - */ - protected void submit() { - SwingUtilities.invokeLater(this); - } -} diff --git a/src/com/github/xsavikx/android/screencast/ui/worker/SwingWorker.java b/src/com/github/xsavikx/android/screencast/ui/worker/SwingWorker.java deleted file mode 100644 index 1260698..0000000 --- a/src/com/github/xsavikx/android/screencast/ui/worker/SwingWorker.java +++ /dev/null @@ -1,829 +0,0 @@ -/* - * $Id: SwingWorker.java,v 1.6 2008/07/25 19:32:29 idk Exp $ - * - * Copyright @ 2005 Sun Microsystems, Inc. All rights - * reserved. Use is subject to license terms. - */ - -package com.github.xsavikx.android.screencast.ui.worker; - -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.beans.PropertyChangeEvent; -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeSupport; -import java.util.List; -import java.util.concurrent.Callable; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Future; -import java.util.concurrent.FutureTask; -import java.util.concurrent.LinkedBlockingQueue; -import java.util.concurrent.ThreadFactory; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.locks.Condition; -import java.util.concurrent.locks.ReentrantLock; - -import javax.swing.SwingUtilities; -import javax.swing.Timer; - -/** - * An abstract class to perform lengthy GUI-interacting tasks in a dedicated thread. - * - *

- * When writing a multi-threaded application using Swing, there are two constraints to keep in mind: (refer to - * How to Use Threads for more details): - *

    - *
  • Time-consuming tasks should not be run on the Event Dispatch Thread. Otherwise the application becomes unresponsive.
  • - *
  • Swing components should be accessed on the Event Dispatch Thread only.
  • - *
- * - *

- * - *

- * These constraints mean that a GUI application with time intensive computing needs at least two threads: 1) a thread to perform the lengthy task and - * 2) the Event Dispatch Thread (EDT) for all GUI-related activities. This involves inter-thread communication which can be tricky to - * implement. - * - *

- * {@code SwingWorker} is designed for situations where you need to have a long running task run in a background thread and provide updates to the UI - * either when done, or while processing. Subclasses of {@code SwingWorker} must implement the {@see #doInBackground} method to perform the background - * computation. - * - * - *

- * Workflow - *

- * There are three threads involved in the life cycle of a {@code SwingWorker} : - *

    - *
  • - *

    - * Current thread: The {@link #execute} method is called on this thread. It schedules {@code SwingWorker} for the execution on a worker - * thread and returns immediately. One can wait for the {@code SwingWorker} to complete using the {@link #get get} methods. - *

  • - *

    - * Worker thread: The {@link #doInBackground} method is called on this thread. This is where all background activities should happen. To notify - * {@code PropertyChangeListeners} about bound properties changes use the {@link #firePropertyChange firePropertyChange} and - * {@link #getPropertyChangeSupport} methods. By default there are two bound properties available: {@code state} and {@code progress}. - *

  • - *

    - * Event Dispatch Thread: All Swing related activities occur on this thread. {@code SwingWorker} invokes the {@link #process process} and - * {@link #done} methods and notifies any {@code PropertyChangeListeners} on this thread. - *

- * - *

- * Often, the Current thread is the Event Dispatch Thread. - * - * - *

- * Before the {@code doInBackground} method is invoked on a worker thread, {@code SwingWorker} notifies any {@code PropertyChangeListeners} - * about the {@code state} property change to {@code StateValue.STARTED}. After the {@code doInBackground} method is finished the {@code done} method - * is executed. Then {@code SwingWorker} notifies any {@code PropertyChangeListeners} about the {@code state} property change to - * {@code StateValue.DONE}. - * - *

- * {@code SwingWorker} is only designed to be executed once. Executing a {@code SwingWorker} more than once will not result in invoking the - * {@code doInBackground} method twice. - * - *

- * Sample Usage - *

- * The following example illustrates the simplest use case. Some processing is done in the background and when done you update a Swing component. - * - *

- * Say we want to find the "Meaning of Life" and display the result in a {@code JLabel}. - * - *

- *   final JLabel label;
- *   class MeaningOfLifeFinder extends SwingWorker<String, Object> {
- *       {@code @Override}
- *       public String doInBackground() {
- *           return findTheMeaningOfLife();
- *       }
- * 
- *       {@code @Override}
- *       protected void done() {
- *           try { 
- *               label.setText(get());
- *           } catch (Exception ignore) {
- *           }
- *       }
- *   }
- * 
- *   (new MeaningOfLifeFinder()).execute();
- * 
- * - *

- * The next example is useful in situations where you wish to process data as it is ready on the Event Dispatch Thread. - * - *

- * Now we want to find the first N prime numbers and display the results in a {@code JTextArea}. While this is computing, we want to update our - * progress in a {@code JProgressBar}. Finally, we also want to print the prime numbers to {@code System.out}. - * - *

- * class PrimeNumbersTask extends 
- *         SwingWorker<List<Integer>, Integer> {
- *     PrimeNumbersTask(JTextArea textArea, int numbersToFind) { 
- *         //initialize 
- *     }
- * 
- *     {@code @Override}
- *     public List<Integer> doInBackground() {
- *         while (! enough && ! isCancelled()) {
- *                 number = nextPrimeNumber();
- *                 publish(number);
- *                 setProgress(100 * numbers.size() / numbersToFind);
- *             }
- *         }
- *         return numbers;
- *     }
- * 
- *     {@code @Override}
- *     protected void process(List<Integer> chunks) { 
- *         for (int number : chunks) {
- *             textArea.append(number + "\n");
- *         }
- *     }
- * }
- * 
- * JTextArea textArea = new JTextArea();
- * final JProgressBar progressBar = new JProgressBar(0, 100);
- * PrimeNumbersTask task = new PrimeNumbersTask(textArea, N);
- * task.addPropertyChangeListener(
- *     new PropertyChangeListener() {
- *         public  void propertyChange(PropertyChangeEvent evt) {
- *             if ("progress".equals(evt.getPropertyName())) {
- *                 progressBar.setValue((Integer)evt.getNewValue());
- *             }
- *         }
- *     });
- * 
- * task.execute();
- * System.out.println(task.get()); //prints all prime numbers we have got
- * 
- * - *

- * Because {@code SwingWorker} implements {@code Runnable}, a {@code SwingWorker} can be submitted to an {@link java.util.concurrent.Executor} for - * execution. - * - * @author Igor Kushnirskiy - * @version $Revision: 1.6 $ $Date: 2008/07/25 19:32:29 $ - * - * @param - * the result type returned by this {@code SwingWorker's} {@code doInBackground} and {@code get} methods - * @param - * the type used for carrying out intermediate results by this {@code SwingWorker's} {@code publish} and {@code process} methods - * - */ -public abstract class SwingWorker implements Future, Runnable { - private static class DoSubmitAccumulativeRunnable extends AccumulativeRunnableimplements ActionListener { - private final static int DELAY = 1000 / 30; - - @Override - public void actionPerformed(ActionEvent event) { - run(); - } - - @Override - protected void run(List args) { - int i = 0; - try { - for (Runnable runnable : args) { - i++; - runnable.run(); - } - } finally { - if (i < args.size()) { - /* - * there was an exception schedule all the unhandled items for the next time - */ - Runnable argsTail[] = new Runnable[args.size() - i]; - for (int j = 0; j < argsTail.length; j++) { - argsTail[j] = args.get(i + j); - } - add(true, argsTail); - } - } - } - - @Override - protected void submit() { - Timer timer = new Timer(DELAY, this); - timer.setRepeats(false); - timer.start(); - } - } - - /** - * Values for the {@code state} bound property. - */ - public enum StateValue { - /** - * Initial {@code SwingWorker} state. - */ - PENDING, /** - * {@code SwingWorker} is {@code STARTED} before invoking {@code doInBackground}. - */ - STARTED, - - /** - * {@code SwingWorker} is {@code DONE} after {@code doInBackground} method is finished. - */ - DONE - } - - private class SwingWorkerPropertyChangeSupport extends PropertyChangeSupport { - private static final long serialVersionUID = 2409754725172747617L; - - SwingWorkerPropertyChangeSupport(Object source) { - super(source); - } - - @Override - public void firePropertyChange(final PropertyChangeEvent evt) { - if (SwingUtilities.isEventDispatchThread()) { - super.firePropertyChange(evt); - } else { - doSubmit.add(new Runnable() { - @Override - public void run() { - SwingWorkerPropertyChangeSupport.this.firePropertyChange(evt); - } - }); - } - } - } - - /** - * returns workersExecutorService. - * - * returns the service stored in the appContext or creates it if necessary. If the last one it triggers autoShutdown thread to get started. - * - * @return ExecutorService for the {@code SwingWorkers} - * @see #startAutoShutdownThread - */ - private static synchronized ExecutorService getWorkersExecutorService() { - if (executorService == null) { - // this creates non-daemon threads. - ThreadFactory threadFactory = new ThreadFactory() { - final AtomicInteger threadNumber = new AtomicInteger(1); - - @Override - public Thread newThread(final Runnable r) { - StringBuilder name = new StringBuilder("SwingWorker-pool-"); - name.append(System.identityHashCode(this)); - name.append("-thread-"); - name.append(threadNumber.getAndIncrement()); - - Thread t = new Thread(r, name.toString()); - ; - if (t.isDaemon()) - t.setDaemon(false); - if (t.getPriority() != Thread.NORM_PRIORITY) - t.setPriority(Thread.NORM_PRIORITY); - return t; - } - }; - - /* - * We want a to have no more than MAX_WORKER_THREADS running threads. - * - * We want a worker thread to wait no longer than 1 second for new tasks before terminating. - */ - executorService = new ThreadPoolExecutor(0, MAX_WORKER_THREADS, 5L, TimeUnit.SECONDS, - new LinkedBlockingQueue(), threadFactory) { - - private final ReentrantLock pauseLock = new ReentrantLock(); - private final Condition unpaused = pauseLock.newCondition(); - private boolean isPaused = false; - private final ReentrantLock executeLock = new ReentrantLock(); - - @Override - protected void afterExecute(Runnable r, Throwable t) { - super.afterExecute(r, t); - pauseLock.lock(); - try { - while (isPaused) { - unpaused.await(); - } - } catch (InterruptedException ignore) { - - } finally { - pauseLock.unlock(); - } - } - - @Override - public void execute(Runnable command) { - /* - * ThreadPoolExecutor first tries to run task in a corePool. If all threads are busy it tries to add task to the waiting queue. If it fails - * it run task in maximumPool. - * - * We want corePool to be 0 and maximumPool to be MAX_WORKER_THREADS We need to change the order of the execution. First try corePool then - * try maximumPool pool and only then store to the waiting queue. We can not do that because we would need access to the private methods. - * - * Instead we enlarge corePool to MAX_WORKER_THREADS before the execution and shrink it back to 0 after. It does pretty much what we need. - * - * While we changing the corePoolSize we need to stop running worker threads from accepting new tasks. - */ - - // we need atomicity for the execute method. - executeLock.lock(); - try { - - pauseLock.lock(); - try { - isPaused = true; - } finally { - pauseLock.unlock(); - } - - setCorePoolSize(MAX_WORKER_THREADS); - super.execute(command); - setCorePoolSize(0); - - pauseLock.lock(); - try { - isPaused = false; - unpaused.signalAll(); - } finally { - pauseLock.unlock(); - } - } finally { - executeLock.unlock(); - } - } - }; - } - return executorService; - } - - /** - * number of worker threads. - */ - private static final int MAX_WORKER_THREADS = 10; - - /** - * current progress. - */ - private volatile int progress; - - /** - * current state. - */ - private volatile StateValue state; - - /** - * everything is run inside this FutureTask. Also it is used as a delegatee for the Future API. - */ - private final FutureTask future; - - /** - * all propertyChangeSupport goes through this. - */ - private final PropertyChangeSupport propertyChangeSupport; - - /** - * handler for {@code process} method. - */ - private AccumulativeRunnable doProcess;; - - /** - * handler for progress property change notifications. - */ - private AccumulativeRunnable doNotifyProgressChange; - - private static final AccumulativeRunnable doSubmit = new DoSubmitAccumulativeRunnable(); - - private static ExecutorService executorService = null; - - /** - * Constructs this {@code SwingWorker}. - */ - public SwingWorker() { - Callable callable = new Callable() { - @Override - public T call() throws Exception { - setState(StateValue.STARTED); - return doInBackground(); - } - }; - - future = new FutureTask(callable) { - @Override - protected void done() { - doneEDT(); - setState(StateValue.DONE); - } - }; - - state = StateValue.PENDING; - propertyChangeSupport = new SwingWorkerPropertyChangeSupport(this); - doProcess = null; - doNotifyProgressChange = null; - } - - // PropertyChangeSupports methods START - /** - * Adds a {@code PropertyChangeListener} to the listener list. The listener is registered for all properties. The same listener object may be added - * more than once, and will be called as many times as it is added. If {@code listener} is {@code null}, no exception is thrown and no action is - * taken. - * - *

- * Note: This is merely a convenience wrapper. All work is delegated to {@code PropertyChangeSupport} from {@link #getPropertyChangeSupport}. - * - * @param listener - * the {@code PropertyChangeListener} to be added - */ - public final void addPropertyChangeListener(PropertyChangeListener listener) { - getPropertyChangeSupport().addPropertyChangeListener(listener); - } - - // Future methods START - /** - * {@inheritDoc} - */ - @Override - public final boolean cancel(boolean mayInterruptIfRunning) { - return future.cancel(mayInterruptIfRunning); - } - - /** - * Computes a result, or throws an exception if unable to do so. - * - *

- * Note that this method is executed only once. - * - *

- * Note: this method is executed in a background thread. - * - * - * @return the computed result - * @throws Exception - * if unable to compute a result - * - */ - protected abstract T doInBackground() throws Exception; - - /** - * Executed on the Event Dispatch Thread after the {@code doInBackground} method is finished. The default implementation does nothing. - * Subclasses may override this method to perform completion actions on the Event Dispatch Thread. Note that you can query status inside the - * implementation of this method to determine the result of this task or whether this task has been cancelled. - * - * @see #doInBackground - * @see #isCancelled() - * @see #get - */ - protected void done() { - } - - /** - * Invokes {@code done} on the EDT. - */ - private void doneEDT() { - Runnable doDone = new Runnable() { - @Override - public void run() { - done(); - } - }; - if (SwingUtilities.isEventDispatchThread()) { - doDone.run(); - } else { - doSubmit.add(doDone); - } - } - - /** - * Schedules this {@code SwingWorker} for execution on a worker thread. There are a number of worker threads available. In the event - * all worker threads are busy handling other {@code SwingWorkers} this {@code SwingWorker} is placed in a waiting queue. - * - *

- * Note: {@code SwingWorker} is only designed to be executed once. Executing a {@code SwingWorker} more than once will not result in invoking the - * {@code doInBackground} method twice. - */ - public final void execute() { - getWorkersExecutorService().execute(this); - } - - /** - * Reports a bound property update to any registered listeners. No event is fired if {@code old} and {@code new} are equal and non-null. - * - *

- * This {@code SwingWorker} will be the source for any generated events. - * - *

- * When called off the Event Dispatch Thread {@code PropertyChangeListeners} are notified asynchronously on the Event Dispatch Thread. - *

- * Note: This is merely a convenience wrapper. All work is delegated to {@code PropertyChangeSupport} from {@link #getPropertyChangeSupport}. - * - * - * @param propertyName - * the programmatic name of the property that was changed - * @param oldValue - * the old value of the property - * @param newValue - * the new value of the property - */ - public final void firePropertyChange(String propertyName, Object oldValue, Object newValue) { - getPropertyChangeSupport().firePropertyChange(propertyName, oldValue, newValue); - } - - /** - * {@inheritDoc} - *

- * Note: calling {@code get} on the Event Dispatch Thread blocks all events, including repaints, from being processed until this - * {@code SwingWorker} is complete. - * - *

- * When you want the {@code SwingWorker} to block on the Event Dispatch Thread we recommend that you use a modal dialog. - * - *

- * For example: - * - *

-   * class SwingWorkerCompletionWaiter implements PropertyChangeListener {
-   *   private JDialog dialog;
-   * 
-   *   public SwingWorkerCompletionWaiter(JDialog dialog) {
-   *     this.dialog = dialog;
-   *   }
-   * 
-   *   public void propertyChange(PropertyChangeEvent event) {
-   *     if ("state".equals(event.getPropertyName()) && SwingWorker.StateValue.DONE == event.getNewValue()) {
-   *       dialog.setVisible(false);
-   *       dialog.dispose();
-   *     }
-   *   }
-   * }
-   * JDialog dialog = new JDialog(owner, true);
-   * swingWorker.addPropertyChangeListener(new SwingWorkerCompletionWaiter(dialog));
-   * swingWorker.execute();
-   * // the dialog will be visible until the SwingWorker is done
-   * dialog.setVisible(true);
-   * 
- */ - @Override - public final T get() throws InterruptedException, ExecutionException { - return future.get(); - } - - /** - * {@inheritDoc} - *

- * Please refer to {@link #get} for more details. - */ - @Override - public final T get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { - return future.get(timeout, unit); - } - - /** - * Returns the {@code progress} bound property. - * - * @return the progress bound property. - */ - public final int getProgress() { - return progress; - } - - // Future methods END - - /** - * Returns the {@code PropertyChangeSupport} for this {@code SwingWorker}. This method is used when flexible access to bound properties support is - * needed. - *

- * This {@code SwingWorker} will be the source for any generated events. - * - *

- * Note: The returned {@code PropertyChangeSupport} notifies any {@code PropertyChangeListener}s asynchronously on the Event Dispatch Thread - * in the event that {@code firePropertyChange} or {@code fireIndexedPropertyChange} are called off the Event Dispatch Thread. - * - * @return {@code PropertyChangeSupport} for this {@code SwingWorker} - */ - public final PropertyChangeSupport getPropertyChangeSupport() { - return propertyChangeSupport; - } - - /** - * Returns the {@code SwingWorker} state bound property. - * - * @return the current state - */ - public final StateValue getState() { - /* - * DONE is a special case to keep getState and isDone is sync - */ - if (isDone()) { - return StateValue.DONE; - } else { - return state; - } - } - - /** - * {@inheritDoc} - */ - @Override - public final boolean isCancelled() { - return future.isCancelled(); - } - - /** - * {@inheritDoc} - */ - @Override - public final boolean isDone() { - return future.isDone(); - } - - // PropertyChangeSupports methods END - - /** - * Receives data chunks from the {@code publish} method asynchronously on the Event Dispatch Thread. - * - *

- * Please refer to the {@link #publish} method for more details. - * - * @param chunks - * intermediate results to process - * - * @see #publish - * - */ - protected void process(List chunks) { - } - - /** - * Sends data chunks to the {@link #process} method. This method is to be used from inside the {@code doInBackground} method to deliver intermediate - * results for processing on the Event Dispatch Thread inside the {@code process} method. - * - *

- * Because the {@code process} method is invoked asynchronously on the Event Dispatch Thread multiple invocations to the {@code publish} - * method might occur before the {@code process} method is executed. For performance purposes all these invocations are coalesced into one - * invocation with concatenated arguments. - * - *

- * For example: - * - *

-   * publish("1");
-   * publish("2", "3");
-   * publish("4", "5", "6");
-   * 
- * - * might result in: - * - *
-   * process("1", "2", "3", "4", "5", "6")
-   * 
- * - *

- * Sample Usage. This code snippet loads some tabular data and updates {@code DefaultTableModel} with it. Note that it safe to mutate the - * tableModel from inside the {@code process} method because it is invoked on the Event Dispatch Thread. - * - *

-   * class TableSwingWorker extends 
-   *         SwingWorker<DefaultTableModel, Object[]> {
-   *     private final DefaultTableModel tableModel;
-   * 
-   *     public TableSwingWorker(DefaultTableModel tableModel) {
-   *         this.tableModel = tableModel;
-   *     }
-   * 
-   *     {@code @Override}
-   *     protected DefaultTableModel doInBackground() throws Exception {
-   *         for (Object[] row = loadData(); 
-   *                  ! isCancelled() && row != null; 
-   *                  row = loadData()) {
-   *             publish((Object[]) row);
-   *         }
-   *         return tableModel;
-   *     }
-   * 
-   *     {@code @Override}
-   *     protected void process(List<Object[]> chunks) {
-   *         for (Object[] row : chunks) {
-   *             tableModel.addRow(row);
-   *         }
-   *     }
-   * }
-   * 
- * - * @param chunks - * intermediate results to process - * - * @see #process - * - */ - protected final void publish(V... chunks) { - synchronized (this) { - if (doProcess == null) { - doProcess = new AccumulativeRunnable() { - @Override - public void run(List args) { - process(args); - } - - @Override - protected void submit() { - doSubmit.add(this); - } - }; - } - } - doProcess.add(chunks); - } - - /** - * Removes a {@code PropertyChangeListener} from the listener list. This removes a {@code PropertyChangeListener} that was registered for all - * properties. If {@code listener} was added more than once to the same event source, it will be notified one less time after being removed. If - * {@code listener} is {@code null}, or was never added, no exception is thrown and no action is taken. - * - *

- * Note: This is merely a convenience wrapper. All work is delegated to {@code PropertyChangeSupport} from {@link #getPropertyChangeSupport}. - * - * @param listener - * the {@code PropertyChangeListener} to be removed - */ - public final void removePropertyChangeListener(PropertyChangeListener listener) { - getPropertyChangeSupport().removePropertyChangeListener(listener); - } - - /** - * Sets this {@code Future} to the result of computation unless it has been cancelled. - */ - @Override - public final void run() { - future.run(); - } - - /** - * Sets the {@code progress} bound property. The value should be from 0 to 100. - * - *

- * Because {@code PropertyChangeListener}s are notified asynchronously on the Event Dispatch Thread multiple invocations to the - * {@code setProgress} method might occur before any {@code PropertyChangeListeners} are invoked. For performance purposes all these invocations are - * coalesced into one invocation with the last invocation argument only. - * - *

- * For example, the following invocations: - * - *

-   * setProgress(1);
-   * setProgress(2);
-   * setProgress(3);
-   * 
- * - * might result in a single {@code PropertyChangeListener} notification with the value {@code 3}. - * - * @param progress - * the progress value to set - * @throws IllegalArgumentException - * is value not from 0 to 100 - */ - protected final void setProgress(int progress) { - if (progress < 0 || progress > 100) { - throw new IllegalArgumentException("the value should be from 0 to 100"); - } - if (this.progress == progress) { - return; - } - int oldProgress = this.progress; - this.progress = progress; - if (!getPropertyChangeSupport().hasListeners("progress")) { - return; - } - synchronized (this) { - if (doNotifyProgressChange == null) { - doNotifyProgressChange = new AccumulativeRunnable() { - @Override - public void run(List args) { - firePropertyChange("progress", args.get(0), args.get(args.size() - 1)); - } - - @Override - protected void submit() { - doSubmit.add(this); - } - }; - } - } - doNotifyProgressChange.add(oldProgress, progress); - } - - /** - * Sets this {@code SwingWorker} state bound property. - * - * @param the - * state state to set - */ - private void setState(StateValue state) { - StateValue old = this.state; - this.state = state; - firePropertyChange("state", old, state); - } -} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/Main.java b/src/main/java/com/github/xsavikx/androidscreencast/Main.java new file mode 100644 index 0000000..6b8477a --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/Main.java @@ -0,0 +1,23 @@ +package com.github.xsavikx.androidscreencast; + +import com.github.xsavikx.androidscreencast.app.AndroidScreencastApplication; +import com.github.xsavikx.androidscreencast.app.Application; +import com.github.xsavikx.androidscreencast.spring.config.ApplicationContextProvider; +import org.apache.log4j.Logger; + +import java.util.Arrays; + +public class Main { + private static final Logger LOGGER = Logger.getLogger(Main.class); + + public static void main(String args[]) { + LOGGER.debug("main(String[] args=" + Arrays.toString(args) + ") - start"); + Application application = ApplicationContextProvider.getApplicationContext() + .getBean(AndroidScreencastApplication.class); + application.init(); + application.start(); + + LOGGER.debug("main(String[] args=" + Arrays.toString(args) + ") - end"); + } + +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/api/AndroidDevice.java b/src/main/java/com/github/xsavikx/androidscreencast/api/AndroidDevice.java new file mode 100644 index 0000000..8fb1ab2 --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/api/AndroidDevice.java @@ -0,0 +1,18 @@ +package com.github.xsavikx.androidscreencast.api; + +import com.github.xsavikx.androidscreencast.api.file.FileInfo; + +import java.io.File; +import java.util.List; + +public interface AndroidDevice { + String executeCommand(String command); + + List list(String path); + + void openUrl(String url); + + void pullFile(String remoteFrom, File localTo); + + void pushFile(File localFrom, String remoteTo); +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/api/AndroidDeviceImpl.java b/src/main/java/com/github/xsavikx/androidscreencast/api/AndroidDeviceImpl.java new file mode 100644 index 0000000..b283333 --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/api/AndroidDeviceImpl.java @@ -0,0 +1,157 @@ +package com.github.xsavikx.androidscreencast.api; + +import com.android.ddmlib.IDevice; +import com.android.ddmlib.SyncService; +import com.android.ddmlib.SyncService.ISyncProgressMonitor; +import com.github.xsavikx.androidscreencast.api.file.FileInfo; +import com.github.xsavikx.androidscreencast.api.injector.OutputStreamShellOutputReceiver; +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.lang.reflect.Method; +import java.util.List; +import java.util.Vector; + +@Component +public class AndroidDeviceImpl implements AndroidDevice { + private static final Logger logger = Logger.getLogger(AndroidDeviceImpl.class); + @Autowired(required = false) + private IDevice device; + + public AndroidDeviceImpl() { + + } + + public AndroidDeviceImpl(IDevice device) { + this.device = device; + } + + @Override + public String executeCommand(String cmd) { + if (logger.isDebugEnabled()) { + logger.debug("executeCommand(String) - start"); + } + + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + try { + device.executeShellCommand(cmd, new OutputStreamShellOutputReceiver(bos)); + String returnString = new String(bos.toByteArray(), "UTF-8"); + if (logger.isDebugEnabled()) { + logger.debug("executeCommand(String) - end"); + } + return returnString; + } catch (Exception ex) { + logger.error("executeCommand(String)", ex); + + throw new RuntimeException(ex); + } + } + + @Override + public List list(String path) { + if (logger.isDebugEnabled()) { + logger.debug("list(String) - start"); + } + + try { + String s = executeCommand("ls -l " + path); + String[] entries = s.split("\r\n"); + Vector liste = new Vector<>(); + for (String entry : entries) { + String[] data = entry.split(" "); + if (data.length < 4) + continue; + /* + * for(int j=0; j 0) { + stringBuilder.append(' ').append(duration); + } + return stringBuilder.toString(); + } + +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/api/command/TapCommand.java b/src/main/java/com/github/xsavikx/androidscreencast/api/command/TapCommand.java new file mode 100644 index 0000000..5a19897 --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/api/command/TapCommand.java @@ -0,0 +1,18 @@ +package com.github.xsavikx.androidscreencast.api.command; + +public class TapCommand extends InputCommand { + private int x; + private int y; + + public TapCommand(int x, int y) { + this.x = x; + this.y = y; + } + + @Override + protected String getCommandPart() { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("tap ").append(x).append(' ').append(y); + return stringBuilder.toString(); + } +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/api/command/exception/AdbShellCommandExecutionException.java b/src/main/java/com/github/xsavikx/androidscreencast/api/command/exception/AdbShellCommandExecutionException.java new file mode 100644 index 0000000..b19d6b6 --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/api/command/exception/AdbShellCommandExecutionException.java @@ -0,0 +1,14 @@ +package com.github.xsavikx.androidscreencast.api.command.exception; + +import com.github.xsavikx.androidscreencast.api.command.Command; + +public class AdbShellCommandExecutionException extends CommandExecutionException { + private static final String ERROR_MESSAGE = "Error while executing command: %s"; + + private static final long serialVersionUID = -503890452151627952L; + + public AdbShellCommandExecutionException(Command command, Throwable cause) { + super(String.format(ERROR_MESSAGE, command.getFormattedCommand()), cause); + } + +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/api/command/exception/CommandExecutionException.java b/src/main/java/com/github/xsavikx/androidscreencast/api/command/exception/CommandExecutionException.java new file mode 100644 index 0000000..7eab12c --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/api/command/exception/CommandExecutionException.java @@ -0,0 +1,28 @@ +package com.github.xsavikx.androidscreencast.api.command.exception; + +public class CommandExecutionException extends RuntimeException { + + private static final long serialVersionUID = 8676432388325401069L; + + public CommandExecutionException() { + super(); + } + + public CommandExecutionException(String message, Throwable cause, boolean enableSuppression, + boolean writableStackTrace) { + super(message, cause, enableSuppression, writableStackTrace); + } + + public CommandExecutionException(String message, Throwable cause) { + super(message, cause); + } + + public CommandExecutionException(String message) { + super(message); + } + + public CommandExecutionException(Throwable cause) { + super(cause); + } + +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/api/command/executor/CommandExecutor.java b/src/main/java/com/github/xsavikx/androidscreencast/api/command/executor/CommandExecutor.java new file mode 100644 index 0000000..742521c --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/api/command/executor/CommandExecutor.java @@ -0,0 +1,7 @@ +package com.github.xsavikx.androidscreencast.api.command.executor; + +import com.github.xsavikx.androidscreencast.api.command.Command; + +public interface CommandExecutor { + void execute(Command command); +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/api/command/executor/ShellCommandExecutor.java b/src/main/java/com/github/xsavikx/androidscreencast/api/command/executor/ShellCommandExecutor.java new file mode 100644 index 0000000..3cbac0e --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/api/command/executor/ShellCommandExecutor.java @@ -0,0 +1,39 @@ +package com.github.xsavikx.androidscreencast.api.command.executor; + +import com.android.ddmlib.AdbCommandRejectedException; +import com.android.ddmlib.IDevice; +import com.android.ddmlib.ShellCommandUnresponsiveException; +import com.android.ddmlib.TimeoutException; +import com.github.xsavikx.androidscreencast.api.command.Command; +import com.github.xsavikx.androidscreencast.api.command.exception.AdbShellCommandExecutionException; +import com.github.xsavikx.androidscreencast.api.injector.MultiLineReceiverPrinter; +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +@Service +public class ShellCommandExecutor implements CommandExecutor { + private static final Logger LOGGER = Logger.getLogger(ShellCommandExecutor.class); + private static final int MAX_TIME_TO_WAIT_RESPONSE = 5; + @Autowired + private IDevice device; + + @Override + public void execute(Command command) { + LOGGER.debug("execute(Command command=" + command + ") - start"); + + try { + device.executeShellCommand(command.getFormattedCommand(), new MultiLineReceiverPrinter(), + MAX_TIME_TO_WAIT_RESPONSE, TimeUnit.SECONDS); + } catch (TimeoutException | AdbCommandRejectedException | ShellCommandUnresponsiveException | IOException e) { + LOGGER.error("execute(Command)", e); + throw new AdbShellCommandExecutionException(command, e); + } + + LOGGER.debug("execute(Command command=" + command + ") - end"); + } + +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/api/command/factory/AdbInputCommandFactory.java b/src/main/java/com/github/xsavikx/androidscreencast/api/command/factory/AdbInputCommandFactory.java new file mode 100644 index 0000000..6682e3c --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/api/command/factory/AdbInputCommandFactory.java @@ -0,0 +1,56 @@ +package com.github.xsavikx.androidscreencast.api.command.factory; + +import com.github.xsavikx.androidscreencast.api.command.KeyCommand; +import com.github.xsavikx.androidscreencast.api.command.SwipeCommand; +import com.github.xsavikx.androidscreencast.api.command.TapCommand; +import com.github.xsavikx.androidscreencast.api.injector.InputKeyEvent; +import org.apache.log4j.Logger; +import org.springframework.stereotype.Service; + +@Service +public final class AdbInputCommandFactory { + private static final Logger LOGGER = Logger.getLogger(AdbInputCommandFactory.class); + + public static KeyCommand getKeyCommand(int keyCode) { + KeyCommand returnKeyCommand = new KeyCommand(keyCode); + LOGGER.debug(returnKeyCommand); + return returnKeyCommand; + } + + public static KeyCommand getKeyCommand(InputKeyEvent inputKeyEvent) { + KeyCommand returnKeyCommand = new KeyCommand(inputKeyEvent); + LOGGER.debug(returnKeyCommand); + return returnKeyCommand; + } + + + public static KeyCommand getKeyCommand(int keyCode, boolean longpress) { + KeyCommand returnKeyCommand = new KeyCommand(keyCode, longpress); + LOGGER.debug(returnKeyCommand); + return returnKeyCommand; + } + + public static KeyCommand getKeyCommand(InputKeyEvent inputKeyEvent, boolean longpress) { + KeyCommand returnKeyCommand = new KeyCommand(inputKeyEvent, longpress); + LOGGER.debug(returnKeyCommand); + return returnKeyCommand; + } + + public static SwipeCommand getSwipeCommand(int x1, int y1, int x2, int y2, long duration) { + SwipeCommand returnSwipeCommand = new SwipeCommand(x1, y1, x2, y2, duration); + LOGGER.debug(returnSwipeCommand); + return returnSwipeCommand; + } + + public static SwipeCommand getSwipeCommand(int x1, int y1, int x2, int y2) { + SwipeCommand returnSwipeCommand = new SwipeCommand(x1, y1, x2, y2); + LOGGER.debug(returnSwipeCommand); + return returnSwipeCommand; + } + + public static TapCommand getTapCommand(int x, int y) { + TapCommand returnTapCommand = new TapCommand(x, y); + LOGGER.debug(returnTapCommand); + return returnTapCommand; + } +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/api/file/FileInfo.java b/src/main/java/com/github/xsavikx/androidscreencast/api/file/FileInfo.java new file mode 100644 index 0000000..ce9c284 --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/api/file/FileInfo.java @@ -0,0 +1,32 @@ +package com.github.xsavikx.androidscreencast.api.file; + +import com.github.xsavikx.androidscreencast.api.AndroidDeviceImpl; +import org.springframework.stereotype.Component; + +import java.io.File; + +@Component +public class FileInfo { + public AndroidDeviceImpl device; + public String path; + public String attribs; + public boolean directory; + public String name; + + public File downloadTemporary() { + try { + File tempFile = File.createTempFile("android", name); + device.pullFile(path + name, tempFile); + tempFile.deleteOnExit(); + return tempFile; + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } + + @Override + public String toString() { + return name; + } + +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/api/injector/Injector.java b/src/main/java/com/github/xsavikx/androidscreencast/api/injector/Injector.java new file mode 100644 index 0000000..2b6a62e --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/api/injector/Injector.java @@ -0,0 +1,38 @@ +package com.github.xsavikx.androidscreencast.api.injector; + +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class Injector { + private static final Logger LOGGER = Logger.getLogger(Injector.class); + @Autowired + public ScreenCaptureThread screencapture; + + public void restart() { + LOGGER.debug("restart() - start"); + + close(); + start(); + + LOGGER.debug("restart() - end"); + } + + public void close() { + LOGGER.debug("close() - start"); + + screencapture.interrupt(); + + LOGGER.debug("close() - end"); + } + + public void start() { + LOGGER.debug("start() - start"); + + screencapture.start(); + + LOGGER.debug("start() - end"); + } + +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/api/injector/InputKeyEvent.java b/src/main/java/com/github/xsavikx/androidscreencast/api/injector/InputKeyEvent.java new file mode 100644 index 0000000..d7fbc8e --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/api/injector/InputKeyEvent.java @@ -0,0 +1,355 @@ +//@formatter:off +package com.github.xsavikx.androidscreencast.api.injector; + +import javax.annotation.Resource; +import java.awt.event.KeyEvent; +import java.util.EnumSet; +import java.util.Set; + +@Resource +public enum InputKeyEvent { + KEYCODE_UNKNOWN(0, "Key code constant: Unknown key code."), + KEYCODE_SOFT_LEFT(1, "Key code constant: Soft Left key. Usually situated below the display on phones and used as a multi-function feature key for selecting a software defined function shown on the bottom left of the display."), + KEYCODE_SOFT_RIGHT(2, "Key code constant: Soft Right key. Usually situated below the display on phones and used as a multi-function feature key for selecting a software defined function shown on the bottom right of the display."), + KEYCODE_HOME(3, "Key code constant: Home key. This key is handled by the framework and is never delivered to applications.", KeyEvent.VK_HOME), + KEYCODE_BACK(4, "Key code constant: Back key. ", KeyEvent.VK_ESCAPE), + KEYCODE_CALL(5, "Key code constant: Call key. "), + KEYCODE_ENDCALL(6, "Key code constant: End Call key. "), + KEYCODE_0(7, "Key code constant: '0' key. ", '0'), + KEYCODE_1(8, "Key code constant: '1' key. ", '1'), + KEYCODE_2(9, "Key code constant: '2' key. ", '2'), + KEYCODE_3(10, "Key code constant: '3' key. ", '3'), + KEYCODE_4(11, "Key code constant: '4' key. ", '4'), + KEYCODE_5(12, "Key code constant: '5' key. ", '5'), + KEYCODE_6(13, "Key code constant: '6' key. ", '6'), + KEYCODE_7(14, "Key code constant: '7' key. ", '7'), + KEYCODE_8(15, "Key code constant: '8' key. ", '8'), + KEYCODE_9(16, "Key code constant: '9' key. ", '9'), + KEYCODE_STAR(17, "Key code constant: '*' key. ", '*'), + KEYCODE_POUND(18, "Key code constant: '#' key. ", '#'), + KEYCODE_DPAD_UP(19, "Key code constant: Directional Pad Up key. May also be synthesized from trackball motions.", KeyEvent.VK_UP), + KEYCODE_DPAD_DOWN(20, "Key code constant: Directional Pad Down key. May also be synthesized from trackball motions.", KeyEvent.VK_DOWN), + KEYCODE_DPAD_LEFT(21, "Key code constant: Directional Pad Left key. May also be synthesized from trackball motions.", KeyEvent.VK_LEFT), + KEYCODE_DPAD_RIGHT(22, "Key code constant: Directional Pad Right key. May also be synthesized from trackball motions.", KeyEvent.VK_RIGHT), + KEYCODE_DPAD_CENTER(23, "Key code constant: Directional Pad Center key. May also be synthesized from trackball motions."), + KEYCODE_VOLUME_UP(24, "Key code constant: Volume Up key. Adjusts the speaker volume up."), + KEYCODE_VOLUME_DOWN(25, "Key code constant: Volume Down key. Adjusts the speaker volume down."), + KEYCODE_POWER(26, "Key code constant: Power key. "), + KEYCODE_CAMERA(27, "Key code constant: Camera key. Used to launch a camera application or take pictures."), + KEYCODE_CLEAR(28, "Key code constant: Clear key. "), + KEYCODE_A(29, "Key code constant: 'A' key. ", 'a'), + KEYCODE_B(30, "Key code constant: 'B' key. ", 'b'), + KEYCODE_C(31, "Key code constant: 'C' key. ", 'c'), + KEYCODE_D(32, "Key code constant: 'D' key. ", 'd'), + KEYCODE_E(33, "Key code constant: 'E' key. ", 'e'), + KEYCODE_F(34, "Key code constant: 'F' key. ", 'f'), + KEYCODE_G(35, "Key code constant: 'G' key. ", 'g'), + KEYCODE_H(36, "Key code constant: 'H' key. ", 'h'), + KEYCODE_I(37, "Key code constant: 'I' key. ", 'i'), + KEYCODE_J(38, "Key code constant: 'J' key. ", 'j'), + KEYCODE_K(39, "Key code constant: 'K' key. ", 'k'), + KEYCODE_L(40, "Key code constant: 'L' key. ", 'l'), + KEYCODE_M(41, "Key code constant: 'M' key. ", 'm'), + KEYCODE_N(42, "Key code constant: 'N' key. ", 'n'), + KEYCODE_O(43, "Key code constant: 'O' key. ", 'o'), + KEYCODE_P(44, "Key code constant: 'P' key. ", 'p'), + KEYCODE_Q(45, "Key code constant: 'Q' key. ", 'q'), + KEYCODE_R(46, "Key code constant: 'R' key. ", 'r'), + KEYCODE_S(47, "Key code constant: 'S' key. ", 's'), + KEYCODE_T(48, "Key code constant: 'T' key. ", 't'), + KEYCODE_U(49, "Key code constant: 'U' key. ", 'u'), + KEYCODE_V(50, "Key code constant: 'V' key. ", 'v'), + KEYCODE_W(51, "Key code constant: 'W' key. ", 'w'), + KEYCODE_X(52, "Key code constant: 'X' key. ", 'x'), + KEYCODE_Y(53, "Key code constant: 'Y' key. ", 'y'), + KEYCODE_Z(54, "Key code constant: 'Z' key. ", 'z'), + KEYCODE_COMMA(55, "Key code constant: ',' key. ", ','), + KEYCODE_PERIOD(56, "Key code constant: '.' key. ", '.'), + KEYCODE_ALT_LEFT(57, "Key code constant: Left Alt modifier key. "), + KEYCODE_ALT_RIGHT(58, "Key code constant: Right Alt modifier key. "), + KEYCODE_SHIFT_LEFT(59, "Key code constant: Left Shift modifier key. "), + KEYCODE_SHIFT_RIGHT(60, "Key code constant: Right Shift modifier key. "), + KEYCODE_TAB(61, "Key code constant: Tab key. ", '\t'), + KEYCODE_SPACE(62, "Key code constant: Space key. ", ' '), + KEYCODE_SYM(63, "Key code constant: Symbol modifier key. Used to enter alternate symbols."), + KEYCODE_EXPLORER(64, "Key code constant: Explorer special function key. Used to launch a browser application."), + KEYCODE_ENVELOPE(65, "Key code constant: Envelope special function key. Used to launch a mail application."), + KEYCODE_ENTER(66, "Key code constant: Enter key. ", '\n'), + KEYCODE_DEL(67, "Key code constant: Backspace key. Deletes characters before the insertion point, unlike {@link #KEYCODE_FORWARD_DEL}.", '\b'), + KEYCODE_GRAVE(68, "Key code constant: '`' (backtick) key. ", '`'), + KEYCODE_MINUS(69, "Key code constant: '-'. ", '-'), + KEYCODE_EQUALS(70, "Key code constant: '=' key. ", '='), + KEYCODE_LEFT_BRACKET(71, "Key code constant: '[' key. ", '['), + KEYCODE_RIGHT_BRACKET(72, "Key code constant: ']' key. ", ']'), + KEYCODE_BACKSLASH(73, "Key code constant: '\' key. ", '\\'), + KEYCODE_SEMICOLON(74, "Key code constant: ';' key. ", ';'), + KEYCODE_APOSTROPHE(75, "Key code constant: ''' (apostrophe) key. ", '\''), + KEYCODE_SLASH(76, "Key code constant: '/' key. ", '/'), + KEYCODE_AT(77, "Key code constant: '@' key. ", '@'), + KEYCODE_NUM(78, "Key code constant: Number modifier key. Used to enter numeric symbols. This key is not Num Lock; it is more like {@link #KEYCODE_ALT_LEFT} and is interpreted as an ALT key by {@link android.text.method.MetaKeyKeyListener} ."), + KEYCODE_HEADSETHOOK(79, "Key code constant: Headset Hook key. Used to hang up calls and stop media."), + KEYCODE_FOCUS(80, "Key code constant: Camera Focus key. Used to focus the camera."), // *Camera* focus + KEYCODE_PLUS(81, "Key code constant: '+' key.", '+'), + KEYCODE_MENU(82, "Key code constant: Menu key."), + KEYCODE_NOTIFICATION(83, "Key code constant: Notification key."), + KEYCODE_SEARCH(84, "Key code constant: Search key."), + KEYCODE_MEDIA_PLAY_PAUSE(85, "Key code constant: Play/Pause media key."), + KEYCODE_MEDIA_STOP(86, "Key code constant: Stop media key."), + KEYCODE_MEDIA_NEXT(87, "Key code constant: Play Next media key."), + KEYCODE_MEDIA_PREVIOUS(88, "Key code constant: Play Previous media key."), + KEYCODE_MEDIA_REWIND(89, "Key code constant: Rewind media key."), + KEYCODE_MEDIA_FAST_FORWARD(90, "Key code constant: Fast Forward media key."), + KEYCODE_MUTE(91, "Key code constant: Mute key. Mutes the microphone, unlike {@link #KEYCODE_VOLUME_MUTE}."), + KEYCODE_PAGE_UP(92, "Key code constant: Page Up key. ", KeyEvent.VK_PAGE_UP), + KEYCODE_PAGE_DOWN(93, "Key code constant: Page Down key. ", KeyEvent.VK_PAGE_DOWN), + KEYCODE_PICTSYMBOLS(94, "Key code constant: Picture Symbols modifier key. Used to switch symbol sets (Emoji, Kao-moji)."), // switch symbol-sets (Emoji,Kao-moji) + KEYCODE_SWITCH_CHARSET(95, "Key code constant: Switch Charset modifier key. Used to switch character sets (Kanji, Katakana)."), // switch char-sets (Kanji,Katakana) + KEYCODE_BUTTON_A(96, "Key code constant: A Button key. On a game controller, the A button should be either the button labeled A or the first button on the bottom row of controller buttons."), + KEYCODE_BUTTON_B(97, "Key code constant: B Button key. On a game controller, the B button should be either the button labeled B or the second button on the bottom row of controller buttons."), + KEYCODE_BUTTON_C(98, "Key code constant: C Button key. On a game controller, the C button should be either the button labeled C or the third button on the bottom row of controller buttons."), + KEYCODE_BUTTON_X(99, "Key code constant: X Button key. On a game controller, the X button should be either the button labeled X or the first button on the upper row of controller buttons."), + KEYCODE_BUTTON_Y(100, "Key code constant: Y Button key. On a game controller, the Y button should be either the button labeled Y or the second button on the upper row of controller buttons."), + KEYCODE_BUTTON_Z(101, "Key code constant: Z Button key. On a game controller, the Z button should be either the button labeled Z or the third button on the upper row of controller buttons."), + KEYCODE_BUTTON_L1(102, "Key code constant: L1 Button key. On a game controller, the L1 button should be either the button labeled L1 (or L) or the top left trigger button."), + KEYCODE_BUTTON_R1(103, "Key code constant: R1 Button key. On a game controller, the R1 button should be either the button labeled R1 (or R) or the top right trigger button."), + KEYCODE_BUTTON_L2(104, "Key code constant: L2 Button key. On a game controller, the L2 button should be either the button labeled L2 or the bottom left trigger button."), + KEYCODE_BUTTON_R2(105, "Key code constant: R2 Button key. On a game controller, the R2 button should be either the button labeled R2 or the bottom right trigger button."), + KEYCODE_BUTTON_THUMBL(106, "Key code constant: Left Thumb Button key. On a game controller, the left thumb button indicates that the left (or only) joystick is pressed."), + KEYCODE_BUTTON_THUMBR(107, "Key code constant: Right Thumb Button key. On a game controller, the right thumb button indicates that the right joystick is pressed."), + KEYCODE_BUTTON_START(108, "Key code constant: Start Button key. On a game controller, the button labeled Start."), + KEYCODE_BUTTON_SELECT(109, "Key code constant: Select Button key. On a game controller, the button labeled Select."), + KEYCODE_BUTTON_MODE(110, "Key code constant: Mode Button key. On a game controller, the button labeled Mode."), + KEYCODE_ESCAPE(111, "Key code constant: Escape key."), + KEYCODE_FORWARD_DEL(112, "Key code constant: Forward Delete key. Deletes characters ahead of the insertion point, unlike {@link #KEYCODE_DEL}."), + KEYCODE_CTRL_LEFT(113, "Key code constant: Left Control modifier key."), + KEYCODE_CTRL_RIGHT(114, "Key code constant: Right Control modifier key."), + KEYCODE_CAPS_LOCK(115, "Key code constant: Caps Lock key."), + KEYCODE_SCROLL_LOCK(116, "Key code constant: Scroll Lock key."), + KEYCODE_META_LEFT(117, "Key code constant: Left Meta modifier key."), + KEYCODE_META_RIGHT(118, "Key code constant: Right Meta modifier key."), + KEYCODE_FUNCTION(119, "Key code constant: Function modifier key."), + KEYCODE_SYSRQ(120, "Key code constant: System Request / Print Screen key.", KeyEvent.VK_PRINTSCREEN), + KEYCODE_BREAK(121, "Key code constant: Break / Pause key. ", KeyEvent.VK_PAUSE), + KEYCODE_MOVE_HOME(122, "Key code constant: Home Movement key. Used for scrolling or moving the cursor around to the start of a line or to the top of a list."), + KEYCODE_MOVE_END(123, "Key code constant: End Movement key. Used for scrolling or moving the cursor around to the end of a line or to the bottom of a list."), + KEYCODE_INSERT(124, "Key code constant: Insert key. Toggles insert / overwrite edit mode.", KeyEvent.VK_INSERT), + KEYCODE_FORWARD(125, "Key code constant: Forward key. Navigates forward in the history stack. Complement of {@link #KEYCODE_BACK}."), + KEYCODE_MEDIA_PLAY(126, "Key code constant: Play media key. "), + KEYCODE_MEDIA_PAUSE(127, "Key code constant: Pause media key. "), + KEYCODE_MEDIA_CLOSE(128, "Key code constant: Close media key. May be used to close a CD tray, for example."), + KEYCODE_MEDIA_EJECT(129, "Key code constant: Eject media key. May be used to eject a CD tray, for example."), + KEYCODE_MEDIA_RECORD(130, "Key code constant: Record media key. "), + KEYCODE_F1(131, "Key code constant: F1 key. "), + KEYCODE_F2(132, "Key code constant: F2 key. "), + KEYCODE_F3(133, "Key code constant: F3 key. "), + KEYCODE_F4(134, "Key code constant: F4 key. "), + KEYCODE_F5(135, "Key code constant: F5 key. "), + KEYCODE_F6(136, "Key code constant: F6 key. "), + KEYCODE_F7(137, "Key code constant: F7 key. "), + KEYCODE_F8(138, "Key code constant: F8 key. "), + KEYCODE_F9(139, "Key code constant: F9 key. "), + KEYCODE_F10(140, "Key code constant: F10 key. "), + KEYCODE_F11(141, "Key code constant: F11 key. "), + KEYCODE_F12(142, "Key code constant: F12 key. "), + KEYCODE_NUM_LOCK(143, "Key code constant: Num Lock key. This is the Num Lock key; it is different from {@link #KEYCODE_NUM}. This key alters the behavior of other keys on the numeric keypad."), + KEYCODE_NUMPAD_0(144, "Key code constant: Numeric keypad '0' key. "), + KEYCODE_NUMPAD_1(145, "Key code constant: Numeric keypad '1' key. "), + KEYCODE_NUMPAD_2(146, "Key code constant: Numeric keypad '2' key. "), + KEYCODE_NUMPAD_3(147, "Key code constant: Numeric keypad '3' key. "), + KEYCODE_NUMPAD_4(148, "Key code constant: Numeric keypad '4' key. "), + KEYCODE_NUMPAD_5(149, "Key code constant: Numeric keypad '5' key. "), + KEYCODE_NUMPAD_6(150, "Key code constant: Numeric keypad '6' key. "), + KEYCODE_NUMPAD_7(151, "Key code constant: Numeric keypad '7' key. "), + KEYCODE_NUMPAD_8(152, "Key code constant: Numeric keypad '8' key. "), + KEYCODE_NUMPAD_9(153, "Key code constant: Numeric keypad '9' key. "), + KEYCODE_NUMPAD_DIVIDE(154, "Key code constant: Numeric keypad '/' key (for division). "), + KEYCODE_NUMPAD_MULTIPLY(155, "Key code constant: '*' key (for multiplication). "), + KEYCODE_NUMPAD_SUBTRACT(156, "Key code constant: Numeric keypad '-' key (for subtraction). "), + KEYCODE_NUMPAD_ADD(157, "Key code constant: Numeric keypad '+' key (for addition). "), + KEYCODE_NUMPAD_DOT(158, "Key code constant: Numeric keypad '.' key (for decimals or digit grouping)."), + KEYCODE_NUMPAD_COMMA(159, "Key code constant: Numeric keypad ',' key (for decimals or digit grouping)."), + KEYCODE_NUMPAD_ENTER(160, "Key code constant: Numeric keypad Enter key. "), + KEYCODE_NUMPAD_EQUALS(161, "Key code constant: Numeric keypad '=' key. "), + KEYCODE_NUMPAD_LEFT_PAREN(162, "Key code constant: Numeric keypad '(' key. "), + KEYCODE_NUMPAD_RIGHT_PAREN(163, "Key code constant: Numeric keypad ')' key. "), + KEYCODE_VOLUME_MUTE(164, "Key code constant: Volume Mute key. Mutes the speaker, unlike {@link #KEYCODE_MUTE}. This key should normally be implemented as a toggle such that the first press mutes the speaker and the second press restores the original volume."), + KEYCODE_INFO(165, "Key code constant: Info key. Common on TV remotes to show additional information related to what is currently being viewed."), + KEYCODE_CHANNEL_UP(166, "Key code constant: Channel up key. On TV remotes, increments the television channel."), + KEYCODE_CHANNEL_DOWN(167, "Key code constant: Channel down key. On TV remotes, decrements the television channel."), + KEYCODE_ZOOM_IN(168, "Key code constant: Zoom in key. "), + KEYCODE_ZOOM_OUT(169, "Key code constant: Zoom out key. "), + KEYCODE_TV(170, "Key code constant: TV key. On TV remotes, switches to viewing live TV."), + KEYCODE_WINDOW(171, "Key code constant: Window key. On TV remotes, toggles picture-in-picture mode or other windowing functions."), + KEYCODE_GUIDE(172, "Key code constant: Guide key. On TV remotes, shows a programming guide."), + KEYCODE_DVR(173, "Key code constant: DVR key. On some TV remotes, switches to a DVR mode for recorded shows."), + KEYCODE_BOOKMARK(174, "Key code constant: Bookmark key. On some TV remotes, bookmarks content or web pages."), + KEYCODE_CAPTIONS(175, "Key code constant: Toggle captions key. Switches the mode for closed-captioning text, for example during television shows."), + KEYCODE_SETTINGS(176, "Key code constant: Settings key. Starts the system settings activity."), + KEYCODE_TV_POWER(177, "Key code constant: TV power key. On TV remotes, toggles the power on a television screen."), + KEYCODE_TV_INPUT(178, "Key code constant: TV input key. On TV remotes, switches the input on a television screen."), + KEYCODE_STB_POWER(179, "Key code constant: Set-top-box power key. On TV remotes, toggles the power on an external Set-top-box."), + KEYCODE_STB_INPUT(180, "Key code constant: Set-top-box input key. On TV remotes, switches the input mode on an external Set-top-box."), + KEYCODE_AVR_POWER(181, "Key code constant: A/V Receiver power key. On TV remotes, toggles the power on an external A/V Receiver."), + KEYCODE_AVR_INPUT(182, "Key code constant: A/V Receiver input key. On TV remotes, switches the input mode on an external A/V Receiver."), + KEYCODE_PROG_RED(183, "Key code constant: Red \"programmable\" key. On TV remotes, acts as a contextual/programmable key."), + KEYCODE_PROG_GREEN(184, "Key code constant: Green \"programmable\" key. On TV remotes, actsas a contextual/programmable key."), + KEYCODE_PROG_YELLOW(185, "Key code constant: Yellow \"programmable\" key. On TV remotes, acts as a contextual/programmable key."), + KEYCODE_PROG_BLUE(186, "Key code constant: Blue \"programmable\" key. On TV remotes, acts as a contextual/programmable key."), + KEYCODE_APP_SWITCH(187, "Key code constant: App switch key. Should bring up the application switcher dialog."), + KEYCODE_BUTTON_1(188, "Key code constant: Generic Game Pad Button #1. "), + KEYCODE_BUTTON_2(189, "Key code constant: Generic Game Pad Button #2. "), + KEYCODE_BUTTON_3(190, "Key code constant: Generic Game Pad Button #3. "), + KEYCODE_BUTTON_4(191, "Key code constant: Generic Game Pad Button #4. "), + KEYCODE_BUTTON_5(192, "Key code constant: Generic Game Pad Button #5. "), + KEYCODE_BUTTON_6(193, "Key code constant: Generic Game Pad Button #6. "), + KEYCODE_BUTTON_7(194, "Key code constant: Generic Game Pad Button #7. "), + KEYCODE_BUTTON_8(195, "Key code constant: Generic Game Pad Button #8. "), + KEYCODE_BUTTON_9(196, "Key code constant: Generic Game Pad Button #9. "), + KEYCODE_BUTTON_10(197, "Key code constant: Generic Game Pad Button #10. "), + KEYCODE_BUTTON_11(198, "Key code constant: Generic Game Pad Button #11. "), + KEYCODE_BUTTON_12(199, "Key code constant: Generic Game Pad Button #12. "), + KEYCODE_BUTTON_13(200, "Key code constant: Generic Game Pad Button #13. "), + KEYCODE_BUTTON_14(201, "Key code constant: Generic Game Pad Button #14. "), + KEYCODE_BUTTON_15(202, "Key code constant: Generic Game Pad Button #15. "), + KEYCODE_BUTTON_16(203, "Key code constant: Generic Game Pad Button #16. "), + KEYCODE_LANGUAGE_SWITCH(204, "Key code constant: Language Switch key. Toggles the current input language such as switching between English and Japanese on a QWERTY keyboard. On some devices, the same function may be performed by pressing Shift+Spacebar."), + KEYCODE_MANNER_MODE(205, "Key code constant: Manner Mode key. Toggles silent or vibrate mode on and off to make the device behave more politely in certain settings such as on a crowded train. On some devices, the key may only operate when long-pressed."), + KEYCODE_3D_MODE(206, "Key code constant: 3D Mode key. Toggles the display between 2D and 3D mode."), + KEYCODE_CONTACTS(207, "Key code constant: Contacts special function key. Used to launch an address book application."), + KEYCODE_CALENDAR(208, "Key code constant: Calendar special function key. Used to launch a calendar application."), + KEYCODE_MUSIC(209, "Key code constant: Music special function key. Used to launch a music player application."), + KEYCODE_CALCULATOR(210, "Key code constant: Calculator special function key. Used to launch a calculator application."), + KEYCODE_ZENKAKU_HANKAKU(211, "Key code constant: Japanese full-width / half-width key. "), + KEYCODE_EISU(212, "Key code constant: Japanese alphanumeric key. "), + KEYCODE_MUHENKAN(213, "Key code constant: Japanese non-conversion key. "), + KEYCODE_HENKAN(214, "Key code constant: Japanese conversion key. "), + KEYCODE_KATAKANA_HIRAGANA(215, "Key code constant: Japanese katakana / hiragana key. "), + KEYCODE_YEN(216, "Key code constant: Japanese Yen key. "), + KEYCODE_RO(217, "Key code constant: Japanese Ro key. "), + KEYCODE_KANA(218, "Key code constant: Japanese kana key. "), + KEYCODE_ASSIST(219, "Key code constant: Assist key. Launches the global assist activity. Not delivered to applications."), + KEYCODE_BRIGHTNESS_DOWN(220, "Key code constant: Brightness Down key. Adjusts the screen brighs down."), + KEYCODE_BRIGHTNESS_UP(221, "Key code constant: Brightness Up key. Adjusts the screen brightness up."), + KEYCODE_MEDIA_AUDIO_TRACK(222, "Key code constant: Audio Track key. Switches the audio tracks."), + KEYCODE_SLEEP(223, "Key code constant: Sleep key. Puts the device to sleep. Behaves somewhat like {@link #KEYCODE_POWER} but it has no effect if the device is already asleep."), + KEYCODE_WAKEUP(224, "Key code constant: Wakeup key. Wakes up the device. Behaves somewhat like {@link #KEYCODE_POWER} but it has no effect if the device is already awake."), + KEYCODE_PAIRING(225, "Key code constant: Pairing key. Initiates peripheral pairing mode. Useful for pairing remote control devices or game controllers, especially if no other input mode is available."), + KEYCODE_MEDIA_TOP_MENU(226, "Key code constant: Media Top Menu key. Goes to the top of media menu."), + KEYCODE_11(227, "Key code constant: '11' key. "), + KEYCODE_12(228, "Key code constant: '12' key. "), + KEYCODE_LAST_CHANNEL(229, "Key code constant: Last Channel key. Goes to the last viewed channel."), + KEYCODE_TV_DATA_SERVICE(230, "Key code constant: TV data service key. Displays data services like weather, sports."), + KEYCODE_VOICE_ASSIST(231, "Key code constant: Voice Assist key. Launches the global voice assist activity. Not delivered to applications."), + KEYCODE_TV_RADIO_SERVICE(232, "Key code constant: Radio key. Toggles TV service / Radio service."), + KEYCODE_TV_TELETEXT(233, "Key code constant: Teletext key. Displays Teletext service."), + KEYCODE_TV_NUMBER_ENTRY(234, "Key code constant: Number entry key. Initiates to enter multi-digit channel nubmber when each digit key is assigned for selecting separate channel. Corresponds to Number Entry Mode (0x1D) of CEC User Control Code."), + KEYCODE_TV_TERRESTRIAL_ANALOG(235, "Key code constant: Analog Terrestrial key. Switches to analog terrestrial broadcast service."), + KEYCODE_TV_TERRESTRIAL_DIGITAL(236, "Key code constant: Digital Terrestrial key. Switches to digital terrestrial broadcast service."), + KEYCODE_TV_SATELLITE(237, "Key code constant: Satellite key. Switches to digital satellite broadcast service."), + KEYCODE_TV_SATELLITE_BS(238, "Key code constant: BS key. Switches to BS digital satellite broadcasting service available in Japan."), + KEYCODE_TV_SATELLITE_CS(239, "Key code constant: CS key. Switches to CS digital satellite broadcasting service available in Japan."), + KEYCODE_TV_SATELLITE_SERVICE(240, "Key code constant: BS/CS key. Toggles between BS and CS digital satellite services."), + KEYCODE_TV_NETWORK(241, "Key code constant: Toggle Network key. Toggles selecting broacast services."), + KEYCODE_TV_ANTENNA_CABLE(242, "Key code constant: Antenna/Cable key. Toggles broadcast input source between antenna and cable."), + KEYCODE_TV_INPUT_HDMI_1(243, "Key code constant: HDMI #1 key. Switches to HDMI input #1."), + KEYCODE_TV_INPUT_HDMI_2(244, "Key code constant: HDMI #2 key. Switches to HDMI input #2."), + KEYCODE_TV_INPUT_HDMI_3(245, "Key code constant: HDMI #3 key. Switches to HDMI input #3."), + KEYCODE_TV_INPUT_HDMI_4(246, "Key code constant: HDMI #4 key. Switches to HDMI input #4."), + KEYCODE_TV_INPUT_COMPOSITE_1(247, "Key code constant: Composite #1 key. Switches to composite video input #1."), + KEYCODE_TV_INPUT_COMPOSITE_2(248, "Key code constant: Composite #2 key. Switches to composite video input #2."), + KEYCODE_TV_INPUT_COMPONENT_1(249, "Key code constant: Component #1 key. Switches to component video input #1."), + KEYCODE_TV_INPUT_COMPONENT_2(250, "Key code constant: Component #2 key. Switches to component video input #2."), + KEYCODE_TV_INPUT_VGA_1(251, "Key code constant: VGA #1 key. Switches to VGA (analog RGB) input #1."), + KEYCODE_TV_AUDIO_DESCRIPTION(252, "Key code constant: Audio description key. Toggles audio description off / on."), + KEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP(253, "Key code constant: Audio description mixing volume up key. Louden audio description volume as compared with normal audio volume."), + KEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN(254, "Key code constant: Audio description mixing volume down key. Lessen audio description volume as compared with normal audio volume."), + KEYCODE_TV_ZOOM_MODE(255, "Key code constant: Zoom mode key. Changes Zoom mode (Normal, Full, Zoom, Wide-zoom, etc.)"), + KEYCODE_TV_CONTENTS_MENU(256, "Key code constant: Contents menu key. Goes to the title list. Corresponds to Contents Menu (0x0B) of CEC User Control Code"), + KEYCODE_TV_MEDIA_CONTEXT_MENU(257, "Key code constant: Media context menu key. Goes to the context menu of media contents. Corresponds to Media Context-sensitive Menu (0x11) of CEC User Control Code."), + KEYCODE_TV_TIMER_PROGRAMMING(258, "Key code constant: Timer programming key. Goes to the timer recording menu. Corresponds to Timer Programming (0x54) of CEC User Control Code."), + KEYCODE_HELP(259, "Key code constant: Help key. "); + private static final Set eventsWithCharacters = fillEventsWithCharacters(); + private static Set eventsWithKeyCodes = fillEventsWithKeyCodes(); + private int keyCode; + private int code; + private String description; + private char characterToReplace; + + InputKeyEvent(int code, String description) { + this.code = code; + this.description = description; + } + + InputKeyEvent(int code, String description, char character) { + this(code, description); + this.characterToReplace = character; + } + + InputKeyEvent(int code, String description, int keyCode) { + this(code, description); + this.keyCode = keyCode; + } + + public static InputKeyEvent getByCharacter(char c) { + for (InputKeyEvent e : eventsWithCharacters) { + if (e.characterToReplace == c) { + return e; + } + } + return null; + } + + public static InputKeyEvent getByKeyCode(int keyCode) { + for (InputKeyEvent e : eventsWithKeyCodes) { + if (e.keyCode == keyCode) { + return e; + } + } + return null; + } + + public static InputKeyEvent getByCharacterOrKeyCode(char c, int keyCode) { + InputKeyEvent e = getByCharacter(c); + if (e == null) + e = getByKeyCode(keyCode); + return e; + } + + private static Set fillEventsWithCharacters() { + Set eventsWithCharacters = EnumSet.allOf(InputKeyEvent.class); + for (InputKeyEvent e : values()) { + if (e.characterToReplace == '\u0000') { + eventsWithCharacters.remove(e); + } + } + return eventsWithCharacters; + } + + private static Set fillEventsWithKeyCodes() { + Set eventsWithKeyCodes = EnumSet.allOf(InputKeyEvent.class); + for (InputKeyEvent e : values()) { + if (e.keyCode == 0) { + eventsWithKeyCodes.remove(e); + } + } + return eventsWithKeyCodes; + } + + public int getKeyCode() { + return keyCode; + } + + public int getCode() { + return code; + } + + public String getDescription() { + return description; + } + + public char getCharacterToReplace() { + return characterToReplace; + } + + +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/api/injector/KeyCodeConverter.java b/src/main/java/com/github/xsavikx/androidscreencast/api/injector/KeyCodeConverter.java new file mode 100644 index 0000000..89c05b8 --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/api/injector/KeyCodeConverter.java @@ -0,0 +1,23 @@ +package com.github.xsavikx.androidscreencast.api.injector; + +import org.apache.log4j.Logger; + +import java.awt.event.KeyEvent; + +public class KeyCodeConverter { + private static final Logger LOGGER = Logger.getLogger(KeyCodeConverter.class); + + public static int getKeyCode(KeyEvent e) { + LOGGER.debug("getKeyCode(KeyEvent e=" + e + ") - start"); + int code = InputKeyEvent.KEYCODE_UNKNOWN.getCode(); + char c = e.getKeyChar(); + int keyCode = e.getKeyCode(); + InputKeyEvent inputKeyEvent = InputKeyEvent.getByCharacterOrKeyCode(Character.toLowerCase(c), keyCode); + if (inputKeyEvent != null) { + code = inputKeyEvent.getCode(); + } + LOGGER.debug("getKeyCode(KeyEvent e=" + e + ") - end"); + return code; + } + +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/api/injector/MultiLineReceiverPrinter.java b/src/main/java/com/github/xsavikx/androidscreencast/api/injector/MultiLineReceiverPrinter.java new file mode 100644 index 0000000..d33a9ce --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/api/injector/MultiLineReceiverPrinter.java @@ -0,0 +1,21 @@ +package com.github.xsavikx.androidscreencast.api.injector; + +import com.android.ddmlib.MultiLineReceiver; +import org.springframework.stereotype.Component; + +@Component +public class MultiLineReceiverPrinter extends MultiLineReceiver { + + @Override + public boolean isCancelled() { + return false; + } + + @Override + public void processNewLines(String[] arg0) { + for (String elem : arg0) { + System.out.println(elem); + } + } + +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/api/injector/OutputStreamShellOutputReceiver.java b/src/main/java/com/github/xsavikx/androidscreencast/api/injector/OutputStreamShellOutputReceiver.java new file mode 100644 index 0000000..be0a981 --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/api/injector/OutputStreamShellOutputReceiver.java @@ -0,0 +1,39 @@ +package com.github.xsavikx.androidscreencast.api.injector; + +import com.android.ddmlib.IShellOutputReceiver; + +import java.io.IOException; +import java.io.OutputStream; + +public class OutputStreamShellOutputReceiver implements IShellOutputReceiver { + + private OutputStream os; + + public OutputStreamShellOutputReceiver(OutputStream os) { + this.os = os; + } + + @Override + public void addOutput(byte[] buf, int off, int len) { + try { + os.write(buf, off, len); + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } + + @Override + public void flush() { + try { + os.flush(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public boolean isCancelled() { + return false; + } + +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/api/injector/ScreenCaptureThread.java b/src/main/java/com/github/xsavikx/androidscreencast/api/injector/ScreenCaptureThread.java new file mode 100644 index 0000000..f7ad07b --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/api/injector/ScreenCaptureThread.java @@ -0,0 +1,191 @@ +package com.github.xsavikx.androidscreencast.api.injector; + +import com.android.ddmlib.AdbCommandRejectedException; +import com.android.ddmlib.IDevice; +import com.android.ddmlib.RawImage; +import com.android.ddmlib.TimeoutException; +import com.github.xsavikx.androidscreencast.api.recording.QuickTimeOutputStream; +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.swing.*; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +@Component +public class ScreenCaptureThread extends Thread { + private static final Logger LOGGER = Logger.getLogger(ScreenCaptureThread.class); + private BufferedImage image; + private Dimension size; + @Autowired + private IDevice device; + private QuickTimeOutputStream qos = null; + private boolean landscape = false; + private ScreenCaptureListener listener = null; + + public ScreenCaptureThread() { + super("Screen capture"); + image = null; + size = new Dimension(); + } + + public void display(RawImage rawImage) { + int width2 = landscape ? rawImage.height : rawImage.width; + int height2 = landscape ? rawImage.width : rawImage.height; + if (image == null) { + image = new BufferedImage(width2, height2, BufferedImage.TYPE_INT_RGB); + size.setSize(image.getWidth(), image.getHeight()); + } else { + if (image.getHeight() != height2 || image.getWidth() != width2) { + image = new BufferedImage(width2, height2, BufferedImage.TYPE_INT_RGB); + size.setSize(image.getWidth(), image.getHeight()); + } + } + int index = 0; + int indexInc = rawImage.bpp >> 3; + for (int y = 0; y < rawImage.height; y++) { + for (int x = 0; x < rawImage.width; x++, index += indexInc) { + int value = rawImage.getARGB(index); + if (landscape) + image.setRGB(y, rawImage.width - x - 1, value); + else + image.setRGB(x, y, value); + } + } + + try { + if (qos != null) + qos.writeFrame(image, 10); + } catch (IOException e) { + LOGGER.error("display(RawImage)", e); + + throw new RuntimeException(e); + } + + if (listener != null) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + listener.handleNewImage(size, image, landscape); + } + }); + } + + } + + private boolean fetchImage() throws IOException { + + if (device == null) { + // device not ready + try { + Thread.sleep(100); + } catch (InterruptedException e) { + LOGGER.error("fetchImage()", e); + return false; + } + return true; + } + RawImage rawImage = null; + synchronized (device) { + try { + rawImage = device.getScreenshot(5, TimeUnit.SECONDS); + } catch (TimeoutException | AdbCommandRejectedException e) { + LOGGER.error("fetchImage()", e); + } + } + if (rawImage != null) { + display(rawImage); + } else { + LOGGER.info("failed getting screenshot through ADB ok"); + } + try { + Thread.sleep(5); + } catch (InterruptedException e) { + LOGGER.error("fetchImage()", e); + return false; + } + return true; + } + + public ScreenCaptureListener getListener() { + return listener; + } + + public void setListener(ScreenCaptureListener listener) { + this.listener = listener; + } + + public Dimension getPreferredSize() { + return size; + } + + @Override + public void run() { + do { + try { + boolean ok = fetchImage(); + if (!ok) + break; + } catch (java.nio.channels.ClosedByInterruptException ciex) { + LOGGER.error("run()", ciex); + + break; + } catch (IOException e) { + LOGGER.error("run()", e); + LOGGER.error((new StringBuilder()).append("Exception fetching image: ").append(e.toString()).toString()); + } + + } while (true); + } + + public void startRecording(File f) { + LOGGER.debug("startRecording(File f=" + f + ") - start"); + + try { + if (!f.getName().toLowerCase().endsWith(".mov")) + f = new File(f.getAbsolutePath() + ".mov"); + qos = new QuickTimeOutputStream(f, QuickTimeOutputStream.VideoFormat.JPG); + } catch (IOException e) { + LOGGER.error("startRecording(File)", e); + + throw new RuntimeException(e); + } + qos.setVideoCompressionQuality(1f); + qos.setTimeScale(30); // 30 fps + + LOGGER.debug("startRecording(File f=" + f + ") - end"); + } + + public void stopRecording() { + LOGGER.debug("stopRecording() - start"); + + try { + QuickTimeOutputStream o = qos; + qos = null; + o.close(); + } catch (IOException e) { + LOGGER.error("stopRecording()", e); + + throw new RuntimeException(e); + } + + LOGGER.debug("stopRecording() - end"); + } + + public void toogleOrientation() { + LOGGER.debug("toogleOrientation() - start"); + + landscape = !landscape; + + LOGGER.debug("toogleOrientation() - end"); + } + + public interface ScreenCaptureListener { + void handleNewImage(Dimension size, BufferedImage image, boolean landscape); + } + +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/api/recording/DataAtomOutputStream.java b/src/main/java/com/github/xsavikx/androidscreencast/api/recording/DataAtomOutputStream.java new file mode 100644 index 0000000..fc214d1 --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/api/recording/DataAtomOutputStream.java @@ -0,0 +1,317 @@ +package com.github.xsavikx.androidscreencast.api.recording; + +import java.io.FilterOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.io.UnsupportedEncodingException; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +public class DataAtomOutputStream extends FilterOutputStream { + + protected static final long MAC_TIMESTAMP_EPOCH = new GregorianCalendar(1904, Calendar.JANUARY, 1).getTimeInMillis(); + /** + * The number of bytes written to the data output stream so far. If this counter overflows, it will be wrapped to Integer.MAX_VALUE. + */ + protected long written; + + public DataAtomOutputStream(OutputStream out) { + super(out); + } + + /** + * Increases the written counter by the specified value until it reaches Long.MAX_VALUE. + */ + protected void incCount(int value) { + long temp = written + value; + if (temp < 0) { + temp = Long.MAX_VALUE; + } + written = temp; + } + + /** + * Returns the current value of the counter written, the number of bytes written to this data output stream so far. If the counter + * overflows, it will be wrapped to Integer.MAX_VALUE. + * + * @return the value of the written field. + * @see java.io.DataOutputStream#written + */ + public final long size() { + return written; + } + + /** + * Writes len bytes from the specified byte array starting at offset off to the underlying output stream. If no exception + * is thrown, the counter written is incremented by len . + * + * @param b the data. + * @param off the start offset in the data. + * @param len the number of bytes to write. + * @throws IOException if an I/O error occurs. + * @see java.io.FilterOutputStream#out + */ + @Override + public synchronized void write(byte b[], int off, int len) throws IOException { + out.write(b, off, len); + incCount(len); + } + + /** + * Writes the specified byte (the low eight bits of the argument b) to the underlying output stream. If no exception is thrown, the + * counter written is incremented by 1 . + *

+ * Implements the write method of OutputStream. + * + * @param b the byte to be written. + * @throws IOException if an I/O error occurs. + * @see java.io.FilterOutputStream#out + */ + @Override + public synchronized void write(int b) throws IOException { + out.write(b); + incCount(1); + } + + /** + * Writes a BCD2 to the underlying output stream. + * + * @param v an int to be written. + * @throws IOException if an I/O error occurs. + * @see java.io.FilterOutputStream#out + */ + public void writeBCD2(int v) throws IOException { + out.write(((v % 100 / 10) << 4) | (v % 10)); + incCount(1); + } + + /** + * Writes a BCD4 to the underlying output stream. + * + * @param v an int to be written. + * @throws IOException if an I/O error occurs. + * @see java.io.FilterOutputStream#out + */ + public void writeBCD4(int v) throws IOException { + out.write(((v % 10000 / 1000) << 4) | (v % 1000 / 100)); + out.write(((v % 100 / 10) << 4) | (v % 10)); + incCount(2); + } + + /** + * Writes out a byte to the underlying output stream as a 1-byte value. If no exception is thrown, the counter written is + * incremented by 1. + * + * @param v a byte value to be written. + * @throws IOException if an I/O error occurs. + * @see java.io.FilterOutputStream#out + */ + public final void writeByte(int v) throws IOException { + out.write(v); + incCount(1); + } + + /** + * Writes 32-bit fixed-point number divided as 16.16. + * + * @param f an int to be written. + * @throws IOException if an I/O error occurs. + * @see java.io.FilterOutputStream#out + */ + public void writeFixed16D16(double f) throws IOException { + double v = (f >= 0) ? f : -f; + + int wholePart = (int) v; + int fractionPart = (int) ((v - wholePart) * 65536); + int t = (wholePart << 16) + fractionPart; + + if (f < 0) { + t = t - 1; + } + writeInt(t); + } + + /** + * Writes 32-bit fixed-point number divided as 2.30. + * + * @param f an int to be written. + * @throws IOException if an I/O error occurs. + * @see java.io.FilterOutputStream#out + */ + public void writeFixed2D30(double f) throws IOException { + double v = (f >= 0) ? f : -f; + + int wholePart = (int) v; + int fractionPart = (int) ((v - wholePart) * 1073741824); + int t = (wholePart << 30) + fractionPart; + + if (f < 0) { + t = t - 1; + } + writeInt(t); + } + + /** + * Writes 16-bit fixed-point number divided as 8.8. + * + * @param f an int to be written. + * @throws IOException if an I/O error occurs. + * @see java.io.FilterOutputStream#out + */ + public void writeFixed8D8(float f) throws IOException { + float v = (f >= 0) ? f : -f; + + int wholePart = (int) v; + int fractionPart = (int) ((v - wholePart) * 256); + int t = (wholePart << 8) + fractionPart; + + if (f < 0) { + t = t - 1; + } + writeUShort(t); + } + + /** + * Writes an int to the underlying output stream as four bytes, high byte first. If no exception is thrown, the counter + * written is incremented by 4. + * + * @param v an int to be written. + * @throws IOException if an I/O error occurs. + * @see java.io.FilterOutputStream#out + */ + public void writeInt(int v) throws IOException { + out.write((v >>> 24) & 0xff); + out.write((v >>> 16) & 0xff); + out.write((v >>> 8) & 0xff); + out.write((v >>> 0) & 0xff); + incCount(4); + } + + public void writeLong(long v) throws IOException { + out.write((int) (v >>> 56) & 0xff); + out.write((int) (v >>> 48) & 0xff); + out.write((int) (v >>> 40) & 0xff); + out.write((int) (v >>> 32) & 0xff); + out.write((int) (v >>> 24) & 0xff); + out.write((int) (v >>> 16) & 0xff); + out.write((int) (v >>> 8) & 0xff); + out.write((int) (v >>> 0) & 0xff); + incCount(8); + } + + /** + * Writes a 32-bit Mac timestamp (seconds since 1902). + * + * @param date + * @throws java.io.IOException + */ + public void writeMacTimestamp(Date date) throws IOException { + long millis = date.getTime(); + long qtMillis = millis - MAC_TIMESTAMP_EPOCH; + long qtSeconds = qtMillis / 1000; + writeUInt(qtSeconds); + } + + /** + * Writes a Pascal String. + * + * @param s + * @throws java.io.IOException + */ + public void writePString(String s) throws IOException { + if (s.length() > 0xffff) { + throw new IllegalArgumentException("String too long for PString"); + } + if (s.length() < 256) { + out.write(s.length()); + } else { + out.write(0); + writeShort(s.length()); // increments +2 + } + for (int i = 0; i < s.length(); i++) { + out.write(s.charAt(i)); + } + incCount(1 + s.length()); + } + + /** + * Writes a Pascal String padded to the specified fixed size in bytes + * + * @param s + * @param length the fixed size in bytes + * @throws java.io.IOException + */ + public void writePString(String s, int length) throws IOException { + if (s.length() > length) { + throw new IllegalArgumentException("String too long for PString of length " + length); + } + if (s.length() < 256) { + out.write(s.length()); + } else { + out.write(0); + writeShort(s.length()); // increments +2 + } + for (int i = 0; i < s.length(); i++) { + out.write(s.charAt(i)); + } + + // write pad bytes + for (int i = 1 + s.length(); i < length; i++) { + out.write(0); + } + + incCount(length); + } + + /** + * Writes a signed 16 bit integer value. + * + * @param v The value + * @throws java.io.IOException + */ + public void writeShort(int v) throws IOException { + out.write((v >> 8) & 0xff); + out.write((v >>> 0) & 0xff); + incCount(2); + } + + /** + * Writes an Atom Type identifier (4 bytes). + * + * @param s A string with a length of 4 characters. + */ + public void writeType(String s) throws IOException { + if (s.length() != 4) { + throw new IllegalArgumentException("type string must have 4 characters"); + } + + try { + out.write(s.getBytes("ASCII"), 0, 4); + incCount(4); + } catch (UnsupportedEncodingException e) { + throw new InternalError(e.toString()); + } + } + + /** + * Writes an unsigned 32 bit integer value. + * + * @param v The value + * @throws java.io.IOException + */ + public void writeUInt(long v) throws IOException { + out.write((int) ((v >>> 24) & 0xff)); + out.write((int) ((v >>> 16) & 0xff)); + out.write((int) ((v >>> 8) & 0xff)); + out.write((int) ((v >>> 0) & 0xff)); + incCount(4); + } + + public void writeUShort(int v) throws IOException { + out.write((v >> 8) & 0xff); + out.write((v >>> 0) & 0xff); + incCount(2); + } + +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/api/recording/FilterImageOutputStream.java b/src/main/java/com/github/xsavikx/androidscreencast/api/recording/FilterImageOutputStream.java new file mode 100644 index 0000000..199baca --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/api/recording/FilterImageOutputStream.java @@ -0,0 +1,80 @@ +package com.github.xsavikx.androidscreencast.api.recording; + +import javax.imageio.stream.ImageOutputStream; +import java.io.FilterOutputStream; +import java.io.IOException; + +public class FilterImageOutputStream extends FilterOutputStream { + private ImageOutputStream imgOut; + + public FilterImageOutputStream(ImageOutputStream iOut) { + super(null); + this.imgOut = iOut; + } + + /** + * Closes this output stream and releases any system resources associated with the stream. + *

+ * The close method of FilterOutputStream calls its flush method, and then calls the close + * method of its underlying output stream. + * + * @throws IOException if an I/O error occurs. + * @see java.io.FilterOutputStream#flush() + * @see java.io.FilterOutputStream#out + */ + @Override + public void close() throws IOException { + flush(); + imgOut.close(); + } + + /** + * Flushes this output stream and forces any buffered output bytes to be written out to the stream. + *

+ * The flush method of FilterOutputStream calls the flush method of its underlying output stream. + * + * @throws IOException if an I/O error occurs. + * @see java.io.FilterOutputStream#out + */ + @Override + public void flush() { + // System.err.println(this+" discarded flush"); + // imgOut.flush(); + } + + /** + * Writes len bytes from the specified byte array starting at offset off to this output stream. + *

+ * The write method of FilterOutputStream calls the write method of one argument on each byte to + * output. + *

+ * Note that this method does not call the write method of its underlying input stream with the same arguments. Subclasses of + * FilterOutputStream should provide a more efficient implementation of this method. + * + * @param b the data. + * @param off the start offset in the data. + * @param len the number of bytes to write. + * @throws IOException if an I/O error occurs. + * @see java.io.FilterOutputStream#write(int) + */ + @Override + public void write(byte b[], int off, int len) throws IOException { + imgOut.write(b, off, len); + } + + /** + * Writes the specified byte to this output stream. + *

+ * The write method of FilterOutputStream calls the write method of its underlying output stream, that is, it + * performs out.write(b). + *

+ * Implements the abstract write method of OutputStream. + * + * @param b the byte. + * @throws IOException if an I/O error occurs. + */ + @Override + public void write(int b) throws IOException { + imgOut.write(b); + } +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/api/recording/QuickTimeOutputStream.java b/src/main/java/com/github/xsavikx/androidscreencast/api/recording/QuickTimeOutputStream.java new file mode 100644 index 0000000..313833f --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/api/recording/QuickTimeOutputStream.java @@ -0,0 +1,1596 @@ +package com.github.xsavikx.androidscreencast.api.recording; + +import javax.imageio.IIOImage; +import javax.imageio.ImageIO; +import javax.imageio.ImageWriteParam; +import javax.imageio.ImageWriter; +import javax.imageio.stream.FileImageOutputStream; +import javax.imageio.stream.ImageOutputStream; +import javax.imageio.stream.MemoryCacheImageOutputStream; +import java.awt.image.BufferedImage; +import java.awt.image.WritableRaster; +import java.io.*; +import java.util.Date; +import java.util.LinkedList; + +public class QuickTimeOutputStream { + + /** + * Output stream of the QuickTimeOutputStream. + */ + private ImageOutputStream out; + /** + * Current video format. + */ + private VideoFormat videoFormat; + /** + * Quality of JPEG encoded video frames. + */ + private float quality = 0.9f; + /** + * Creation time of the movie output stream. + */ + private Date creationTime; + /** + * Width of the video frames. All frames must have the same width. The value -1 is used to mark unspecified width. + */ + private int imgWidth = -1; + /** + * Height of the video frames. All frames must have the same height. The value -1 is used to mark unspecified height. + */ + private int imgHeight = -1; + /** + * The timeScale of the movie. A time value that indicates the time scale for this media-that is, the number of time units that pass per second in + * its time coordinate system. + */ + private int timeScale = 600; + /** + * The current state of the movie output stream. + */ + private States state = States.FINISHED; + /** + * List of video frames. + */ + private LinkedList videoFrames; + /** + * This atom holds the movie frames. + */ + private WideDataAtom mdatAtom; + + /** + * Creates a new output stream with the specified image videoFormat and framerate. + * + * @param file the output file + * @param format Selects an encoder for the video format "JPG" or "PNG". + * @throws IllegalArgumentException if videoFormat is null or if framerate is <= 0 + */ + public QuickTimeOutputStream(File file, VideoFormat format) throws IOException { + if (file.exists()) { + file.delete(); + } + out = new FileImageOutputStream(file); + + if (format == null) { + throw new IllegalArgumentException("format must not be null"); + } + + this.videoFormat = format; + + this.videoFrames = new LinkedList<>(); + } + + /** + * Closes the movie file as well as the stream being filtered. + * + * @throws IOException if an I/O error has occurred + */ + public void close() throws IOException { + if (state == States.STARTED) { + finish(); + } + if (state != States.CLOSED) { + out.close(); + state = States.CLOSED; + } + } + + /** + * Check to make sure that this stream has not been closed + */ + private void ensureOpen() throws IOException { + if (state == States.CLOSED) { + throw new IOException("Stream closed"); + } + } + + /** + * Sets the state of the QuickTimeOutpuStream to started. + *

+ * If the state is changed by this method, the prolog is written. + */ + private void ensureStarted() throws IOException { + if (state != States.STARTED) { + creationTime = new Date(); + writeProlog(); + mdatAtom = new WideDataAtom("mdat"); + state = States.STARTED; + } + } + + /** + * Finishes writing the contents of the QuickTime output stream without closing the underlying stream. Use this method when applying multiple + * filters in succession to the same output stream. + * + * @throws IllegalStateException if the dimension of the video track has not been specified or determined yet. + * @throws IOException if an I/O exception has occurred + */ + public void finish() throws IOException { + ensureOpen(); + if (state != States.FINISHED) { + if (imgWidth == -1 || imgHeight == -1) { + throw new IllegalStateException("image width and height must be specified"); + } + mdatAtom.finish(); + writeEpilog(); + state = States.FINISHED; + imgWidth = imgHeight = -1; + } + } + + /** + * Returns the time scale of this media. + * + * @return time scale + */ + public int getTimeScale() { + return timeScale; + } + + /** + * Sets the time scale for this media, that is, the number of time units that pass per second in its time coordinate system. + *

+ * The default value is 600. + * + * @param newValue + */ + public void setTimeScale(int newValue) { + if (newValue <= 0) { + throw new IllegalArgumentException("timeScale must be greater 0"); + } + this.timeScale = newValue; + } + + /** + * Returns the video compression quality. + * + * @return video compression quality + */ + public float getVideoCompressionQuality() { + return quality; + } + + /** + * Sets the compression quality of the video track. A value of 0 stands for "high compression is important" a value of 1 for + * "high image quality is important". + *

+ * Changing this value affects frames which are subsequently written to the QuickTimeOutputStream. Frames which have already been written are not + * changed. + *

+ * This value has no effect on videos encoded with the PNG format. + *

+ * The default value is 0.9. + * + * @param newValue + */ + public void setVideoCompressionQuality(float newValue) { + this.quality = newValue; + } + + /** + * Sets the dimension of the video track. + *

+ * You need to explicitly set the dimension, if you add all frames from files or input streams. + *

+ * If you add frames from buffered images, then QuickTimeOutputStream can determine the video dimension from the image width and height. + * + * @param width + * @param height + */ + public void setVideoDimension(int width, int height) { + if (width < 1 || height < 1) { + throw new IllegalArgumentException("width and height must be greater zero."); + } + this.imgWidth = width; + this.imgHeight = height; + } + + private void writeEpilog() throws IOException { + Date modificationTime = new Date(); + int duration = 0; + for (Sample s : videoFrames) { + duration += s.duration; + } + + DataAtom leaf; + + /* Movie Atom ========= */ + CompositeAtom moovAtom = new CompositeAtom("moov"); + + /* + * Movie Header Atom ------------- The data contained in this atom defines characteristics of the entire QuickTime movie, such as time scale and + * duration. It has an atom type value of 'mvhd'. + * + * typedef struct { byte version; byte[3] flags; mactimestamp creationTime; mactimestamp modificationTime; int timeScale; int duration; int + * preferredRate; short preferredVolume; byte[10] reserved; int[9] matrix; int previewTime; int previewDuration; int posterTime; int + * selectionTime; int selectionDuration; int currentTime; int nextTrackId; } movieHeaderAtom; + */ + leaf = new DataAtom("mvhd"); + moovAtom.add(leaf); + DataAtomOutputStream d = leaf.getOutputStream(); + d.writeByte(0); // version + // A 1-byte specification of the version of this movie header atom. + + d.writeByte(0); // flags[0] + d.writeByte(0); // flags[1] + d.writeByte(0); // flags[2] + // Three bytes of space for future movie header flags. + + d.writeMacTimestamp(creationTime); // creationTime + // A 32-bit integer that specifies the calendar date and time (in + // seconds since midnight, January 1, 1904) when the movie atom was + // created. It is strongly recommended that this value should be + // specified using coordinated universal time (UTC). + + d.writeMacTimestamp(modificationTime); // modificationTime + // A 32-bit integer that specifies the calendar date and time (in + // seconds since midnight, January 1, 1904) when the movie atom was + // changed. BooleanIt is strongly recommended that this value should be + // specified using coordinated universal time (UTC). + + d.writeInt(timeScale); // timeScale + // A time value that indicates the time scale for this movie-that is, + // the number of time units that pass per second in its time coordinate + // system. A time coordinate system that measures time in sixtieths of a + // second, for example, has a time scale of 60. + + d.writeInt(duration); // duration + // A time value that indicates the duration of the movie in time scale + // units. Note that this property is derived from the movie's tracks. + // The value of this field corresponds to the duration of the longest + // track in the movie. + + d.writeFixed16D16(1d); // preferredRate + // A 32-bit fixed-point number that specifies the rate at which to play + // this movie. A value of 1.0 indicates normal rate. + + d.writeShort(256); // preferredVolume + // A 16-bit fixed-point number that specifies how loud to play this + // movie's sound. A value of 1.0 indicates full volume. + + d.write(new byte[10]); // reserved; + // Ten bytes reserved for use by Apple. Set to 0. + + d.writeFixed16D16(1f); // matrix[0] + d.writeFixed16D16(0f); // matrix[1] + d.writeFixed2D30(0f); // matrix[2] + d.writeFixed16D16(0f); // matrix[3] + d.writeFixed16D16(1f); // matrix[4] + d.writeFixed2D30(0); // matrix[5] + d.writeFixed16D16(0); // matrix[6] + d.writeFixed16D16(0); // matrix[7] + d.writeFixed2D30(1f); // matrix[8] + // The matrix structure associated with this movie. A matrix shows how + // to map points from one coordinate space into another. See "Matrices" + // for a discussion of how display matrices are used in QuickTime: + // http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap4/chapter_5_section_4.html#//apple_ref/doc/uid/TP40000939-CH206-18737 + + d.writeInt(0); // previewTime + // The time value in the movie at which the preview begins. + + d.writeInt(0); // previewDuration + // The duration of the movie preview in movie time scale units. + + d.writeInt(0); // posterTime + // The time value of the time of the movie poster. + + d.writeInt(0); // selectionTime + // The time value for the start time of the current selection. + + d.writeInt(0); // selectionDuration + // The duration of the current selection in movie time scale units. + + d.writeInt(0); // currentTime; + // The time value for current time position within the movie. + + d.writeInt(2); // nextTrackId + // A 32-bit integer that indicates a value to use for the track ID + // number of the next track added to this movie. Note that 0 is not a + // valid track ID value. + + /* Track Atom ======== */ + CompositeAtom trakAtom = new CompositeAtom("trak"); + moovAtom.add(trakAtom); + + /* + * Track Header Atom ----------- The track header atom specifies the characteristics of a single track within a movie. A track header atom + * contains a size field that specifies the number of bytes and a type field that indicates the format of the data (defined by the atom type + * 'tkhd'). + * + * typedef struct { byte version; byte flag0; byte flag1; byte set TrackHeaderFlags flag2; mactimestamp creationTime; mactimestamp + * modificationTime; int trackId; byte[4] reserved; int duration; byte[8] reserved; short layer; short alternateGroup; short volume; byte[2] + * reserved; int[9] matrix; int trackWidth; int trackHeight; } trackHeaderAtom; + */ + leaf = new DataAtom("tkhd"); + trakAtom.add(leaf); + d = leaf.getOutputStream(); + d.write(0); // version + // A 1-byte specification of the version of this track header. + + d.write(0); // flag[0] + d.write(0); // flag[1] + d.write(0xf); // flag[2] + // Three bytes that are reserved for the track header flags. These flags + // indicate how the track is used in the movie. The following flags are + // valid (all flags are enabled when set to 1): + // + // Track enabled + // Indicates that the track is enabled. Flag value is 0x0001. + // Track in movie + // Indicates that the track is used in the movie. Flag value is + // 0x0002. + // Track in preview + // Indicates that the track is used in the movie's preview. Flag + // value is 0x0004. + // Track in poster + // Indicates that the track is used in the movie's poster. Flag + // value is 0x0008. + + d.writeMacTimestamp(creationTime); // creationTime + // A 32-bit integer that indicates the calendar date and time (expressed + // in seconds since midnight, January 1, 1904) when the track header was + // created. It is strongly recommended that this value should be + // specified using coordinated universal time (UTC). + + d.writeMacTimestamp(modificationTime); // modificationTime + // A 32-bit integer that indicates the calendar date and time (expressed + // in seconds since midnight, January 1, 1904) when the track header was + // changed. It is strongly recommended that this value should be + // specified using coordinated universal time (UTC). + + d.writeInt(1); // trackId + // A 32-bit integer that uniquely identifies the track. The value 0 + // cannot be used. + + d.writeInt(0); // reserved; + // A 32-bit integer that is reserved for use by Apple. Set this field to + // 0. + + d.writeInt(duration); // duration + // A time value that indicates the duration of this track (in the + // movie's time coordinate system). Note that this property is derived + // from the track's edits. The value of this field is equal to the sum + // of the durations of all of the track's edits. If there is no edit + // list, then the duration is the sum of the sample durations, converted + // into the movie timescale. + + d.writeLong(0); // reserved + // An 8-byte value that is reserved for use by Apple. Set this field to + // 0. + + d.writeShort(0); // layer; + // A 16-bit integer that indicates this track's spatial priority in its + // movie. The QuickTime Movie Toolbox uses this value to determine how + // tracks overlay one another. Tracks with lower layer values are + // displayed in front of tracks with higher layer values. + + d.writeShort(0); // alternate group + // A 16-bit integer that specifies a collection of movie tracks that + // contain alternate data for one another. QuickTime chooses one track + // from the group to be used when the movie is played. The choice may be + // based on such considerations as playback quality, language, or the + // capabilities of the computer. + + d.writeShort(0); // volume + // A 16-bit fixed-point value that indicates how loudly this track's + // sound is to be played. A value of 1.0 indicates normal volume. + + d.writeShort(0); // reserved + // A 16-bit integer that is reserved for use by Apple. Set this field to + // 0. + + d.writeFixed16D16(1f); // matrix[0] + d.writeFixed16D16(0f); // matrix[1] + d.writeFixed2D30(0f); // matrix[2] + d.writeFixed16D16(0f); // matrix[3] + d.writeFixed16D16(1f); // matrix[4] + d.writeFixed2D30(0); // matrix[5] + d.writeFixed16D16(0); // matrix[6] + d.writeFixed16D16(0); // matrix[7] + d.writeFixed2D30(1f); // matrix[8] + // The matrix structure associated with this track. + // See Figure 2-8 for an illustration of a matrix structure: + // http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap2/chapter_3_section_3.html#//apple_ref/doc/uid/TP40000939-CH204-32967 + + d.writeFixed16D16(imgWidth); // width + // A 32-bit fixed-point number that specifies the width of this track in + // pixels. + + d.writeFixed16D16(imgHeight); // height + // A 32-bit fixed-point number that indicates the height of this track + // in pixels. + + /* Media Atom ========= */ + CompositeAtom mdiaAtom = new CompositeAtom("mdia"); + trakAtom.add(mdiaAtom); + + /* + * Media Header atom ------- typedef struct { byte version; byte[3] flags; mactimestamp creationTime; mactimestamp modificationTime; int + * timeScale; int duration; short language; short quality; } mediaHeaderAtom; + */ + leaf = new DataAtom("mdhd"); + mdiaAtom.add(leaf); + d = leaf.getOutputStream(); + d.write(0); // version + // One byte that specifies the version of this header atom. + + d.write(0); // flag[0] + d.write(0); // flag[1] + d.write(0); // flag[2] + // Three bytes of space for media header flags. Set this field to 0. + + d.writeMacTimestamp(creationTime); // creationTime + // A 32-bit integer that specifies (in seconds since midnight, January + // 1, 1904) when the media atom was created. It is strongly recommended + // that this value should be specified using coordinated universal time + // (UTC). + + d.writeMacTimestamp(modificationTime); // modificationTime + // A 32-bit integer that specifies (in seconds since midnight, January + // 1, 1904) when the media atom was changed. It is strongly recommended + // that this value should be specified using coordinated universal time + // (UTC). + + d.writeInt(timeScale); // timeScale + // A time value that indicates the time scale for this media-that is, + // the number of time units that pass per second in its time coordinate + // system. + + d.writeInt(duration); // duration + // The duration of this media in units of its time scale. + + d.writeShort(0); // language; + // A 16-bit integer that specifies the language code for this media. + // See "Language Code Values" for valid language codes: + // http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap4/chapter_5_section_2.html#//apple_ref/doc/uid/TP40000939-CH206-27005 + + d.writeShort(0); // quality + // A 16-bit integer that specifies the media's playback quality-that is, + // its suitability for playback in a given environment. + + /** Media Handler Atom ------- */ + leaf = new DataAtom("hdlr"); + mdiaAtom.add(leaf); + /* + * typedef struct { byte version; byte[3] flags; magic componentType; magic componentSubtype; magic componentManufacturer; int componentFlags; int + * componentFlagsMask; cstring componentName; } handlerReferenceAtom; + */ + d = leaf.getOutputStream(); + d.write(0); // version + // A 1-byte specification of the version of this handler information. + + d.write(0); // flag[0] + d.write(0); // flag[1] + d.write(0); // flag[2] + // A 3-byte space for handler information flags. Set this field to 0. + + d.writeType("mhlr"); // componentType + // A four-character code that identifies the type of the handler. Only + // two values are valid for this field: 'mhlr' for media handlers and + // 'dhlr' for data handlers. + + d.writeType("vide"); // componentSubtype + // A four-character code that identifies the type of the media handler + // or data handler. For media handlers, this field defines the type of + // data-for example, 'vide' for video data or 'soun' for sound data. + // + // For data handlers, this field defines the data reference type-for + // example, a component subtype value of 'alis' identifies a file alias. + + d.writeInt(0); // componentManufacturer + // Reserved. Set to 0. + + d.writeInt(0); // componentFlags + // Reserved. Set to 0. + + d.writeInt(0); // componentFlagsMask + // Reserved. Set to 0. + + d.write(0); // componentName (empty string) + // A (counted) string that specifies the name of the component-that is, + // the media handler used when this media was created. This field may + // contain a zero-length (empty) string. + + /* Media Information atom ========= */ + CompositeAtom minfAtom = new CompositeAtom("minf"); + mdiaAtom.add(minfAtom); + + /* Video media information atom -------- */ + leaf = new DataAtom("vmhd"); + minfAtom.add(leaf); + /* + * typedef struct { byte version; byte flag1; byte flag2; byte set vmhdFlags flag3; short graphicsMode; ushort[3] opcolor; } + * videoMediaInformationHeaderAtom; + */ + d = leaf.getOutputStream(); + d.write(0); // version + // One byte that specifies the version of this header atom. + + d.write(0); // flag[0] + d.write(0); // flag[1] + d.write(0x1); // flag[2] + // Three bytes of space for media header flags. + // This is a compatibility flag that allows QuickTime to distinguish + // between movies created with QuickTime 1.0 and newer movies. You + // should always set this flag to 1, unless you are creating a movie + // intended for playback using version 1.0 of QuickTime. This flag's + // value is 0x0001. + + d.writeShort(0x40); // graphicsMode (0x40 = ditherCopy) + // A 16-bit integer that specifies the transfer mode. The transfer mode + // specifies which Boolean operation QuickDraw should perform when + // drawing or transferring an image from one location to another. + // See "Graphics Modes" for a list of graphics modes supported by + // QuickTime: + // http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap4/chapter_5_section_5.html#//apple_ref/doc/uid/TP40000939-CH206-18741 + + d.writeUShort(0); // opcolor[0] + d.writeUShort(0); // opcolor[1] + d.writeUShort(0); // opcolor[2] + // Three 16-bit values that specify the red, green, and blue colors for + // the transfer mode operation indicated in the graphics mode field. + + /* Handle reference atom -------- */ + // The handler reference atom specifies the media handler component that + // is to be used to interpret the media's data. The handler reference + // atom has an atom type value of 'hdlr'. + leaf = new DataAtom("hdlr"); + minfAtom.add(leaf); + /* + * typedef struct { byte version; byte[3] flags; magic componentType; magic componentSubtype; magic componentManufacturer; int componentFlags; int + * componentFlagsMask; cstring componentName; } handlerReferenceAtom; + */ + d = leaf.getOutputStream(); + d.write(0); // version + // A 1-byte specification of the version of this handler information. + + d.write(0); // flag[0] + d.write(0); // flag[1] + d.write(0); // flag[2] + // A 3-byte space for handler information flags. Set this field to 0. + + d.writeType("dhlr"); // componentType + // A four-character code that identifies the type of the handler. Only + // two values are valid for this field: 'mhlr' for media handlers and + // 'dhlr' for data handlers. + + d.writeType("alis"); // componentSubtype + // A four-character code that identifies the type of the media handler + // or data handler. For media handlers, this field defines the type of + // data-for example, 'vide' for video data or 'soun' for sound data. + // For data handlers, this field defines the data reference type-for + // example, a component subtype value of 'alis' identifies a file alias. + + d.writeInt(0); // componentManufacturer + // Reserved. Set to 0. + + d.writeInt(0); // componentFlags + // Reserved. Set to 0. + + d.writeInt(0); // componentFlagsMask + // Reserved. Set to 0. + + d.write(0); // componentName (empty string) + // A (counted) string that specifies the name of the component-that is, + // the media handler used when this media was created. This field may + // contain a zero-length (empty) string. + + /* Data information atom ===== */ + CompositeAtom dinfAtom = new CompositeAtom("dinf"); + minfAtom.add(dinfAtom); + + /* Data reference atom ----- */ + // Data reference atoms contain tabular data that instructs the data + // handler component how to access the media's data. + leaf = new DataAtom("dref"); + dinfAtom.add(leaf); + /* + * typedef struct { ubyte version; ubyte[3] flags; int numberOfEntries; dataReferenceEntry dataReference[numberOfEntries]; } dataReferenceAtom; + * + * set { dataRefSelfReference=1 // I am not shure if this is the correct value for this flag } drefEntryFlags; + * + * typedef struct { int size; magic type; byte version; ubyte flag1; ubyte flag2; ubyte set drefEntryFlags flag3; byte[size - 12] data; } + * dataReferenceEntry; + */ + d = leaf.getOutputStream(); + d.write(0); // version + // A 1-byte specification of the version of this data reference atom. + + d.write(0); // flag[0] + d.write(0); // flag[1] + d.write(0); // flag[2] + // A 3-byte space for data reference flags. Set this field to 0. + + d.writeInt(1); // numberOfEntries + // A 32-bit integer containing the count of data references that follow. + + d.writeInt(12); // dataReference.size + // A 32-bit integer that specifies the number of bytes in the data + // reference. + + d.writeType("alis"); // dataReference.type + // A 32-bit integer that specifies the type of the data in the data + // reference. Table 2-4 lists valid type values: + // http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap2/chapter_3_section_4.html#//apple_ref/doc/uid/TP40000939-CH204-38840 + + d.write(0); // dataReference.version + // A 1-byte specification of the version of the data reference. + + d.write(0); // dataReference.flag1 + d.write(0); // dataReference.flag2 + d.write(0x1); // dataReference.flag3 + // A 3-byte space for data reference flags. There is one defined flag. + // + // Self reference + // This flag indicates that the media's data is in the same file as + // the movie atom. On the Macintosh, and other file systems with + // multifork files, set this flag to 1 even if the data resides in + // a different fork from the movie atom. This flag's value is + // 0x0001. + + /* Sample Table atom ========= */ + CompositeAtom stblAtom = new CompositeAtom("stbl"); + minfAtom.add(stblAtom); + + /* Sample Description atom ------- */ + // The sample description atom stores information that allows you to + // decode samples in the media. The data stored in the sample + // description varies, depending on the media type. For example, in the + // case of video media, the sample descriptions are image description + // structures. The sample description information for each media type is + // explained in "Media Data Atom Types": + // http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap3/chapter_4_section_1.html#//apple_ref/doc/uid/TP40000939-CH205-SW1 + leaf = new DataAtom("stsd"); + stblAtom.add(leaf); + /* + * typedef struct { byte version; byte[3] flags; int numberOfEntries; sampleDescriptionEntry sampleDescriptionTable[numberOfEntries]; } + * sampleDescriptionAtom; + * + * typedef struct { int size; magic type; byte[6] reserved; // six bytes that must be zero short dataReferenceIndex; // A 16-bit integer that + * contains the index of the data reference to use to retrieve data associated with samples that use this sample description. Data references are + * stored in data reference atoms. byte[size - 16] data; } sampleDescriptionEntry; + */ + d = leaf.getOutputStream(); + d.write(0); // version + // A 1-byte specification of the version of this sample description + // atom. + + d.write(0); // flag[0] + d.write(0); // flag[1] + d.write(0); // flag[2] + // A 3-byte space for sample description flags. Set this field to 0. + + d.writeInt(1); // number of Entries + // A 32-bit integer containing the number of sample descriptions that + // follow. + + // A 32-bit integer indicating the number of bytes in the sample + // description. + switch (videoFormat) { + case RAW: { + d.writeInt(86); // sampleDescriptionTable[0].size + d.writeType("raw "); // sampleDescriptionTable[0].type + + // A 32-bit integer indicating the format of the stored data. + // This depends on the media type, but is usually either the + // compression format or the media type. + + d.write(new byte[6]); // sampleDescriptionTable[0].reserved + // Six bytes that must be set to 0. + + d.writeShort(1); // sampleDescriptionTable[0].dataReferenceIndex + // A 16-bit integer that contains the index of the data + // reference to use to retrieve data associated with samples + // that use this sample description. Data references are stored + // in data reference atoms. + + // Video Sample Description + // ------------------------ + // The format of the following fields is described here: + // http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap3/chapter_4_section_2.html#//apple_ref/doc/uid/TP40000939-CH205-BBCGICBJ + + d.writeShort(0); // sampleDescriptionTable.videoSampleDescription.version + // A 16-bit integer indicating the version number of the + // compressed data. This is set to 0, unless a compressor has + // changed its data format. + + d.writeShort(0); // sampleDescriptionTable.videoSampleDescription.revisionLevel + // A 16-bit integer that must be set to 0. + + d.writeType("java"); // sampleDescriptionTable.videoSampleDescription.manufacturer + // A 32-bit integer that specifies the developer of the + // compressor that generated the compressed data. Often this + // field contains 'appl' to indicate Apple Computer, Inc. + + d.writeInt(0); // sampleDescriptionTable.videoSampleDescription.temporalQuality + // A 32-bit integer containing a value from 0 to 1023 indicating + // the degree of temporal compression. + + d.writeInt(512); // sampleDescriptionTable.videoSampleDescription.spatialQuality + // A 32-bit integer containing a value from 0 to 1024 indicating + // the degree of spatial compression. + + d.writeUShort(imgWidth); // sampleDescriptionTable.videoSampleDescription.width + // A 16-bit integer that specifies the width of the source image + // in pixels. + + d.writeUShort(imgHeight); // sampleDescriptionTable.videoSampleDescription.height + // A 16-bit integer that specifies the height of the source image in + // pixels. + + d.writeFixed16D16(72.0); // sampleDescriptionTable.videoSampleDescription.horizontalResolution + // A 32-bit fixed-point number containing the horizontal + // resolution of the image in pixels per inch. + + d.writeFixed16D16(72.0); // sampleDescriptionTable.videoSampleDescription.verticalResolution + // A 32-bit fixed-point number containing the vertical + // resolution of the image in pixels per inch. + + d.writeInt(0); // sampleDescriptionTable.videoSampleDescription.dataSize + // A 32-bit integer that must be set to 0. + + d.writeShort(1); // sampleDescriptionTable.videoSampleDescription.frameCount + // A 16-bit integer that indicates how many frames of compressed + // data are stored in each sample. Usually set to 1. + + d.writePString("None", 32); // sampleDescriptionTable.videoSampleDescription.compressorName + // A 32-byte Pascal string containing the name of the compressor + // that created the image, such as "jpeg". + + d.writeShort(24); // sampleDescriptionTable.videoSampleDescription.depth + // A 16-bit integer that indicates the pixel depth of the + // compressed image. Values of 1, 2, 4, 8 ,16, 24, and 32 + // indicate the depth of color images. The value 32 should be + // used only if the image contains an alpha channel. Values of + // 34, 36, and 40 indicate 2-, 4-, and 8-bit grayscale, + // respectively, for grayscale images. + + d.writeShort(-1); // sampleDescriptionTable.videoSampleDescription.colorTableID + // A 16-bit integer that identifies which color table to use. + // If this field is set to -1, the default color table should be + // used for the specified depth. For all depths below 16 bits + // per pixel, this indicates a standard Macintosh color table + // for the specified depth. Depths of 16, 24, and 32 have no + // color table. + + break; + } + case JPG: { + d.writeInt(86); // sampleDescriptionTable[0].size + d.writeType("jpeg"); // sampleDescriptionTable[0].type + + // A 32-bit integer indicating the format of the stored data. + // This depends on the media type, but is usually either the + // compression format or the media type. + + d.write(new byte[6]); // sampleDescriptionTable[0].reserved + // Six bytes that must be set to 0. + + d.writeShort(1); // sampleDescriptionTable[0].dataReferenceIndex + // A 16-bit integer that contains the index of the data + // reference to use to retrieve data associated with samples + // that use this sample description. Data references are stored + // in data reference atoms. + + // Video Sample Description + // ------------------------ + // The format of the following fields is described here: + // http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap3/chapter_4_section_2.html#//apple_ref/doc/uid/TP40000939-CH205-BBCGICBJ + + d.writeShort(0); // sampleDescriptionTable.videoSampleDescription.version + // A 16-bit integer indicating the version number of the + // compressed data. This is set to 0, unless a compressor has + // changed its data format. + + d.writeShort(0); // sampleDescriptionTable.videoSampleDescription.revisionLevel + // A 16-bit integer that must be set to 0. + + d.writeType("java"); // sampleDescriptionTable.videoSampleDescription.manufacturer + // A 32-bit integer that specifies the developer of the + // compressor that generated the compressed data. Often this + // field contains 'appl' to indicate Apple Computer, Inc. + + d.writeInt(0); // sampleDescriptionTable.videoSampleDescription.temporalQuality + // A 32-bit integer containing a value from 0 to 1023 indicating + // the degree of temporal compression. + + d.writeInt(512); // sampleDescriptionTable.videoSampleDescription.spatialQuality + // A 32-bit integer containing a value from 0 to 1024 indicating + // the degree of spatial compression. + + d.writeUShort(imgWidth); // sampleDescriptionTable.videoSampleDescription.width + // A 16-bit integer that specifies the width of the source image + // in pixels. + + d.writeUShort(imgHeight); // sampleDescriptionTable.videoSampleDescription.height + // A 16-bit integer that specifies the height of the source image in + // pixels. + + d.writeFixed16D16(72.0); // sampleDescriptionTable.videoSampleDescription.horizontalResolution + // A 32-bit fixed-point number containing the horizontal + // resolution of the image in pixels per inch. + + d.writeFixed16D16(72.0); // sampleDescriptionTable.videoSampleDescription.verticalResolution + // A 32-bit fixed-point number containing the vertical + // resolution of the image in pixels per inch. + + d.writeInt(0); // sampleDescriptionTable.videoSampleDescription.dataSize + // A 32-bit integer that must be set to 0. + + d.writeShort(1); // sampleDescriptionTable.videoSampleDescription.frameCount + // A 16-bit integer that indicates how many frames of compressed + // data are stored in each sample. Usually set to 1. + + d.writePString("Photo - JPEG", 32); // sampleDescriptionTable.videoSampleDescription.compressorName + // A 32-byte Pascal string containing the name of the compressor + // that created the image, such as "jpeg". + + d.writeShort(24); // sampleDescriptionTable.videoSampleDescription.depth + // A 16-bit integer that indicates the pixel depth of the + // compressed image. Values of 1, 2, 4, 8 ,16, 24, and 32 + // indicate the depth of color images. The value 32 should be + // used only if the image contains an alpha channel. Values of + // 34, 36, and 40 indicate 2-, 4-, and 8-bit grayscale, + // respectively, for grayscale images. + + d.writeShort(-1); // sampleDescriptionTable.videoSampleDescription.colorTableID + // A 16-bit integer that identifies which color table to use. + // If this field is set to -1, the default color table should be + // used for the specified depth. For all depths below 16 bits + // per pixel, this indicates a standard Macintosh color table + // for the specified depth. Depths of 16, 24, and 32 have no + // color table. + + break; + } + case PNG: { + d.writeInt(86); // sampleDescriptionTable[0].size + d.writeType("png "); // sampleDescriptionTable[0].type + // A 32-bit integer indicating the format of the stored data. + // This depends on the media type, but is usually either the + // compression format or the media type. + + d.write(new byte[6]); // sampleDescriptionTable[0].reserved + // Six bytes that must be set to 0. + + d.writeShort(1); // sampleDescriptionTable[0].dataReferenceIndex + // A 16-bit integer that contains the index of the data + // reference to use to retrieve data associated with samples + // that use this sample description. Data references are stored + // in data reference atoms. + + // Video Sample Description + // ------------------------ + // The format of the following fields is described here: + // http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap3/chapter_4_section_2.html#//apple_ref/doc/uid/TP40000939-CH205-BBCGICBJ + + d.writeShort(0); // sampleDescriptionTable.videoSampleDescription.version + // A 16-bit integer indicating the version number of the + // compressed data. This is set to 0, unless a compressor has + // changed its data format. + + d.writeShort(0); // sampleDescriptionTable.videoSampleDescription.revisionLevel + // A 16-bit integer that must be set to 0. + + d.writeType("java"); // sampleDescriptionTable.videoSampleDescription.manufacturer + // A 32-bit integer that specifies the developer of the + // compressor that generated the compressed data. Often this + // field contains 'appl' to indicate Apple Computer, Inc. + + d.writeInt(0); // sampleDescriptionTable.videoSampleDescription.temporalQuality + // A 32-bit integer containing a value from 0 to 1023 indicating + // the degree of temporal compression. + + d.writeInt(512); // sampleDescriptionTable.videoSampleDescription.spatialQuality + // A 32-bit integer containing a value from 0 to 1024 indicating + // the degree of spatial compression. + + d.writeUShort(imgWidth); // sampleDescriptionTable.videoSampleDescription.width + // A 16-bit integer that specifies the width of the source image + // in pixels. + + d.writeUShort(imgHeight); // sampleDescriptionTable.videoSampleDescription.height + // A 16-bit integer that specifies the height of the source image in + // pixels. + + d.writeFixed16D16(72.0); // sampleDescriptionTable.videoSampleDescription.horizontalResolution + // A 32-bit fixed-point number containing the horizontal + // resolution of the image in pixels per inch. + + d.writeFixed16D16(72.0); // sampleDescriptionTable.videoSampleDescription.verticalResolution + // A 32-bit fixed-point number containing the vertical + // resolution of the image in pixels per inch. + + d.writeInt(0); // sampleDescriptionTable.videoSampleDescription.dataSize + // A 32-bit integer that must be set to 0. + + d.writeShort(1); // sampleDescriptionTable.videoSampleDescription.frameCount + // A 16-bit integer that indicates how many frames of compressed + // data are stored in each sample. Usually set to 1. + + d.writePString("PNG", 32); // sampleDescriptionTable.videoSampleDescription.compressorName + // A 32-byte Pascal string containing the name of the compressor + // that created the image, such as "jpeg". + + d.writeShort(24); // sampleDescriptionTable.videoSampleDescription.depth + // A 16-bit integer that indicates the pixel depth of the + // compressed image. Values of 1, 2, 4, 8 ,16, 24, and 32 + // indicate the depth of color images. The value 32 should be + // used only if the image contains an alpha channel. Values of + // 34, 36, and 40 indicate 2-, 4-, and 8-bit grayscale, + // respectively, for grayscale images. + + d.writeShort(-1); // sampleDescriptionTable.videoSampleDescription.colorTableID + // A 16-bit integer that identifies which color table to use. + // If this field is set to -1, the default color table should be + // used for the specified depth. For all depths below 16 bits + // per pixel, this indicates a standard Macintosh color table + // for the specified depth. Depths of 16, 24, and 32 have no + // color table. + + break; + } + } + + /* Time to Sample atom ---- */ + // Time-to-sample atoms store duration information for a media's + // samples, providing a mapping from a time in a media to the + // corresponding data sample. The time-to-sample atom has an atom type + // of 'stts'. + leaf = new DataAtom("stts"); + stblAtom.add(leaf); + /* + * typedef struct { byte version; byte[3] flags; int numberOfEntries; timeToSampleTable timeToSampleTable[numberOfEntries]; } timeToSampleAtom; + * + * typedef struct { int sampleCount; int sampleDuration; } timeToSampleTable; + */ + d = leaf.getOutputStream(); + d.write(0); // version + // A 1-byte specification of the version of this time-to-sample atom. + + d.write(0); // flag[0] + d.write(0); // flag[1] + d.write(0); // flag[2] + // A 3-byte space for time-to-sample flags. Set this field to 0. + + // count runs of video frame durations + int runCount = 1; + int prevDuration = videoFrames.size() == 0 ? 0 : videoFrames.get(0).duration; + for (Sample s : videoFrames) { + if (s.duration != prevDuration) { + runCount++; + prevDuration = s.duration; + } + } + d.writeInt(runCount); // numberOfEntries + // A 32-bit integer containing the count of entries in the + // time-to-sample table. + + int runLength = 0; + prevDuration = videoFrames.size() == 0 ? 0 : videoFrames.get(0).duration; + for (Sample s : videoFrames) { + if (s.duration != prevDuration) { + if (runLength > 0) { + d.writeInt(runLength); // timeToSampleTable[0].sampleCount + // A 32-bit integer that specifies the number of consecutive + // samples that have the same duration. + + d.writeInt(prevDuration); // timeToSampleTable[0].sampleDuration + // A 32-bit integer that specifies the duration of each + // sample. + } + prevDuration = s.duration; + runLength = 1; + } else { + runLength++; + } + } + if (runLength > 0) { + d.writeInt(runLength); // timeToSampleTable[0].sampleCount + // A 32-bit integer that specifies the number of consecutive + // samples that have the same duration. + + d.writeInt(prevDuration); // timeToSampleTable[0].sampleDuration + // A 32-bit integer that specifies the duration of each + // sample. + } + /* sample to chunk atom -------- */ + // The sample-to-chunk atom contains a table that maps samples to chunks + // in the media data stream. By examining the sample-to-chunk atom, you + // can determine the chunk that contains a specific sample. + leaf = new DataAtom("stsc"); + stblAtom.add(leaf); + /* + * typedef struct { byte version; byte[3] flags; int numberOfEntries; sampleToChunkTable sampleToChunkTable[numberOfEntries]; } sampleToChunkAtom; + * + * typedef struct { int firstChunk; int samplesPerChunk; int sampleDescription; } sampleToChunkTable; + */ + d = leaf.getOutputStream(); + d.write(0); // version + // A 1-byte specification of the version of this time-to-sample atom. + + d.write(0); // flag[0] + d.write(0); // flag[1] + d.write(0); // flag[2] + // A 3-byte space for time-to-sample flags. Set this field to 0. + + d.writeInt(1); // number of entries + // A 32-bit integer containing the count of entries in the + // sample-to-chunk table. + + d.writeInt(1); // first chunk + // The first chunk number using this table entry. + + d.writeInt(1); // samples per chunk + // The number of samples in each chunk. + + d.writeInt(1); // sample description + // The identification number associated with the sample description for + // the sample. For details on sample description atoms, see "Sample + // Description Atoms.": + // http://developer.apple.com/documentation/QuickTime/QTFF/QTFFChap2/chapter_3_section_5.html#//apple_ref/doc/uid/TP40000939-CH204-25691 + + /* sample size atom -------- */ + // The sample size atom contains the sample count and a table giving the + // size of each sample. This allows the media data itself to be + // unframed. The total number of samples in the media is always + // indicated in the sample count. If the default size is indicated, then + // no table follows. + leaf = new DataAtom("stsz"); + stblAtom.add(leaf); + /* + * typedef struct { byte version; byte[3] flags; int sampleSize; int numberOfEntries; sampleSizeTable sampleSizeTable[numberOfEntries]; } + * sampleSizeAtom; + * + * typedef struct { int size; } sampleSizeTable; + */ + d = leaf.getOutputStream(); + d.write(0); // version + // A 1-byte specification of the version of this time-to-sample atom. + + d.write(0); // flag[0] + d.write(0); // flag[1] + d.write(0); // flag[2] + // A 3-byte space for time-to-sample flags. Set this field to 0. + + d.writeUInt(0); // sample size + // A 32-bit integer specifying the sample size. If all the samples are + // the same size, this field contains that size value. If this field is + // set to 0, then the samples have different sizes, and those sizes are + // stored in the sample size table. + + d.writeUInt(videoFrames.size()); // number of entries + // A 32-bit integer containing the count of entries in the sample size + // table. + + for (Sample s : videoFrames) { + d.writeUInt(s.length); // sample size + // The size field contains the size, in bytes, of the sample in + // question. The table is indexed by sample number-the first entry + // corresponds to the first sample, the second entry is for the + // second sample, and so on. + } + // + /* chunk offset atom -------- */ + // The chunk-offset table gives the index of each chunk into the + // containing file. There are two variants, permitting the use of + // 32-bit or 64-bit offsets. The latter is useful when managing very + // large movies. Only one of these variants occurs in any single + // instance of a sample table atom. + if (videoFrames.size() == 0 || videoFrames.getLast().offset <= 0xffffffffL) { + /* 32-bit chunk offset atom -------- */ + leaf = new DataAtom("stco"); + stblAtom.add(leaf); + /* + * typedef struct { byte version; byte[3] flags; int numberOfEntries; chunkOffsetTable chunkOffsetTable[numberOfEntries]; } chunkOffsetAtom; + * + * typedef struct { int offset; } chunkOffsetTable; + */ + d = leaf.getOutputStream(); + d.write(0); // version + // A 1-byte specification of the version of this time-to-sample + // atom. + + d.write(0); // flag[0] + d.write(0); // flag[1] + d.write(0); // flag[2] + // A 3-byte space for time-to-sample flags. Set this field to 0. + + d.writeUInt(videoFrames.size()); // number of entries + // A 32-bit integer containing the count of entries in the chunk + // offset table. + + for (Sample s : videoFrames) { + d.writeUInt(s.offset); // offset + // The offset contains the byte offset from the beginning of the + // data stream to the chunk. The table is indexed by chunk + // number-the first table entry corresponds to the first chunk, + // the second table entry is for the second chunk, and so on. + } + } else { + /* 64-bit chunk offset atom -------- */ + leaf = new DataAtom("co64"); + stblAtom.add(leaf); + /* + * typedef struct { byte version; byte[3] flags; int numberOfEntries; chunkOffsetTable chunkOffset64Table[numberOfEntries]; } chunkOffset64Atom; + * + * typedef struct { long offset; } chunkOffset64Table; + */ + d = leaf.getOutputStream(); + d.write(0); // version + // A 1-byte specification of the version of this time-to-sample + // atom. + + d.write(0); // flag[0] + d.write(0); // flag[1] + d.write(0); // flag[2] + // A 3-byte space for time-to-sample flags. Set this field to 0. + + d.writeUInt(videoFrames.size()); // number of entries + // A 32-bit integer containing the count of entries in the chunk + // offset table. + + for (Sample s : videoFrames) { + d.writeLong(s.offset); // offset + // The offset contains the byte offset from the beginning of the + // data stream to the chunk. The table is indexed by chunk + // number-the first table entry corresponds to the first chunk, + // the second table entry is for the second chunk, and so on. + } + } + // + moovAtom.finish(); + } + + /** + * Writes a frame to the video track. + *

+ * If the dimension of the video track has not been specified yet, it is derived from the first buffered image added to the QuickTimeOutputStream. + * + * @param image The frame image. + * @param duration The duration of the frame in time scale units. + * @throws IllegalArgumentException if the duration is less than 1, or if the dimension of the frame does not match the dimension of the video track. + * @throws IOException if writing the image failed. + */ + public void writeFrame(BufferedImage image, int duration) throws IOException { + if (duration <= 0) { + throw new IllegalArgumentException("duration must be greater 0"); + } + ensureOpen(); + ensureStarted(); + + // Get the dimensions of the first image + if (imgWidth == -1) { + imgWidth = image.getWidth(); + imgHeight = image.getHeight(); + } else { + // The dimension of the image must match the dimension of the video + // track + if (imgWidth != image.getWidth() || imgHeight != image.getHeight()) { + throw new IllegalArgumentException("Dimensions of image[" + videoFrames.size() + "] (width=" + image.getWidth() + + ", height=" + image.getHeight() + ") differs from image[0] (width=" + imgWidth + ", height=" + imgHeight); + } + } + + long offset = out.getStreamPosition(); + + switch (videoFormat) { + case RAW: { + WritableRaster raster = image.getRaster(); + int[] raw = new int[imgWidth * 3]; // holds a scanline of raw image + // data with 3 channels of 32 + // bit data + byte[] bytes = new byte[imgWidth * 3]; // holds a scanline of raw + // image data with 3 + // channels of 8 bit data + for (int y = 0; y < imgHeight; y++) { + raster.getPixels(0, y, imgWidth, 1, raw); + for (int k = 0, n = imgWidth * 3; k < n; k++) { + bytes[k] = (byte) raw[k]; + } + mdatAtom.getOutputStream().write(bytes); + } + break; + } + case JPG: { + ImageWriter iw = ImageIO.getImageWritersByMIMEType("image/jpeg").next(); + ImageWriteParam iwParam = iw.getDefaultWriteParam(); + iwParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); + iwParam.setCompressionQuality(quality); + MemoryCacheImageOutputStream imgOut = new MemoryCacheImageOutputStream(mdatAtom.getOutputStream()); + iw.setOutput(imgOut); + IIOImage img = new IIOImage(image, null, null); + iw.write(null, img, iwParam); + iw.dispose(); + break; + } + case PNG: + default: { + ImageWriter iw = ImageIO.getImageWritersByMIMEType("image/png").next(); + ImageWriteParam iwParam = iw.getDefaultWriteParam(); + MemoryCacheImageOutputStream imgOut = new MemoryCacheImageOutputStream(mdatAtom.getOutputStream()); + iw.setOutput(imgOut); + IIOImage img = new IIOImage(image, null, null); + iw.write(null, img, iwParam); + iw.dispose(); + break; + } + } + long length = out.getStreamPosition() - offset; + videoFrames.add(new Sample(duration, offset, length)); + } + + /** + * Writes a frame from a file to the video track. + *

+ * This method does not inspect the contents of the file. The contents has to match the video format. For example, it is your responsibility to only + * add JPG files if you have chosen the JPEG video format. + *

+ * If you add all frames from files or from input streams, then you have to explicitly set the dimension of the video track before you call finish() + * or close(). + * + * @param file The file which holds the image data. + * @param duration The duration of the frame in time scale units. + * @throws IllegalStateException if the duration is less than 1. + * @throws IOException if writing the image failed. + */ + public void writeFrame(File file, int duration) throws IOException { + + try (FileInputStream in = new FileInputStream(file)) { + writeFrame(in, duration); + } + } + + /** + * Writes a frame to the video track. + *

+ * This method does not inspect the contents of the input stream. The contents has to match the video format. For example, it is your responsibility + * to only add JPG files if you have chosen the JPEG video format. + *

+ * If you add all frames from files or from input streams, then you have to explicitly set the dimension of the video track before you call finish() + * or close(). + * + * @param in The input stream which holds the image data. + * @param duration The duration of the frame in time scale units. + * @throws IllegalArgumentException if the duration is less than 1. + * @throws IOException if writing the image failed. + */ + public void writeFrame(InputStream in, int duration) throws IOException { + if (duration <= 0) { + throw new IllegalArgumentException("duration must be greater 0"); + } + ensureOpen(); + ensureStarted(); + + long offset = out.getStreamPosition(); + try (OutputStream mdatOut = mdatAtom.getOutputStream()) { + byte[] buf = new byte[512]; + int len; + while ((len = in.read(buf)) != -1) { + mdatOut.write(buf, 0, len); + } + long length = out.getStreamPosition() - offset; + videoFrames.add(new Sample(duration, offset, length)); + } + } + + private void writeProlog() throws IOException { + /* + * File type atom + * + * typedef struct { magic brand; bcd4 versionYear; bcd2 versionMonth; bcd2 versionMinor; magic[4] compatibleBrands; } ftypAtom; + */ + DataAtom ftypAtom = new DataAtom("ftyp"); + DataAtomOutputStream d = ftypAtom.getOutputStream(); + d.writeType("qt "); // brand + d.writeBCD4(2005); // versionYear + d.writeBCD2(3); // versionMonth + d.writeBCD2(0); // versionMinor + d.writeType("qt "); // compatibleBrands + d.writeInt(0); // compatibleBrands (0 is used to denote no value) + d.writeInt(0); // compatibleBrands (0 is used to denote no value) + d.writeInt(0); // compatibleBrands (0 is used to denote no value) + ftypAtom.finish(); + } + + /** + * The states of the movie output stream. + */ + private enum States { + + STARTED, FINISHED, CLOSED + } + + /** + * Supported video formats. + */ + public enum VideoFormat { + + RAW, JPG, PNG + } + + /** + * QuickTime stores media data in samples. A sample is a single element in a sequence of time-ordered data. Samples are stored in the mdat atom. + */ + private static class Sample { + + /** + * Offset of the sample relative to the start of the QuickTime file. + */ + long offset; + /** + * Data length of the sample. + */ + long length; + /** + * The duration of the sample in time scale units. + */ + int duration; + + /** + * Creates a new sample. + * + * @param duration + * @param offset + * @param length + */ + public Sample(int duration, long offset, long length) { + this.duration = duration; + this.offset = offset; + this.length = length; + } + } + + /** + * Atom base class. + */ + private abstract class Atom { + + /** + * The type of the atom. A String with the length of 4 characters. + */ + protected String type; + /** + * The offset of the atom relative to the start of the ImageOutputStream. + */ + protected long offset; + + /** + * Creates a new Atom at the current position of the ImageOutputStream. + * + * @param type The type of the atom. A string with a length of 4 characters. + */ + public Atom(String type) throws IOException { + this.type = type; + offset = out.getStreamPosition(); + } + + /** + * Writes the atom to the ImageOutputStream and disposes it. + */ + public abstract void finish() throws IOException; + + /** + * Returns the size of the atom including the size of the atom header. + * + * @return The size of the atom. + */ + public abstract long size(); + } + + /** + * A CompositeAtom contains an ordered list of Atoms. + */ + private class CompositeAtom extends Atom { + + private LinkedList children; + private boolean finished; + + /** + * Creates a new CompositeAtom at the current position of the ImageOutputStream. + * + * @param type The type of the atom. + */ + public CompositeAtom(String type) throws IOException { + super(type); + out.writeLong(0); // make room for the atom header + children = new LinkedList<>(); + } + + public void add(Atom child) throws IOException { + if (children.size() > 0) { + children.getLast().finish(); + } + children.add(child); + } + + /** + * Writes the atom and all its children to the ImageOutputStream and disposes of all resources held by the atom. + * + * @throws java.io.IOException + */ + @Override + public void finish() throws IOException { + if (!finished) { + if (size() > 0xffffffffL) { + throw new IOException("CompositeAtom \"" + type + "\" is too large: " + size()); + } + + long pointer = out.getStreamPosition(); + out.seek(offset); + try (DataAtomOutputStream headerData = new DataAtomOutputStream(new FilterImageOutputStream(out))) { + + headerData.writeInt((int) size()); + headerData.writeType(type); + for (Atom child : children) { + child.finish(); + } + out.seek(pointer); + finished = true; + } + } + } + + @Override + public long size() { + long length = 8; + for (Atom child : children) { + length += child.size(); + } + return length; + } + } + + /** + * Data Atom. + */ + protected class DataAtom extends Atom { + + private DataAtomOutputStream data; + private boolean finished; + + /** + * Creates a new DataAtom at the current position of the ImageOutputStream. + * + * @param name The type of the atom. + */ + public DataAtom(String name) throws IOException { + super(name); + out.writeLong(0); // make room for the atom header + data = new DataAtomOutputStream(new FilterImageOutputStream(out)); + } + + @Override + public void finish() throws IOException { + if (!finished) { + long sizeBefore = size(); + + if (size() > 0xffffffffL) { + throw new IOException("DataAtom \"" + type + "\" is too large: " + size()); + } + + long pointer = out.getStreamPosition(); + out.seek(offset); + try (DataAtomOutputStream headerData = new DataAtomOutputStream(new FilterImageOutputStream(out))) { + headerData.writeUInt(size()); + headerData.writeType(type); + out.seek(pointer); + finished = true; + long sizeAfter = size(); + if (sizeBefore != sizeAfter) { + System.err.println("size mismatch " + sizeBefore + ".." + sizeAfter); + } + } + } + } + + /** + * Returns the offset of this atom to the beginning of the random access file + * + * @return + */ + public long getOffset() { + return offset; + } + + public DataAtomOutputStream getOutputStream() { + if (finished) { + throw new IllegalStateException("DataAtom is finished"); + } + return data; + } + + @Override + public long size() { + return 8 + data.size(); + } + } + + /** + * WideDataAtom can grow larger then 4 gigabytes. + */ + protected class WideDataAtom extends Atom { + + private DataAtomOutputStream data; + private boolean finished; + + /** + * Creates a new DataAtom at the current position of the ImageOutputStream. + * + * @param type The type of the atom. + */ + public WideDataAtom(String type) throws IOException { + super(type); + out.writeLong(0); // make room for the atom header + out.writeLong(0); // make room for the atom header + data = new DataAtomOutputStream(new FilterImageOutputStream(out)); + } + + @Override + public void finish() throws IOException { + if (!finished) { + long pointer = out.getStreamPosition(); + out.seek(offset); + try (DataAtomOutputStream headerData = new DataAtomOutputStream(new FilterImageOutputStream(out))) { + + if (size() <= 0xffffffffL) { + headerData.writeUInt(8); + headerData.writeType("wide"); + headerData.writeUInt(size()); + headerData.writeType(type); + } else { + headerData.writeInt(1); // special value for extended + // size + // atoms + headerData.writeType(type); + headerData.writeLong(size()); + } + + out.seek(pointer); + finished = true; + } + } + } + + /** + * Returns the offset of this atom to the beginning of the random access file + * + * @return + */ + public long getOffset() { + return offset; + } + + public DataAtomOutputStream getOutputStream() { + if (finished) { + throw new IllegalStateException("Atom is finished"); + } + return data; + } + + @Override + public long size() { + long size = 8 + data.size(); + return (size > 0xffffffffL) ? size + 8 : size; + } + } +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/app/AndroidScreencastApplication.java b/src/main/java/com/github/xsavikx/androidscreencast/app/AndroidScreencastApplication.java new file mode 100644 index 0000000..bd9dfdc --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/app/AndroidScreencastApplication.java @@ -0,0 +1,86 @@ +package com.github.xsavikx.androidscreencast.app; + +import com.android.ddmlib.AndroidDebugBridge; +import com.android.ddmlib.IDevice; +import com.github.xsavikx.androidscreencast.api.injector.Injector; +import com.github.xsavikx.androidscreencast.constant.Constants; +import com.github.xsavikx.androidscreencast.ui.JFrameMain; +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import javax.swing.*; + +@Component +public class AndroidScreencastApplication extends SwingApplication { + private static final Logger LOGGER = Logger.getLogger(AndroidScreencastApplication.class); + + private final Environment environment; + private final JFrameMain jFrameMain; + private final Injector injector; + private final IDevice iDevice; + + @Autowired + public AndroidScreencastApplication(Injector injector, IDevice iDevice, JFrameMain jFrameMain, Environment environment) { + this.injector = injector; + this.iDevice = iDevice; + this.jFrameMain = jFrameMain; + this.environment = environment; + } + + @Override + public void close() { + LOGGER.debug("close() - start"); + + if (injector != null) + injector.close(); + + if (iDevice != null) { + synchronized (iDevice) { + if (hasFilledAdbPath()) + AndroidDebugBridge.disconnectBridge(); + AndroidDebugBridge.terminate(); + } + } + + LOGGER.debug("close() - end"); + } + + @Override + public void start() { + LOGGER.debug("start() - start"); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + // Start showing the iDevice screen + jFrameMain.setTitle("" + iDevice); + + // Show window + jFrameMain.setVisible(true); + + jFrameMain.launchInjector(); + } + }); + LOGGER.debug("start() - end"); + } + + @SuppressWarnings("boxing") + @Override + protected boolean isNativeLook() { + LOGGER.debug("isNativeLook() - start"); + + boolean useNativeLook = environment.getProperty(Constants.APP_NATIVE_LOOK_PROPERTY, Boolean.class, + Constants.DEFAULT_APP_NATIVE_LOOK); + LOGGER.debug("isNativeLook() - end"); + return useNativeLook; + } + + private boolean hasFilledAdbPath() { + LOGGER.debug("hasFilledAdbPath() - start"); + + boolean hasAdbPath = environment.getProperty(Constants.ADB_PATH_PROPERTY) != null; + LOGGER.debug("hasFilledAdbPath() - end"); + return hasAdbPath; + } +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/app/Application.java b/src/main/java/com/github/xsavikx/androidscreencast/app/Application.java new file mode 100644 index 0000000..b82c8d9 --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/app/Application.java @@ -0,0 +1,12 @@ +package com.github.xsavikx.androidscreencast.app; + +public interface Application { + + void close(); + + void handleException(Thread thread, Throwable ex); + + void start(); + + void init(); +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/app/DeviceChooserApplication.java b/src/main/java/com/github/xsavikx/androidscreencast/app/DeviceChooserApplication.java new file mode 100644 index 0000000..6382ba3 --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/app/DeviceChooserApplication.java @@ -0,0 +1,96 @@ +package com.github.xsavikx.androidscreencast.app; + +import com.android.ddmlib.AndroidDebugBridge; +import com.android.ddmlib.IDevice; +import com.github.xsavikx.androidscreencast.constant.Constants; +import com.github.xsavikx.androidscreencast.ui.JDialogDeviceList; +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +@Component +public class DeviceChooserApplication extends SwingApplication { + private static final Logger LOGGER = Logger.getLogger(DeviceChooserApplication.class); + + @Autowired + private Environment env; + @Autowired + private AndroidDebugBridge bridge; + + private IDevice device; + + @Override + public void close() { + // ignore + } + + @Override + public void start() { + LOGGER.debug("start() - start"); + initialize(); + + LOGGER.debug("start() - end"); + } + + @SuppressWarnings("boxing") + @Override + protected boolean isNativeLook() { + LOGGER.debug("isNativeLook() - start"); + + boolean returnboolean = env.getProperty(Constants.APP_NATIVE_LOOK_PROPERTY, Boolean.class, + Constants.DEFAULT_APP_NATIVE_LOOK); + LOGGER.debug("isNativeLook() - end"); + return returnboolean; + } + + private void waitDeviceList(AndroidDebugBridge bridge) { + LOGGER.debug("waitDeviceList(AndroidDebugBridge bridge=" + bridge + ") - start"); + + int count = 0; + while (!bridge.hasInitialDeviceList()) { + try { + Thread.sleep(100); + count++; + } catch (InterruptedException e) { + LOGGER.warn("waitDeviceList(AndroidDebugBridge) - exception ignored", e); + + } + // let's not wait > 10 sec. + if (count > 300) { + throw new RuntimeException("Timeout getting device list!"); + } + } + + LOGGER.debug("waitDeviceList(AndroidDebugBridge bridge=" + bridge + ") - end"); + } + + private void initialize() { + LOGGER.debug("initialize() - start"); + + waitDeviceList(bridge); + + IDevice devices[] = bridge.getDevices(); + // Let the user choose the device + if (devices.length == 1) { + device = devices[0]; + } else { + JDialogDeviceList jd = new JDialogDeviceList(devices); + jd.setVisible(true); + + device = jd.getDevice(); + } + if (device == null) { + System.exit(0); + + LOGGER.debug("initialize() - end"); + return; + } + + LOGGER.debug("initialize() - end"); + } + + public IDevice getDevice() { + return device; + } +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/app/GUIApplication.java b/src/main/java/com/github/xsavikx/androidscreencast/app/GUIApplication.java new file mode 100644 index 0000000..5f22a4e --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/app/GUIApplication.java @@ -0,0 +1,27 @@ +package com.github.xsavikx.androidscreencast.app; + +import java.lang.Thread.UncaughtExceptionHandler; + +public abstract class GUIApplication implements Application { + + public GUIApplication() { + Runtime.getRuntime().addShutdownHook(new Thread() { + @Override + public void run() { + close(); + } + }); + Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() { + @Override + public void uncaughtException(Thread arg0, Throwable ex) { + try { + handleException(arg0, ex); + } catch (Exception ex2) { + // ignored + ex2.printStackTrace(); + } + } + }); + } + +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/app/SwingApplication.java b/src/main/java/com/github/xsavikx/androidscreencast/app/SwingApplication.java new file mode 100644 index 0000000..85dc733 --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/app/SwingApplication.java @@ -0,0 +1,47 @@ +package com.github.xsavikx.androidscreencast.app; + +import com.github.xsavikx.androidscreencast.ui.JDialogError; + +import javax.swing.*; +import java.io.PrintWriter; +import java.io.StringWriter; + +public abstract class SwingApplication extends GUIApplication { + private JDialogError jd = null; + + protected abstract boolean isNativeLook(); + + @Override + public void init() { + try { + if (isNativeLook()) + UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } + + @Override + public void handleException(Thread thread, Throwable ex) { + try { + StringWriter sw = new StringWriter(); + ex.printStackTrace(new PrintWriter(sw)); + if (sw.toString().contains("SynthTreeUI")) + return; + ex.printStackTrace(System.err); + if (jd != null && jd.isVisible()) + return; + jd = new JDialogError(ex); + SwingUtilities.invokeLater(new Runnable() { + + @Override + public void run() { + jd.setVisible(true); + } + }); + } catch (Exception ex2) { + // ignored + } + } + +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/constant/Constants.java b/src/main/java/com/github/xsavikx/androidscreencast/constant/Constants.java new file mode 100644 index 0000000..372da9d --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/constant/Constants.java @@ -0,0 +1,14 @@ +package com.github.xsavikx.androidscreencast.constant; + +import javax.annotation.Resource; + +@Resource +public final class Constants { + public static final String APP_NATIVE_LOOK_PROPERTY = "app.nativeLook"; + public static final String ADB_PATH_PROPERTY = "adb.path"; + public static final String DEFAULT_WINDOW_WIDTH = "default.window.width"; + public static final String DEFAULT_WINDOW_HEIGHT = "default.window.height"; + + public static final boolean DEFAULT_APP_NATIVE_LOOK = true; + public static final int DEFAULT_ADB_PORT = 2345; +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/spring/config/ApplicationConfiguration.java b/src/main/java/com/github/xsavikx/androidscreencast/spring/config/ApplicationConfiguration.java new file mode 100644 index 0000000..06fd945 --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/spring/config/ApplicationConfiguration.java @@ -0,0 +1,45 @@ +package com.github.xsavikx.androidscreencast.spring.config; + +import com.android.ddmlib.AndroidDebugBridge; +import com.android.ddmlib.IDevice; +import com.github.xsavikx.androidscreencast.app.DeviceChooserApplication; +import com.github.xsavikx.androidscreencast.constant.Constants; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; +import org.springframework.context.annotation.*; +import org.springframework.core.env.Environment; + +@Configuration +@ComponentScan(basePackages = "com.github.xsavikx.androidscreencast") +@PropertySources(value = { + @PropertySource(value = "file:${user.dir}/app.properties", ignoreResourceNotFound = true) +}) + +public class ApplicationConfiguration { + @Autowired + private Environment env; + + @Bean + public AndroidDebugBridge initAndroidDebugBridge() { + AndroidDebugBridge.initIfNeeded(false); + if (env.containsProperty(Constants.ADB_PATH_PROPERTY)) { + return AndroidDebugBridge.createBridge(env.getProperty(Constants.ADB_PATH_PROPERTY), false); + } + return AndroidDebugBridge.createBridge(); + } + + @Bean + public DefaultListableBeanFactory initBeanFactory() { + return new DefaultListableBeanFactory(); + } + + @Bean + @Autowired + public IDevice initDevice(DeviceChooserApplication application) { + application.init(); + application.start(); + application.close(); + return application.getDevice(); + } + +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/spring/config/ApplicationContextProvider.java b/src/main/java/com/github/xsavikx/androidscreencast/spring/config/ApplicationContextProvider.java new file mode 100644 index 0000000..a983374 --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/spring/config/ApplicationContextProvider.java @@ -0,0 +1,26 @@ +package com.github.xsavikx.androidscreencast.spring.config; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +public class ApplicationContextProvider implements ApplicationContextAware { + private static ApplicationContext applicationContext; + + private ApplicationContextProvider() { + // + } + + public static ApplicationContext getApplicationContext() { + if (applicationContext == null) + applicationContext = new AnnotationConfigApplicationContext(ApplicationConfiguration.class); + return applicationContext; + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + ApplicationContextProvider.applicationContext = applicationContext; + } + +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/ui/JDialogDeviceList.java b/src/main/java/com/github/xsavikx/androidscreencast/ui/JDialogDeviceList.java new file mode 100644 index 0000000..e1f3e28 --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/ui/JDialogDeviceList.java @@ -0,0 +1,94 @@ +package com.github.xsavikx.androidscreencast.ui; + +import com.android.ddmlib.IDevice; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; + +public class JDialogDeviceList extends JDialog implements ActionListener { + + private static final long serialVersionUID = -3719844308147203239L; + private static final String DEFAULT_HOST = "127.0.0.1"; + private static final int DEFAULT_PORT = 1324; + + private JTextField jtfHost = new JTextField(DEFAULT_HOST); + private JFormattedTextField jftfPort = new JFormattedTextField(DEFAULT_PORT); + private JList jlDevices = new JList(); + private JPanel jpAgent = new JPanel(); + private JPanel jpButtons = new JPanel(); + private JButton jbOk = new JButton("OK"); + private JButton jbQuit = new JButton("Quit"); + + private boolean cancelled = false; + private IDevice[] devices; + + public JDialogDeviceList(IDevice[] devices) { + super(); + setModal(true); + this.devices = devices; + initialize(); + } + + @Override + public void actionPerformed(ActionEvent arg0) { + cancelled = arg0.getSource() == jbQuit; + + setVisible(false); + } + + public IDevice getDevice() { + if (cancelled) + return null; + return jlDevices.getSelectedValue(); + } + + private void initialize() { + setTitle("Please select a device"); + jlDevices.setListData(devices); + jlDevices.setPreferredSize(new Dimension(400, 300)); + if (devices.length != 0) + jlDevices.setSelectedIndex(0); + jbOk.setEnabled(!jlDevices.isSelectionEmpty()); + + jpAgent.setBorder(BorderFactory.createTitledBorder("Agent")); + jpAgent.setLayout(new BorderLayout(10, 10)); + jpAgent.add(jtfHost, BorderLayout.CENTER); + jpAgent.add(jftfPort, BorderLayout.EAST); + + jpButtons.setLayout(new FlowLayout(FlowLayout.RIGHT)); + jpButtons.add(jbOk, BorderLayout.CENTER); + jpButtons.add(jbQuit, BorderLayout.SOUTH); + + JPanel jpBottom = new JPanel(); + jpBottom.setLayout(new BorderLayout()); + jpBottom.add(jpAgent, BorderLayout.CENTER); + jpBottom.add(jpButtons, BorderLayout.SOUTH); + + setLayout(new BorderLayout()); + add(jlDevices, BorderLayout.CENTER); + add(jpBottom, BorderLayout.SOUTH); + + pack(); + setLocationRelativeTo(null); + + jbOk.addActionListener(this); + jbQuit.addActionListener(this); + jlDevices.addMouseListener(new MouseAdapter() { + + @Override + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 2) { + int index = jlDevices.locationToIndex(e.getPoint()); + jlDevices.ensureIndexIsVisible(index); + cancelled = false; + setVisible(false); + } + } + + }); + } +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/ui/JDialogError.java b/src/main/java/com/github/xsavikx/androidscreencast/ui/JDialogError.java new file mode 100644 index 0000000..e73bdac --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/ui/JDialogError.java @@ -0,0 +1,26 @@ +package com.github.xsavikx.androidscreencast.ui; + +import javax.swing.*; +import java.awt.*; +import java.io.PrintWriter; +import java.io.StringWriter; + +public class JDialogError extends JDialog { + + private static final long serialVersionUID = -2562084286663149628L; + + public JDialogError(Throwable ex) { + getRootPane().setLayout(new BorderLayout()); + JTextArea l = new JTextArea(); + StringWriter w = new StringWriter(); + if (ex.getClass() == RuntimeException.class && ex.getCause() != null) + ex = ex.getCause(); + ex.printStackTrace(new PrintWriter(w)); + l.setText(w.toString()); + getRootPane().add(l, BorderLayout.CENTER); + pack(); + setLocationRelativeTo(null); + setAlwaysOnTop(true); + } + +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/ui/JDialogExecuteKeyEvent.java b/src/main/java/com/github/xsavikx/androidscreencast/ui/JDialogExecuteKeyEvent.java new file mode 100644 index 0000000..3f3191b --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/ui/JDialogExecuteKeyEvent.java @@ -0,0 +1,109 @@ +package com.github.xsavikx.androidscreencast.ui; + +import com.github.xsavikx.androidscreencast.api.command.executor.CommandExecutor; +import com.github.xsavikx.androidscreencast.api.command.factory.AdbInputCommandFactory; +import com.github.xsavikx.androidscreencast.api.injector.InputKeyEvent; +import com.github.xsavikx.androidscreencast.ui.model.InputKeyEventTable; +import com.github.xsavikx.androidscreencast.ui.model.InputKeyEventTableModel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.swing.*; +import javax.swing.border.TitledBorder; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +@Component +public class JDialogExecuteKeyEvent extends JDialog { + private static final long serialVersionUID = -4152020879675916776L; + private static final int HEIGHT = 600; + private static final int WIDTH = 800; + private static final int BUTTON_HEIGHT = 20; + private static final int BUTTON_WIDTH = WIDTH >> 1 - 5; + + private static final int TITLE_COLUMN_INDEX = 1; + + private static final String EXECUTE_BUTTON_TEXT = "Execute"; + private static final String USE_LONG_PRESS_BUTTON_TEXT = "Long press"; + private static final String CANCEL_BUTTON_TEXT = "Cancel"; + private static final String COMMAND_LIST_TITLE_TEXT = "Commands to execute"; + private static final String NO_COMMAND_CHOSEN_WARNING_MESSAGE = "Please, select command from the list"; + private static final String NO_COMMAND_CHOSEN_WARNING_DIALOG_TITLE = "Warning"; + + @Autowired + private CommandExecutor commandExecutor; + + /** + * Create the dialog. + */ + public JDialogExecuteKeyEvent() { + setResizable(false); + setTitle("Execute key event"); + setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); + final InputKeyEventTableModel commandList = new InputKeyEventTableModel(InputKeyEvent.values()); + final InputKeyEventTable commandListTable = new InputKeyEventTable(commandList); + final JCheckBoxMenuItem useLongPress = new JCheckBoxMenuItem(USE_LONG_PRESS_BUTTON_TEXT, false); + + JButton executeCommandButton = new JButton(EXECUTE_BUTTON_TEXT); + executeCommandButton.setSize(new Dimension(BUTTON_WIDTH, BUTTON_HEIGHT)); + executeCommandButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + int rowIndex = commandListTable.getSelectedRow(); + if (rowIndex > 0) { + final String title = (String) commandList.getValueAt(rowIndex, TITLE_COLUMN_INDEX); + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + commandExecutor.execute(AdbInputCommandFactory.getKeyCommand(InputKeyEvent.valueOf(title), + useLongPress.getState())); + } + }); + closeDialog(); + } else { + JOptionPane.showMessageDialog(null, NO_COMMAND_CHOSEN_WARNING_MESSAGE, NO_COMMAND_CHOSEN_WARNING_DIALOG_TITLE, + JOptionPane.WARNING_MESSAGE); + } + } + }); + JButton cancelButton = new JButton(CANCEL_BUTTON_TEXT); + cancelButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + closeDialog(); + } + }); + JScrollPane listScrollPane = new JScrollPane(commandListTable, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, + ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED); + listScrollPane.setPreferredSize(new Dimension(WIDTH, HEIGHT)); + listScrollPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(), + COMMAND_LIST_TITLE_TEXT, TitledBorder.CENTER, TitledBorder.TOP)); + JPanel buttonPane = new JPanel(); + buttonPane.add(executeCommandButton); + buttonPane.add(useLongPress); + buttonPane.add(cancelButton); + buttonPane.setLayout(new GridLayout(1, 2)); + JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, listScrollPane, buttonPane); + splitPane.setEnabled(false); + getContentPane().add(splitPane); + pack(); + setLocationRelativeTo(null); + } + + /** + * Launch the application. + */ + public static void main(String[] args) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + new JDialogExecuteKeyEvent().setVisible(true); + } + }); + } + + private void closeDialog() { + setVisible(false); + } +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/ui/JDialogUrl.java b/src/main/java/com/github/xsavikx/androidscreencast/ui/JDialogUrl.java new file mode 100644 index 0000000..f677f21 --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/ui/JDialogUrl.java @@ -0,0 +1,55 @@ +package com.github.xsavikx.androidscreencast.ui; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class JDialogUrl extends JDialog { + + private static final long serialVersionUID = -331017582679776599L; + private JTextField jtfUrl = new JTextField(); + private JButton jbOk = new JButton("Ok"); + private boolean result = false; + + public JDialogUrl() { + setModal(true); + setTitle("Open url"); + + setLayout(new BorderLayout()); + add(jbOk, BorderLayout.SOUTH); + add(jtfUrl, BorderLayout.CENTER); + jtfUrl.setColumns(50); + + jbOk.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent arg0) { + setResult(true); + JDialogUrl.this.setVisible(false); + } + }); + + jbOk.setDefaultCapable(true); + getRootPane().setDefaultButton(jbOk); + pack(); + setLocationRelativeTo(null); + + } + + public JTextField getJtfUrl() { + return jtfUrl; + } + + public void setJtfUrl(JTextField jtfUrl) { + this.jtfUrl = jtfUrl; + } + + public boolean isResult() { + return result; + } + + public void setResult(boolean result) { + this.result = result; + } +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/ui/JFrameMain.java b/src/main/java/com/github/xsavikx/androidscreencast/ui/JFrameMain.java new file mode 100644 index 0000000..cf935ef --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/ui/JFrameMain.java @@ -0,0 +1,205 @@ +package com.github.xsavikx.androidscreencast.ui; + +import com.github.xsavikx.androidscreencast.api.AndroidDevice; +import com.github.xsavikx.androidscreencast.api.injector.Injector; +import com.github.xsavikx.androidscreencast.api.injector.InputKeyEvent; +import com.github.xsavikx.androidscreencast.api.injector.ScreenCaptureThread.ScreenCaptureListener; +import com.github.xsavikx.androidscreencast.constant.Constants; +import com.github.xsavikx.androidscreencast.spring.config.ApplicationContextProvider; +import com.github.xsavikx.androidscreencast.ui.explorer.JFrameExplorer; +import com.github.xsavikx.androidscreencast.ui.interaction.KeyEventDispatcherFactory; +import com.github.xsavikx.androidscreencast.ui.interaction.KeyboardActionListenerFactory; +import com.github.xsavikx.androidscreencast.ui.interaction.MouseActionAdapterFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +import javax.swing.*; +import javax.swing.filechooser.FileNameExtensionFilter; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.image.BufferedImage; + +@Component +public class JFrameMain extends JFrame { + + private static final long serialVersionUID = -2085909236767692371L; + private JPanelScreen jp = new JPanelScreen(); + private JToolBar jtb = new JToolBar(); + private JToolBar jtbHardkeys = new JToolBar(); + // private JToggleButton jtbRecord = new JToggleButton("Record"); + + // private JButton jbOpenUrl = new JButton("Open Url"); + private JScrollPane jsp; + private JButton jbExplorer = new JButton("Explore"); + private JButton jbRestartClient = new JButton("Restart client"); + private JButton jbExecuteKeyEvent = new JButton("Execute keycode"); + + private JButton jbKbHome = new JButton("Home"); + private JButton jbKbMenu = new JButton("Menu"); + private JButton jbKbBack = new JButton("Back"); + private JButton jbKbSearch = new JButton("Search"); + + private JButton jbKbPhoneOn = new JButton("Call"); + + private JButton jbKbPhoneOff = new JButton("End call"); + private AndroidDevice androidDevice; + private Injector injector; + private Environment env; + private Dimension oldImageDimension; + + @Autowired + public JFrameMain(Environment env, Injector injector, AndroidDevice androidDevice) { + this.injector = injector; + this.env = env; + this.androidDevice = androidDevice; + initialize(); + KeyboardFocusManager.getCurrentKeyboardFocusManager() + .addKeyEventDispatcher(KeyEventDispatcherFactory.getKeyEventDispatcher(this)); + } + + private void setPrefferedWindowSize() { + if (env.containsProperty(Constants.DEFAULT_WINDOW_HEIGHT) && env.containsProperty(Constants.DEFAULT_WINDOW_WIDTH)) { + Integer height = env.getProperty(Constants.DEFAULT_WINDOW_HEIGHT, Integer.class); + Integer width = env.getProperty(Constants.DEFAULT_WINDOW_WIDTH, Integer.class); + if (height != null && width != null) + getContentPane().setPreferredSize(new Dimension(width, height)); + } + pack(); + } + + public void initialize() { + + jtb.setFocusable(false); + jbExplorer.setFocusable(false); + // jtbRecord.setFocusable(false); + // jbOpenUrl.setFocusable(false); + jbKbHome.setFocusable(false); + jbKbMenu.setFocusable(false); + jbKbBack.setFocusable(false); + jbKbSearch.setFocusable(false); + jbKbPhoneOn.setFocusable(false); + jbKbPhoneOff.setFocusable(false); + jbRestartClient.setFocusable(false); + jbExecuteKeyEvent.setFocusable(false); + + jbKbHome.addActionListener(KeyboardActionListenerFactory.getInstance(InputKeyEvent.KEYCODE_HOME)); + jbKbMenu.addActionListener(KeyboardActionListenerFactory.getInstance(InputKeyEvent.KEYCODE_MENU)); + jbKbBack.addActionListener(KeyboardActionListenerFactory.getInstance(InputKeyEvent.KEYCODE_BACK)); + jbKbSearch.addActionListener(KeyboardActionListenerFactory.getInstance(InputKeyEvent.KEYCODE_SEARCH)); + jbKbPhoneOn.addActionListener(KeyboardActionListenerFactory.getInstance(InputKeyEvent.KEYCODE_CALL)); + jbKbPhoneOff.addActionListener(KeyboardActionListenerFactory.getInstance(InputKeyEvent.KEYCODE_ENDCALL)); + + jtbHardkeys.add(jbKbHome); + jtbHardkeys.add(jbKbMenu); + jtbHardkeys.add(jbKbBack); + jtbHardkeys.add(jbKbSearch); + jtbHardkeys.add(jbKbPhoneOn); + jtbHardkeys.add(jbKbPhoneOff); + + // setIconImage(Toolkit.getDefaultToolkit().getImage( + // getClass().getResource("icon.png"))); + setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + setLayout(new BorderLayout()); + add(jtb, BorderLayout.NORTH); + add(jtbHardkeys, BorderLayout.SOUTH); + jsp = new JScrollPane(jp); + add(jsp, BorderLayout.CENTER); + jsp.setPreferredSize(new Dimension(100, 100)); + pack(); + setLocationRelativeTo(null); + setPrefferedWindowSize(); + MouseAdapter ma = MouseActionAdapterFactory.getInstance(jp, injector); + + jp.addMouseMotionListener(ma); + jp.addMouseListener(ma); + jp.addMouseWheelListener(ma); + + // jtbRecord.addActionListener(new ActionListener() { + // + // @Override + // public void actionPerformed(ActionEvent arg0) { + // if (jtbRecord.isSelected()) { + // startRecording(); + // } else { + // stopRecording(); + // } + // } + // + // }); + // jtb.add(jtbRecord); + + jbExplorer.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent arg0) { + JFrameExplorer jf = ApplicationContextProvider.getApplicationContext().getBean(JFrameExplorer.class); + jf.setIconImage(getIconImage()); + jf.launch(); + jf.setVisible(true); + } + }); + jtb.add(jbExplorer); + + jtb.add(jbRestartClient); + + jbExecuteKeyEvent.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + JDialogExecuteKeyEvent jdExecuteKeyEvent = ApplicationContextProvider.getApplicationContext() + .getBean(JDialogExecuteKeyEvent.class); + jdExecuteKeyEvent.setVisible(true); + } + }); + + jtb.add(jbExecuteKeyEvent); + + // jbOpenUrl.addActionListener(new ActionListener() { + // @Override + // public void actionPerformed(ActionEvent arg0) { + // JDialogUrl jdUrl = new JDialogUrl(); + // jdUrl.setVisible(true); + // if (!jdUrl.isResult()) + // return; + // String url = jdUrl.getJtfUrl().getText(); + // androidDevice.openUrl(url); + // } + // }); + // jtb.add(jbOpenUrl); + + } + + public void launchInjector() { + injector.screencapture.setListener(new ScreenCaptureListener() { + + @Override + public void handleNewImage(Dimension size, BufferedImage image, boolean landscape) { + if (oldImageDimension == null || !size.equals(oldImageDimension)) { + jsp.setPreferredSize(size); + JFrameMain.this.pack(); + oldImageDimension = size; + } + jp.handleNewImage(size, image); + } + }); + injector.start(); + } + + private void startRecording() { + JFileChooser jFileChooser = new JFileChooser(); + FileNameExtensionFilter filter = new FileNameExtensionFilter("Video file", "mov"); + jFileChooser.setFileFilter(filter); + int returnVal = jFileChooser.showSaveDialog(this); + if (returnVal == JFileChooser.APPROVE_OPTION) { + injector.screencapture.startRecording(jFileChooser.getSelectedFile()); + } + } + + private void stopRecording() { + injector.screencapture.stopRecording(); + } + +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/ui/JPanelScreen.java b/src/main/java/com/github/xsavikx/androidscreencast/ui/JPanelScreen.java new file mode 100644 index 0000000..a761196 --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/ui/JPanelScreen.java @@ -0,0 +1,49 @@ +package com.github.xsavikx.androidscreencast.ui; + +import javax.swing.*; +import java.awt.*; +import java.awt.image.BufferedImage; + +public class JPanelScreen extends JPanel { + + private static final long serialVersionUID = -2034873107028503004L; + private float coef = 1; + private double origX; + private double origY; + private Dimension size = null; + private BufferedImage image = null; + + public JPanelScreen() { + this.setFocusable(true); + } + + public Point getRawPoint(Point p1) { + Point p2 = new Point(); + p2.x = (int) ((p1.x - origX) / coef); + p2.y = (int) ((p1.y - origY) / coef); + return p2; + } + + public void handleNewImage(Dimension size, BufferedImage image) { + this.size = size; + this.image = image; + repaint(); + } + + @Override + protected void paintComponent(Graphics g) { + if (size == null) + return; + if (size.height == 0) + return; + Graphics2D g2 = (Graphics2D) g; + g2.clearRect(0, 0, getWidth(), getHeight()); + double width = Math.min(getWidth(), size.width * getHeight() / size.height); + coef = (float) width / size.width; + double height = width * size.height / size.width; + origX = (getWidth() - width) / 2; + origY = (getHeight() - height) / 2; + g2.drawImage(image, (int) origX, (int) origY, (int) width, (int) height, this); + } + +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/ui/JSplashScreen.java b/src/main/java/com/github/xsavikx/androidscreencast/ui/JSplashScreen.java new file mode 100644 index 0000000..29cb6f2 --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/ui/JSplashScreen.java @@ -0,0 +1,30 @@ +package com.github.xsavikx.androidscreencast.ui; + +import javax.swing.*; +import java.awt.*; + +public class JSplashScreen extends JWindow { + + private static final long serialVersionUID = -4537199368044671301L; + private JLabel label; + + public JSplashScreen(String text) { + label = new JLabel("Loading...", SwingConstants.CENTER); + initialize(); + setText(text); + } + + private void initialize() { + setLayout(new BorderLayout()); + label.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); + // createLineBorder(Color.BLACK)); + add(label, BorderLayout.CENTER); + } + + public void setText(String text) { + label.setText(text); + pack(); + setLocationRelativeTo(null); + } + +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/ui/MultiLineLabelUI.java b/src/main/java/com/github/xsavikx/androidscreencast/ui/MultiLineLabelUI.java new file mode 100644 index 0000000..75f064f --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/ui/MultiLineLabelUI.java @@ -0,0 +1,277 @@ +package com.github.xsavikx.androidscreencast.ui; + +import javax.swing.*; +import javax.swing.plaf.basic.BasicGraphicsUtils; +import javax.swing.plaf.basic.BasicLabelUI; +import java.awt.*; +import java.util.StringTokenizer; + +public class MultiLineLabelUI extends BasicLabelUI { + static final int LEADING = SwingConstants.LEADING; + static final int TRAILING = SwingConstants.TRAILING; + static final int LEFT = SwingConstants.LEFT; + static final int RIGHT = SwingConstants.RIGHT; + static final int TOP = SwingConstants.TOP; + static final int CENTER = SwingConstants.CENTER; + + static { + labelUI = new MultiLineLabelUI(); + } + + protected String str; + protected String[] strs; + + public static Dimension computeMultiLineDimension(FontMetrics fm, String[] strs) { + int i, c, width = 0; + for (i = 0, c = strs.length; i < c; i++) + width = Math.max(width, SwingUtilities.computeStringWidth(fm, strs[i])); + return new Dimension(width, fm.getHeight() * strs.length); + } + + /** + * Compute and return the location of the icons origin, the location of origin of the text baseline, and a possibly clipped version of the compound + * labels string. Locations are computed relative to the viewR rectangle. This layoutCompoundLabel() does not know how to handle LEADING/TRAILING + * values in horizontalTextPosition (they will default to RIGHT) and in horizontalAlignment (they will default to CENTER). Use the other version of + * layoutCompoundLabel() instead. + */ + public static String layoutCompoundLabel(FontMetrics fm, String[] text, Icon icon, int verticalAlignment, + int horizontalAlignment, int verticalTextPosition, int horizontalTextPosition, Rectangle viewR, Rectangle iconR, + Rectangle textR, int textIconGap) { + /* + * Initialize the icon bounds rectangle iconR. + */ + + if (icon != null) { + iconR.width = icon.getIconWidth(); + iconR.height = icon.getIconHeight(); + } else { + iconR.width = iconR.height = 0; + } + + /* + * Initialize the text bounds rectangle textR. If a null or and empty String was specified we substitute "" here and use 0,0,0,0 for textR. + */ + + // Fix for textIsEmpty sent by Paulo Santos + boolean textIsEmpty = (text == null) || (text.length == 0) + || (text.length == 1 && ((text[0] == null) || text[0].equals(""))); + + String rettext = ""; + if (textIsEmpty) { + textR.width = textR.height = 0; + } else { + Dimension dim = computeMultiLineDimension(fm, text); + textR.width = dim.width; + textR.height = dim.height; + } + + /* + * Unless both text and icon are non-null, we effectively ignore the value of textIconGap. The code that follows uses the value of gap instead of + * textIconGap. + */ + + int gap = (textIsEmpty || (icon == null)) ? 0 : textIconGap; + + if (!textIsEmpty) { + + /* + * If the label text string is too wide to fit within the available space "..." and as many characters as will fit will be displayed instead. + */ + + int availTextWidth; + + if (horizontalTextPosition == CENTER) { + availTextWidth = viewR.width; + } else { + availTextWidth = viewR.width - (iconR.width + gap); + } + + if (textR.width > availTextWidth && text.length == 1) { + String clipString = "..."; + int totalWidth = SwingUtilities.computeStringWidth(fm, clipString); + int nChars; + for (nChars = 0; nChars < text[0].length(); nChars++) { + totalWidth += fm.charWidth(text[0].charAt(nChars)); + if (totalWidth > availTextWidth) { + break; + } + } + rettext = text[0].substring(0, nChars) + clipString; + textR.width = SwingUtilities.computeStringWidth(fm, rettext); + } + } + + /* + * Compute textR.x,y given the verticalTextPosition and horizontalTextPosition properties + */ + + if (verticalTextPosition == TOP) { + if (horizontalTextPosition != CENTER) { + textR.y = 0; + } else { + textR.y = -(textR.height + gap); + } + } else if (verticalTextPosition == CENTER) { + textR.y = (iconR.height / 2) - (textR.height / 2); + } else { // (verticalTextPosition == BOTTOM) + if (horizontalTextPosition != CENTER) { + textR.y = iconR.height - textR.height; + } else { + textR.y = (iconR.height + gap); + } + } + + if (horizontalTextPosition == LEFT) { + textR.x = -(textR.width + gap); + } else if (horizontalTextPosition == CENTER) { + textR.x = (iconR.width / 2) - (textR.width / 2); + } else { // (horizontalTextPosition == RIGHT) + textR.x = (iconR.width + gap); + } + + /* + * labelR is the rectangle that contains iconR and textR. Move it to its proper position given the labelAlignment properties. + * + * To avoid actually allocating a Rectangle, Rectangle.union has been inlined below. + */ + int labelR_x = Math.min(iconR.x, textR.x); + int labelR_width = Math.max(iconR.x + iconR.width, textR.x + textR.width) - labelR_x; + int labelR_y = Math.min(iconR.y, textR.y); + int labelR_height = Math.max(iconR.y + iconR.height, textR.y + textR.height) - labelR_y; + + int dx, dy; + + if (verticalAlignment == TOP) { + dy = viewR.y - labelR_y; + } else if (verticalAlignment == CENTER) { + dy = (viewR.y + (viewR.height / 2)) - (labelR_y + (labelR_height / 2)); + } else { // (verticalAlignment == BOTTOM) + dy = (viewR.y + viewR.height) - (labelR_y + labelR_height); + } + + if (horizontalAlignment == LEFT) { + dx = viewR.x - labelR_x; + } else if (horizontalAlignment == RIGHT) { + dx = (viewR.x + viewR.width) - (labelR_x + labelR_width); + } else { // (horizontalAlignment == CENTER) + dx = (viewR.x + (viewR.width / 2)) - (labelR_x + (labelR_width / 2)); + } + + /* + * Translate textR and glypyR by dx,dy. + */ + + textR.x += dx; + textR.y += dy; + + iconR.x += dx; + iconR.y += dy; + + return rettext; + } + + /** + * Compute and return the location of the icons origin, the location of origin of the text baseline, and a possibly clipped version of the compound + * labels string. Locations are computed relative to the viewR rectangle. The JComponents orientation (LEADING/TRAILING) will also be taken into + * account and translated into LEFT/RIGHT values accordingly. + */ + public static String layoutCompoundLabel(JComponent c, FontMetrics fm, String[] text, Icon icon, + int verticalAlignment, int horizontalAlignment, int verticalTextPosition, int horizontalTextPosition, + Rectangle viewR, Rectangle iconR, Rectangle textR, int textIconGap) { + boolean orientationIsLeftToRight = true; + int hAlign = horizontalAlignment; + int hTextPos = horizontalTextPosition; + + if (c != null) { + if (!(c.getComponentOrientation().isLeftToRight())) { + orientationIsLeftToRight = false; + } + } + + // Translate LEADING/TRAILING values in horizontalAlignment + // to LEFT/RIGHT values depending on the components orientation + switch (horizontalAlignment) { + case LEADING: + hAlign = (orientationIsLeftToRight) ? LEFT : RIGHT; + break; + case TRAILING: + hAlign = (orientationIsLeftToRight) ? RIGHT : LEFT; + break; + } + + // Translate LEADING/TRAILING values in horizontalTextPosition + // to LEFT/RIGHT values depending on the components orientation + switch (horizontalTextPosition) { + case LEADING: + hTextPos = (orientationIsLeftToRight) ? LEFT : RIGHT; + break; + case TRAILING: + hTextPos = (orientationIsLeftToRight) ? RIGHT : LEFT; + break; + } + + return layoutCompoundLabel(fm, text, icon, verticalAlignment, hAlign, verticalTextPosition, hTextPos, viewR, iconR, + textR, textIconGap); + } + + protected void drawString(Graphics g, String s, int accChar, int textX, int textY) { + if (s.indexOf('\n') == -1) + BasicGraphicsUtils.drawString(g, s, accChar, textX, textY); + else { + String[] strs = splitStringByLines(s); + int height = g.getFontMetrics().getHeight(); + // Only the first line can have the accel char + BasicGraphicsUtils.drawString(g, strs[0], accChar, textX, textY); + for (int i = 1; i < strs.length; i++) + g.drawString(strs[i], textX, textY + (height * i)); + } + } + + @Override + protected String layoutCL(JLabel label, FontMetrics fontMetrics, String text, Icon icon, Rectangle viewR, + Rectangle iconR, Rectangle textR) { + String s = layoutCompoundLabel(label, fontMetrics, splitStringByLines(text), icon, label.getVerticalAlignment(), + label.getHorizontalAlignment(), label.getVerticalTextPosition(), label.getHorizontalTextPosition(), viewR, + iconR, textR, label.getIconTextGap()); + + if (s.equals("")) + return text; + return s; + } + + @Override + protected void paintDisabledText(JLabel l, Graphics g, String s, int textX, int textY) { + int accChar = l.getDisplayedMnemonic(); + g.setColor(l.getBackground()); + drawString(g, s, accChar, textX, textY); + } + + @Override + protected void paintEnabledText(JLabel l, Graphics g, String s, int textX, int textY) { + int accChar = l.getDisplayedMnemonic(); + g.setColor(l.getForeground()); + drawString(g, s, accChar, textX, textY); + } + + public String[] splitStringByLines(String str) { + if (str.equals(this.str)) + return strs; + + this.str = str; + + int lines = 1; + int i, c; + for (i = 0, c = str.length(); i < c; i++) { + if (str.charAt(i) == '\n') + lines++; + } + strs = new String[lines]; + StringTokenizer st = new StringTokenizer(str, "\n"); + + int line = 0; + while (st.hasMoreTokens()) + strs[line++] = st.nextToken(); + + return strs; + } +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/ui/explorer/JFrameExplorer.java b/src/main/java/com/github/xsavikx/androidscreencast/ui/explorer/JFrameExplorer.java new file mode 100644 index 0000000..399442f --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/ui/explorer/JFrameExplorer.java @@ -0,0 +1,140 @@ +package com.github.xsavikx.androidscreencast.ui.explorer; + +import com.github.xsavikx.androidscreencast.api.AndroidDevice; +import com.github.xsavikx.androidscreencast.api.file.FileInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.swing.*; +import javax.swing.event.TreeSelectionEvent; +import javax.swing.event.TreeSelectionListener; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.TreePath; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.io.File; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Vector; + +@Component +public class JFrameExplorer extends JFrame { + + private static final long serialVersionUID = -5209265873286028854L; + private JTree jt; + private JSplitPane jSplitPane; + @Autowired + private AndroidDevice androidDevice; + private JList jListFichiers; + private Map> cache = new LinkedHashMap<>(); + + public JFrameExplorer() { + + setTitle("Explorer"); + setLayout(new BorderLayout()); + + jt = new JTree(new DefaultMutableTreeNode("Test")); + } + + public void launch() { + + jt.setModel(new DefaultTreeModel(new FolderTreeNode("Device", "/"))); + jt.setRootVisible(true); + jt.addTreeSelectionListener(new TreeSelectionListener() { + + @Override + public void valueChanged(TreeSelectionEvent e) { + TreePath tp = e.getPath(); + if (tp == null) + return; + if (!(tp.getLastPathComponent() instanceof FolderTreeNode)) + return; + FolderTreeNode node = (FolderTreeNode) tp.getLastPathComponent(); + displayFolder(node.path); + } + }); + + JScrollPane jsp = new JScrollPane(jt); + + jListFichiers = new JList<>(); + jListFichiers.setListData(new Object[]{}); + + jSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, jsp, new JScrollPane(jListFichiers)); + + add(jSplitPane, BorderLayout.CENTER); + setSize(640, 480); + setLocationRelativeTo(null); + + jListFichiers.addMouseListener(new MouseAdapter() { + + @Override + public void mouseClicked(MouseEvent e) { + if (e.getClickCount() == 2) { + int index = jListFichiers.locationToIndex(e.getPoint()); + ListModel dlm = jListFichiers.getModel(); + FileInfo item = (FileInfo) dlm.getElementAt(index); + launchFile(item); + } + } + + }); + } + + private void displayFolder(String path) { + List fileInfos = cache.get(path); + if (fileInfos == null) + fileInfos = androidDevice.list(path); + + List files = new Vector<>(); + for (FileInfo fi2 : fileInfos) { + if (fi2.directory) + continue; + files.add(fi2); + } + jListFichiers.setListData(files.toArray()); + + } + + private void launchFile(FileInfo node) { + try { + File tempFile = node.downloadTemporary(); + Desktop.getDesktop().open(tempFile); + } catch (Exception ex) { + throw new RuntimeException(ex); + } + } + + private class FolderTreeNode extends LazyMutableTreeNode { + private static final long serialVersionUID = 9131974430354670263L; + String name; + String path; + + public FolderTreeNode(String name, String path) { + this.name = name; + this.path = path; + } + + @Override + public void initChildren() { + List fileInfos = cache.get(path); + if (fileInfos == null) + fileInfos = androidDevice.list(path); + for (FileInfo fi : fileInfos) { + if (fi.directory) + add(new FolderTreeNode(fi.name, path + fi.name + "/")); + // else + // add(new FileTreeNode(fi)); + } + } + + @Override + public String toString() { + return name; + } + + } + +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/ui/explorer/LazyLoadingTreeNode.java b/src/main/java/com/github/xsavikx/androidscreencast/ui/explorer/LazyLoadingTreeNode.java new file mode 100644 index 0000000..15f8754 --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/ui/explorer/LazyLoadingTreeNode.java @@ -0,0 +1,280 @@ +package com.github.xsavikx.androidscreencast.ui.explorer; + +import javax.swing.*; +import javax.swing.event.TreeExpansionEvent; +import javax.swing.event.TreeWillExpandListener; +import javax.swing.tree.DefaultMutableTreeNode; +import javax.swing.tree.DefaultTreeModel; +import javax.swing.tree.MutableTreeNode; +import javax.swing.tree.TreeModel; +import java.awt.event.ActionEvent; +import java.awt.event.KeyEvent; +import java.util.Vector; +import java.util.concurrent.ExecutionException; + +public abstract class LazyLoadingTreeNode extends DefaultMutableTreeNode implements TreeWillExpandListener { + + /** + * + */ + private static final long serialVersionUID = -4981073521761764327L; + private static final String ESCAPE_ACTION_NAME = "escape"; + private static final KeyStroke ESCAPE_KEY = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0); + /** + * The JTree containing this Node + */ + private JTree tree; + /** + * Can the worker be Canceled ? + */ + private boolean cancelable; + + /** + * Default Constructor + * + * @param userObject an Object provided by the user that constitutes the node's data + * @param tree the JTree containing this Node + * @param cancelable + */ + public LazyLoadingTreeNode(Object userObject, JTree tree, boolean cancelable) { + super(userObject); + tree.addTreeWillExpandListener(this); + this.tree = tree; + this.cancelable = cancelable; + setAllowsChildren(true); + } + + /** + * @return true if there are some childrens + */ + protected boolean areChildrenLoaded() { + return getChildCount() > 0 && getAllowsChildren(); + } + + /** + * @return a new Loading please wait node + */ + protected MutableTreeNode createLoadingNode() { + return new DefaultMutableTreeNode("Loading Please Wait ...", false); + } + + /** + * Create worker that will load the nodes + * + * @param tree the tree + * @return the newly created SwingWorker + */ + protected com.github.xsavikx.androidscreencast.ui.worker.SwingWorker createSwingWorker(final JTree tree) { + + com.github.xsavikx.androidscreencast.ui.worker.SwingWorker worker = new com.github.xsavikx.androidscreencast.ui.worker.SwingWorker() { + + @Override + protected MutableTreeNode[] doInBackground() { + return loadChildren(tree); + } + + @Override + protected void done() { + try { + if (!isCancelled()) { + MutableTreeNode[] nodes = get(); + setAllowsChildren(nodes.length > 0); + setChildren(nodes); + unRegisterSwingWorkerForCancel(tree, this); + } else { + reset(); + } + } catch (InterruptedException | ExecutionException e) { + e.printStackTrace(); + } + + } + + }; + registerSwingWorkerForCancel(tree, worker); + return worker; + } + + /** + * If the + * + * @return false, this node can't be a leaf + * @see #getAllowsChildren() + */ + @Override + public boolean isLeaf() { + return !getAllowsChildren(); + } + + /** + * This method will be executed in a background thread. If you have to do some GUI stuff use {@link SwingUtilities#invokeLater(Runnable)} + * + * @param tree the tree + * @return the Created nodes + */ + public abstract MutableTreeNode[] loadChildren(JTree tree); + + /** + * If the node is cancelable an escape Action is registered in the tree's InputMap and ActionMap that will cancel the execution + * + * @param tree the tree + * @param worker the worker to cancel + */ + protected void registerSwingWorkerForCancel(JTree tree, com.github.xsavikx.androidscreencast.ui.worker.SwingWorker worker) { + if (!cancelable) { + return; + } + tree.getInputMap().put(ESCAPE_KEY, ESCAPE_ACTION_NAME); + Action action = tree.getActionMap().get(ESCAPE_ACTION_NAME); + if (action == null) { + CancelWorkersAction cancelWorkerAction = new CancelWorkersAction(); + cancelWorkerAction.addSwingWorker(worker); + tree.getActionMap().put(ESCAPE_ACTION_NAME, cancelWorkerAction); + } else { + if (action instanceof CancelWorkersAction) { + CancelWorkersAction cancelAction = (CancelWorkersAction) action; + cancelAction.addSwingWorker(worker); + } + } + } + + /** + * Need some improvement ... This method should restore the Node initial state if the worker if canceled + */ + protected void reset() { + DefaultTreeModel defaultModel = (DefaultTreeModel) tree.getModel(); + int childCount = getChildCount(); + if (childCount > 0) { + for (int i = 0; i < childCount; i++) { + defaultModel.removeNodeFromParent((MutableTreeNode) getChildAt(0)); + } + } + setAllowsChildren(true); + } + + /** + * Define nodes children + * + * @param nodes new nodes + */ + protected void setChildren(MutableTreeNode... nodes) { + TreeModel model = tree.getModel(); + if (model instanceof DefaultTreeModel) { + DefaultTreeModel defaultModel = (DefaultTreeModel) model; + int childCount = getChildCount(); + if (childCount > 0) { + for (int i = 0; i < childCount; i++) { + defaultModel.removeNodeFromParent((MutableTreeNode) getChildAt(0)); + } + } + for (int i = 0; i < nodes.length; i++) { + defaultModel.insertNodeInto(nodes[i], this, i); + } + } + } + + /** + * set the loading state + */ + private void setLoading() { + setChildren(createLoadingNode()); + TreeModel model = tree.getModel(); + if (model instanceof DefaultTreeModel) { + DefaultTreeModel defaultModel = (DefaultTreeModel) model; + int[] indices = new int[getChildCount()]; + for (int i = 0; i < indices.length; i++) { + indices[i] = i; + } + defaultModel.nodesWereInserted(LazyLoadingTreeNode.this, indices); + } + } + + /** + * Default empty implementation, do nothing on collapse event. + */ + @Override + public void treeWillCollapse(TreeExpansionEvent event) { + // ignore + } + + /** + * Node will expand, it's time to retrieve nodes + */ + @Override + public void treeWillExpand(TreeExpansionEvent event) { + if (this.equals(event.getPath().getLastPathComponent())) { + if (areChildrenLoaded()) { + return; + } + setLoading(); + com.github.xsavikx.androidscreencast.ui.worker.SwingWorker worker = createSwingWorker(tree); + worker.execute(); + } + } + + /** + * Remove the swingWorker from the cancellable task of the tree + * + * @param tree + * @param worker + */ + protected void unRegisterSwingWorkerForCancel(JTree tree, com.github.xsavikx.androidscreencast.ui.worker.SwingWorker worker) { + if (!cancelable) { + return; + } + Action action = tree.getActionMap().get(ESCAPE_ACTION_NAME); + if (action != null && action instanceof CancelWorkersAction) { + CancelWorkersAction cancelWorkerAction = new CancelWorkersAction(); + cancelWorkerAction.removeSwingWorker(worker); + } + } + + /** + * ActionMap can only store one Action for the same key, This Action Stores the list of SwingWorker to be canceled if the escape key is pressed. + * + * @author Thierry LEFORT 3 mars 08 + */ + protected static class CancelWorkersAction extends AbstractAction { + /** + * + */ + private static final long serialVersionUID = 3173288834368915117L; + /** + * the SwingWorkers + */ + private Vector> workers = new Vector<>(); + + /** + * Default constructor + */ + private CancelWorkersAction() { + super(ESCAPE_ACTION_NAME); + } + + /** + * Do the Cancel + */ + @Override + public void actionPerformed(ActionEvent e) { + for (com.github.xsavikx.androidscreencast.ui.worker.SwingWorker worker : workers) { + worker.cancel(true); + } + + } + + /** + * Add a Cancelable SwingWorker + */ + public void addSwingWorker(com.github.xsavikx.androidscreencast.ui.worker.SwingWorker worker) { + workers.add(worker); + } + + /** + * Remove a SwingWorker + */ + public void removeSwingWorker(com.github.xsavikx.androidscreencast.ui.worker.SwingWorker worker) { + workers.remove(worker); + } + + } +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/ui/explorer/LazyMutableTreeNode.java b/src/main/java/com/github/xsavikx/androidscreencast/ui/explorer/LazyMutableTreeNode.java new file mode 100644 index 0000000..a71d396 --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/ui/explorer/LazyMutableTreeNode.java @@ -0,0 +1,44 @@ +package com.github.xsavikx.androidscreencast.ui.explorer; + +import javax.swing.tree.DefaultMutableTreeNode; + +public abstract class LazyMutableTreeNode extends DefaultMutableTreeNode { + + private static final long serialVersionUID = -6383034137965603498L; + protected boolean _loaded = false; + + public LazyMutableTreeNode() { + super(); + } + + public LazyMutableTreeNode(Object userObject) { + super(userObject); + } + + public LazyMutableTreeNode(Object userObject, boolean allowsChildren) { + super(userObject, allowsChildren); + } + + public void clear() { + removeAllChildren(); + _loaded = false; + } + + @Override + public int getChildCount() { + synchronized (this) { + if (!_loaded) { + _loaded = true; + initChildren(); + } + } + return super.getChildCount(); + } + + protected abstract void initChildren(); + + public boolean isLoaded() { + return _loaded; + } + +} \ No newline at end of file diff --git a/src/main/java/com/github/xsavikx/androidscreencast/ui/interaction/KeyEventDispatcherFactory.java b/src/main/java/com/github/xsavikx/androidscreencast/ui/interaction/KeyEventDispatcherFactory.java new file mode 100644 index 0000000..bb9d2e9 --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/ui/interaction/KeyEventDispatcherFactory.java @@ -0,0 +1,9 @@ +package com.github.xsavikx.androidscreencast.ui.interaction; + +import java.awt.*; + +public final class KeyEventDispatcherFactory { + public static KeyEventDispatcher getKeyEventDispatcher(Window frame) { + return new KeyEventDispatcherImpl(frame); + } +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/ui/interaction/KeyEventDispatcherImpl.java b/src/main/java/com/github/xsavikx/androidscreencast/ui/interaction/KeyEventDispatcherImpl.java new file mode 100644 index 0000000..8e3a6ea --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/ui/interaction/KeyEventDispatcherImpl.java @@ -0,0 +1,45 @@ +package com.github.xsavikx.androidscreencast.ui.interaction; + +import com.github.xsavikx.androidscreencast.api.command.executor.CommandExecutor; +import com.github.xsavikx.androidscreencast.api.command.factory.AdbInputCommandFactory; +import com.github.xsavikx.androidscreencast.api.injector.KeyCodeConverter; +import com.github.xsavikx.androidscreencast.spring.config.ApplicationContextProvider; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.KeyEvent; + +public class KeyEventDispatcherImpl implements KeyEventDispatcher { + private CommandExecutor commandExecutor; + private Window window; + + public KeyEventDispatcherImpl(Window frame) { + this.window = frame; + } + + @Override + public boolean dispatchKeyEvent(KeyEvent e) { + if (!window.isActive()) + return false; + if (e.getID() == KeyEvent.KEY_TYPED) { + final int code = KeyCodeConverter.getKeyCode(e); + SwingUtilities.invokeLater(new Runnable() { + + @Override + public void run() { + getCommandExecutor().execute(AdbInputCommandFactory.getKeyCommand(code)); + + } + }); + + } + return false; + } + + private CommandExecutor getCommandExecutor() { + if (commandExecutor == null) { + commandExecutor = ApplicationContextProvider.getApplicationContext().getBean(CommandExecutor.class); + } + return commandExecutor; + } +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/ui/interaction/KeyboardActionListener.java b/src/main/java/com/github/xsavikx/androidscreencast/ui/interaction/KeyboardActionListener.java new file mode 100644 index 0000000..403b808 --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/ui/interaction/KeyboardActionListener.java @@ -0,0 +1,37 @@ +package com.github.xsavikx.androidscreencast.ui.interaction; + +import com.github.xsavikx.androidscreencast.api.command.executor.CommandExecutor; +import com.github.xsavikx.androidscreencast.api.command.factory.AdbInputCommandFactory; +import com.github.xsavikx.androidscreencast.spring.config.ApplicationContextProvider; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class KeyboardActionListener implements ActionListener { + private CommandExecutor commandExecutor; + private int key; + + public KeyboardActionListener(int key) { + this.key = key; + } + + @Override + public void actionPerformed(ActionEvent e) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + getCommandExecutor().execute(AdbInputCommandFactory.getKeyCommand(key)); + } + }); + + } + + private CommandExecutor getCommandExecutor() { + if (commandExecutor == null) { + commandExecutor = ApplicationContextProvider.getApplicationContext().getBean(CommandExecutor.class); + } + return commandExecutor; + } + +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/ui/interaction/KeyboardActionListenerFactory.java b/src/main/java/com/github/xsavikx/androidscreencast/ui/interaction/KeyboardActionListenerFactory.java new file mode 100644 index 0000000..b1ea861 --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/ui/interaction/KeyboardActionListenerFactory.java @@ -0,0 +1,9 @@ +package com.github.xsavikx.androidscreencast.ui.interaction; + +import com.github.xsavikx.androidscreencast.api.injector.InputKeyEvent; + +public final class KeyboardActionListenerFactory { + public static KeyboardActionListener getInstance(InputKeyEvent inputKeyEvent) { + return new KeyboardActionListener(inputKeyEvent.getCode()); + } +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/ui/interaction/MouseActionAdapter.java b/src/main/java/com/github/xsavikx/androidscreencast/ui/interaction/MouseActionAdapter.java new file mode 100644 index 0000000..96e17b6 --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/ui/interaction/MouseActionAdapter.java @@ -0,0 +1,97 @@ +package com.github.xsavikx.androidscreencast.ui.interaction; + +import com.github.xsavikx.androidscreencast.api.command.executor.CommandExecutor; +import com.github.xsavikx.androidscreencast.api.command.factory.AdbInputCommandFactory; +import com.github.xsavikx.androidscreencast.api.injector.Injector; +import com.github.xsavikx.androidscreencast.spring.config.ApplicationContextProvider; +import com.github.xsavikx.androidscreencast.ui.JPanelScreen; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseWheelEvent; + +public class MouseActionAdapter extends MouseAdapter { + private final static long ONE_SECOND = 1000L; + private final JPanelScreen jp; + private CommandExecutor commandExecutor; + private Injector injector; + private int dragFromX = -1; + private int dragFromY = -1; + private long timeFromPress = -1; + + public MouseActionAdapter(JPanelScreen jPanelScreen) { + this.jp = jPanelScreen; + } + + public MouseActionAdapter(JPanelScreen jPanelScreen, Injector injector) { + this(jPanelScreen); + this.injector = injector; + } + + @Override + public void mouseClicked(MouseEvent e) { + if (injector != null && e.getButton() == MouseEvent.BUTTON3) { + injector.screencapture.toogleOrientation(); + e.consume(); + return; + } + final Point p2 = jp.getRawPoint(e.getPoint()); + if (p2.x > 0 && p2.y > 0) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + getCommandExecutor().execute(AdbInputCommandFactory.getTapCommand(p2.x, p2.y)); + + } + }); + } + } + + @Override + public void mouseDragged(MouseEvent e) { + if (dragFromX == -1 && dragFromY == -1) { + Point p2 = jp.getRawPoint(e.getPoint()); + dragFromX = p2.x; + dragFromY = p2.y; + timeFromPress = System.currentTimeMillis(); + } + } + + @Override + public void mouseReleased(MouseEvent e) { + if (timeFromPress >= ONE_SECOND) { + final Point p2 = jp.getRawPoint(e.getPoint()); + final int xFrom = dragFromX; + final int yFrom = dragFromY; + final int xTo = p2.x; + final int yTo = p2.y; + SwingUtilities.invokeLater(new Runnable() { + + @Override + public void run() { + getCommandExecutor().execute(AdbInputCommandFactory.getSwipeCommand(xFrom, yFrom, xTo, yTo, timeFromPress)); + } + }); + dragFromX = -1; + dragFromY = -1; + timeFromPress = -1; + } + } + + @Override + public void mouseWheelMoved(MouseWheelEvent arg0) { + // if (JFrameMain.this.injector == null) + // return; + // JFrameMain.this.injector.injectTrackball(arg0.getWheelRotation() < 0 ? + // -1f : 1f); + } + + private CommandExecutor getCommandExecutor() { + if (commandExecutor == null) { + commandExecutor = ApplicationContextProvider.getApplicationContext().getBean(CommandExecutor.class); + } + return commandExecutor; + } +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/ui/interaction/MouseActionAdapterFactory.java b/src/main/java/com/github/xsavikx/androidscreencast/ui/interaction/MouseActionAdapterFactory.java new file mode 100644 index 0000000..97c4aad --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/ui/interaction/MouseActionAdapterFactory.java @@ -0,0 +1,14 @@ +package com.github.xsavikx.androidscreencast.ui.interaction; + +import com.github.xsavikx.androidscreencast.api.injector.Injector; +import com.github.xsavikx.androidscreencast.ui.JPanelScreen; + +public final class MouseActionAdapterFactory { + public static MouseActionAdapter getInstance(JPanelScreen jPanelScreen) { + return new MouseActionAdapter(jPanelScreen); + } + + public static MouseActionAdapter getInstance(JPanelScreen jPanelScreen, Injector injector) { + return new MouseActionAdapter(jPanelScreen, injector); + } +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/ui/model/InputKeyEventTable.java b/src/main/java/com/github/xsavikx/androidscreencast/ui/model/InputKeyEventTable.java new file mode 100644 index 0000000..10cb824 --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/ui/model/InputKeyEventTable.java @@ -0,0 +1,43 @@ +package com.github.xsavikx.androidscreencast.ui.model; + +import javax.swing.*; +import javax.swing.table.TableCellRenderer; +import javax.swing.table.TableColumn; +import javax.swing.table.TableColumnModel; +import java.awt.*; + +public class InputKeyEventTable extends JTable { + private static final long serialVersionUID = 3978642864003531967L; + + private final static int MIN_COLUMN_WIDTH = 20; + + public InputKeyEventTable(InputKeyEventTableModel tableModel) { + super(tableModel); + setTableColumnsNames(tableModel.columnNames); + setAutoResizeMode(JTable.AUTO_RESIZE_OFF); + setTableColumnsPreferredSize(); + setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + } + + private void setTableColumnsNames(String[] columnNames) { + TableColumnModel columnModel = getColumnModel(); + for (int i = 0; i < columnNames.length; i++) { + TableColumn column = columnModel.getColumn(i); + column.setHeaderValue(columnNames[i]); + } + } + + private void setTableColumnsPreferredSize() { + final TableColumnModel columnModel = getColumnModel(); + for (int column = 0; column < getColumnCount(); column++) { + int width = MIN_COLUMN_WIDTH; // Min width + for (int row = 0; row < getRowCount(); row++) { + TableCellRenderer renderer = getCellRenderer(row, column); + Component comp = prepareRenderer(renderer, row, column); + width = Math.max(comp.getPreferredSize().width + 5, width); + } + columnModel.getColumn(column).setPreferredWidth(width); + } + } + +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/ui/model/InputKeyEventTableModel.java b/src/main/java/com/github/xsavikx/androidscreencast/ui/model/InputKeyEventTableModel.java new file mode 100644 index 0000000..6d0098a --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/ui/model/InputKeyEventTableModel.java @@ -0,0 +1,53 @@ +package com.github.xsavikx.androidscreencast.ui.model; + +import com.github.xsavikx.androidscreencast.api.injector.InputKeyEvent; + +import javax.swing.table.AbstractTableModel; +import java.util.ArrayList; +import java.util.List; + +public class InputKeyEventTableModel extends AbstractTableModel { + private static final long serialVersionUID = 1553313932570896541L; + private final static String INDEX_COLUMN_NAME = "#"; + private final static String TITLE_COLUMN_NAME = "title"; + private final static String DESCRIPTION_COLUMN_NAME = "description"; + public final String[] columnNames = { + INDEX_COLUMN_NAME, TITLE_COLUMN_NAME, DESCRIPTION_COLUMN_NAME + }; + private List> data = new ArrayList<>(); + private int rowCount = 0; + + public InputKeyEventTableModel(InputKeyEvent[] initialData) { + initData(initialData); + } + + private void initData(InputKeyEvent[] inputKeyEvents) { + for (InputKeyEvent e : inputKeyEvents) { + data.add(getDataRow(e)); + } + } + + private List getDataRow(InputKeyEvent e) { + List row = new ArrayList<>(); + row.add(rowCount++); + row.add(e.name()); + row.add(e.getDescription()); + return row; + } + + @Override + public int getRowCount() { + return data.size(); + } + + @Override + public int getColumnCount() { + return columnNames.length; + } + + @Override + public Object getValueAt(int rowIndex, int columnIndex) { + return data.get(rowIndex).get(columnIndex); + } + +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/ui/worker/AccumulativeRunnable.java b/src/main/java/com/github/xsavikx/androidscreencast/ui/worker/AccumulativeRunnable.java new file mode 100644 index 0000000..e4126db --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/ui/worker/AccumulativeRunnable.java @@ -0,0 +1,148 @@ +package com.github.xsavikx.androidscreencast.ui.worker; + +/* + * $Id: AccumulativeRunnable.java,v 1.3 2008/07/25 19:32:29 idk Exp $ + * + * Copyright @ 2005 Sun Microsystems, Inc. All rights + * reserved. Use is subject to license terms. + */ + +import javax.swing.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * An abstract class to be used in the cases where we need {@code Runnable} to perform some actions on an appendable set of data. The set of data + * might be appended after the {@code Runnable} is sent for the execution. Usually such {@code Runnables} are sent to the EDT. + *

+ *

+ * Usage example: + *

+ *

+ * Say we want to implement JLabel.setText(String text) which sends {@code text} string to the JLabel.setTextImpl(String text) on the EDT. In the + * event JLabel.setText is called rapidly many times off the EDT we will get many updates on the EDT but only the last one is important. (Every next + * updates overrides the previous one.) We might want to implement this {@code setText} in a way that only the last update is delivered. + *

+ * Here is how one can do this using {@code AccumulativeRunnable}: + *

+ *

+ * AccumulativeRunnable doSetTextImpl =
+ * new  AccumulativeRunnable() {
+ *     @Override
+ *     protected void run(List<String> args) {
+ *         //set to the last string being passed
+ *         setTextImpl(args.get(args.size() - 1);
+ *     }
+ * }
+ * void setText(String text) {
+ *     //add text and send for the execution if needed.
+ *     doSetTextImpl.add(text);
+ * }
+ * 
+ *

+ *

+ * Say we want want to implement addDirtyRegion(Rectangle rect) which sends this region to the handleDirtyRegions(List regions) on the EDT. + * addDirtyRegions better be accumulated before handling on the EDT. + *

+ *

+ * Here is how it can be implemented using AccumulativeRunnable: + *

+ *

+ * AccumulativeRunnable<Rectangle> doHandleDirtyRegions = new AccumulativeRunnable<Rectangle>() {
+ *   @Override
+ *   protected void run(List<Rectangle> args) {
+ *     handleDirtyRegions(args);
+ *   }
+ * };
+ *
+ * void addDirtyRegion(Rectangle rect) {
+ *   doHandleDirtyRegions.add(rect);
+ * }
+ * 
+ * + * @param the type this {@code Runnable} accumulates + * @author Igor Kushnirskiy + * @version $Revision: 1.3 $ $Date: 2008/07/25 19:32:29 $ + */ +abstract class AccumulativeRunnable implements Runnable { + private List arguments = null; + + /** + * prepends or appends arguments and sends this {@code Runnable} for the execution if needed. + *

+ * This implementation uses {@see #submit} to send this {@code Runnable} for execution. + * + * @param isPrepend prepend or append + * @param args the arguments to add + */ + public final synchronized void add(boolean isPrepend, T... args) { + boolean isSubmitted = true; + if (arguments == null) { + isSubmitted = false; + arguments = new ArrayList<>(); + } + if (isPrepend) { + arguments.addAll(0, Arrays.asList(args)); + } else { + Collections.addAll(arguments, args); + } + if (!isSubmitted) { + submit(); + } + } + + /** + * appends arguments and sends this {@code Runnable} for the execution if needed. + *

+ * This implementation uses {@see #submit} to send this {@code Runnable} for execution. + * + * @param args the arguments to accumulate + */ + public final void add(T... args) { + add(false, args); + } + + /** + * Returns accumulated arguments and flashes the arguments storage. + * + * @return accumulated arguments + */ + private synchronized List flush() { + List list = arguments; + arguments = null; + return list; + } + + /** + * {@inheritDoc} + *

+ *

+ * This implementation calls {@code run(List args)} method with the list of accumulated arguments. + */ + @Override + public final void run() { + run(flush()); + } + + /** + * Equivalent to {@code Runnable.run} method with the accumulated arguments to process. + * + * @param args accumulated arguments to process. + */ + protected abstract void run(List args); + + /** + * Sends this {@code Runnable} for the execution + *

+ *

+ * This method is to be executed only from {@code add} method. + *

+ *

+ * This implementation uses {@code SwingWorker.invokeLater}. + */ + protected void submit() { + SwingUtilities.invokeLater(this); + } +} diff --git a/src/main/java/com/github/xsavikx/androidscreencast/ui/worker/SwingWorker.java b/src/main/java/com/github/xsavikx/androidscreencast/ui/worker/SwingWorker.java new file mode 100644 index 0000000..736bca8 --- /dev/null +++ b/src/main/java/com/github/xsavikx/androidscreencast/ui/worker/SwingWorker.java @@ -0,0 +1,789 @@ +/* + * $Id: SwingWorker.java,v 1.6 2008/07/25 19:32:29 idk Exp $ + * + * Copyright @ 2005 Sun Microsystems, Inc. All rights + * reserved. Use is subject to license terms. + */ + +package com.github.xsavikx.androidscreencast.ui.worker; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; +import java.util.List; +import java.util.concurrent.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.ReentrantLock; + +/** + * An abstract class to perform lengthy GUI-interacting tasks in a dedicated thread. + *

+ *

+ * When writing a multi-threaded application using Swing, there are two constraints to keep in mind: (refer to + * How to Use Threads for more details): + *

    + *
  • Time-consuming tasks should not be run on the Event Dispatch Thread. Otherwise the application becomes unresponsive.
  • + *
  • Swing components should be accessed on the Event Dispatch Thread only.
  • + *
+ *

+ *

+ *

+ *

+ * These constraints mean that a GUI application with time intensive computing needs at least two threads: 1) a thread to perform the lengthy task and + * 2) the Event Dispatch Thread (EDT) for all GUI-related activities. This involves inter-thread communication which can be tricky to + * implement. + *

+ *

+ * {@code SwingWorker} is designed for situations where you need to have a long running task run in a background thread and provide updates to the UI + * either when done, or while processing. Subclasses of {@code SwingWorker} must implement the {@see #doInBackground} method to perform the background + * computation. + *

+ *

+ *

+ * Workflow + *

+ * There are three threads involved in the life cycle of a {@code SwingWorker} : + *

    + *
  • + *

    + * Current thread: The {@link #execute} method is called on this thread. It schedules {@code SwingWorker} for the execution on a worker + * thread and returns immediately. One can wait for the {@code SwingWorker} to complete using the {@link #get get} methods. + *

  • + *

    + * Worker thread: The {@link #doInBackground} method is called on this thread. This is where all background activities should happen. To notify + * {@code PropertyChangeListeners} about bound properties changes use the {@link #firePropertyChange firePropertyChange} and + * {@link #getPropertyChangeSupport} methods. By default there are two bound properties available: {@code state} and {@code progress}. + *

  • + *

    + * Event Dispatch Thread: All Swing related activities occur on this thread. {@code SwingWorker} invokes the {@link #process process} and + * {@link #done} methods and notifies any {@code PropertyChangeListeners} on this thread. + *

+ *

+ *

+ * Often, the Current thread is the Event Dispatch Thread. + *

+ *

+ *

+ * Before the {@code doInBackground} method is invoked on a worker thread, {@code SwingWorker} notifies any {@code PropertyChangeListeners} + * about the {@code state} property change to {@code StateValue.STARTED}. After the {@code doInBackground} method is finished the {@code done} method + * is executed. Then {@code SwingWorker} notifies any {@code PropertyChangeListeners} about the {@code state} property change to + * {@code StateValue.DONE}. + *

+ *

+ * {@code SwingWorker} is only designed to be executed once. Executing a {@code SwingWorker} more than once will not result in invoking the + * {@code doInBackground} method twice. + *

+ *

+ * Sample Usage + *

+ * The following example illustrates the simplest use case. Some processing is done in the background and when done you update a Swing component. + *

+ *

+ * Say we want to find the "Meaning of Life" and display the result in a {@code JLabel}. + *

+ *

+ *   final JLabel label;
+ *   class MeaningOfLifeFinder extends SwingWorker<String, Object> {
+ *       {@code @Override}
+ *       public String doInBackground() {
+ *           return findTheMeaningOfLife();
+ *       }
+ *
+ *       {@code @Override}
+ *       protected void done() {
+ *           try {
+ *               label.setText(get());
+ *           } catch (Exception ignore) {
+ *           }
+ *       }
+ *   }
+ *
+ *   (new MeaningOfLifeFinder()).execute();
+ * 
+ *

+ *

+ * The next example is useful in situations where you wish to process data as it is ready on the Event Dispatch Thread. + *

+ *

+ * Now we want to find the first N prime numbers and display the results in a {@code JTextArea}. While this is computing, we want to update our + * progress in a {@code JProgressBar}. Finally, we also want to print the prime numbers to {@code System.out}. + *

+ *

+ * class PrimeNumbersTask extends
+ *         SwingWorker<List<Integer>, Integer> {
+ *     PrimeNumbersTask(JTextArea textArea, int numbersToFind) {
+ *         //initialize
+ *     }
+ *
+ *     {@code @Override}
+ *     public List<Integer> doInBackground() {
+ *         while (! enough && ! isCancelled()) {
+ *                 number = nextPrimeNumber();
+ *                 publish(number);
+ *                 setProgress(100 * numbers.size() / numbersToFind);
+ *             }
+ *         }
+ *         return numbers;
+ *     }
+ *
+ *     {@code @Override}
+ *     protected void process(List<Integer> chunks) {
+ *         for (int number : chunks) {
+ *             textArea.append(number + "\n");
+ *         }
+ *     }
+ * }
+ *
+ * JTextArea textArea = new JTextArea();
+ * final JProgressBar progressBar = new JProgressBar(0, 100);
+ * PrimeNumbersTask task = new PrimeNumbersTask(textArea, N);
+ * task.addPropertyChangeListener(
+ *     new PropertyChangeListener() {
+ *         public  void propertyChange(PropertyChangeEvent evt) {
+ *             if ("progress".equals(evt.getPropertyName())) {
+ *                 progressBar.setValue((Integer)evt.getNewValue());
+ *             }
+ *         }
+ *     });
+ *
+ * task.execute();
+ * System.out.println(task.get()); //prints all prime numbers we have got
+ * 
+ *

+ *

+ * Because {@code SwingWorker} implements {@code Runnable}, a {@code SwingWorker} can be submitted to an {@link java.util.concurrent.Executor} for + * execution. + * + * @param the result type returned by this {@code SwingWorker's} {@code doInBackground} and {@code get} methods + * @param the type used for carrying out intermediate results by this {@code SwingWorker's} {@code publish} and {@code process} methods + * @author Igor Kushnirskiy + * @version $Revision: 1.6 $ $Date: 2008/07/25 19:32:29 $ + */ +public abstract class SwingWorker implements Future, Runnable { + /** + * number of worker threads. + */ + private static final int MAX_WORKER_THREADS = 10; + private static final AccumulativeRunnable doSubmit = new DoSubmitAccumulativeRunnable(); + private static ExecutorService executorService = null; + /** + * everything is run inside this FutureTask. Also it is used as a delegatee for the Future API. + */ + private final FutureTask future; + /** + * all propertyChangeSupport goes through this. + */ + private final PropertyChangeSupport propertyChangeSupport; + /** + * current progress. + */ + private volatile int progress; + + /** + * current state. + */ + private volatile StateValue state; + /** + * handler for {@code process} method. + */ + private AccumulativeRunnable doProcess; + /** + * handler for progress property change notifications. + */ + private AccumulativeRunnable doNotifyProgressChange; + + /** + * Constructs this {@code SwingWorker}. + */ + public SwingWorker() { + Callable callable = new Callable() { + @Override + public T call() throws Exception { + setState(StateValue.STARTED); + return doInBackground(); + } + }; + + future = new FutureTask(callable) { + @Override + protected void done() { + doneEDT(); + setState(StateValue.DONE); + } + }; + + state = StateValue.PENDING; + propertyChangeSupport = new SwingWorkerPropertyChangeSupport(this); + doProcess = null; + doNotifyProgressChange = null; + } + + /** + * returns workersExecutorService. + *

+ * returns the service stored in the appContext or creates it if necessary. If the last one it triggers autoShutdown thread to get started. + * + * @return ExecutorService for the {@code SwingWorkers} + */ + private static synchronized ExecutorService getWorkersExecutorService() { + if (executorService == null) { + // this creates non-daemon threads. + ThreadFactory threadFactory = new ThreadFactory() { + final AtomicInteger threadNumber = new AtomicInteger(1); + + @Override + public Thread newThread(final Runnable r) { + StringBuilder name = new StringBuilder("SwingWorker-pool-"); + name.append(System.identityHashCode(this)); + name.append("-thread-"); + name.append(threadNumber.getAndIncrement()); + + Thread t = new Thread(r, name.toString()); + if (t.isDaemon()) + t.setDaemon(false); + if (t.getPriority() != Thread.NORM_PRIORITY) + t.setPriority(Thread.NORM_PRIORITY); + return t; + } + }; + + /* + * We want a to have no more than MAX_WORKER_THREADS running threads. + * + * We want a worker thread to wait no longer than 1 second for new tasks before terminating. + */ + executorService = new ThreadPoolExecutor(0, MAX_WORKER_THREADS, 5L, TimeUnit.SECONDS, + new LinkedBlockingQueue(), threadFactory) { + + private final ReentrantLock pauseLock = new ReentrantLock(); + private final Condition unpaused = pauseLock.newCondition(); + private final ReentrantLock executeLock = new ReentrantLock(); + private boolean isPaused = false; + + @Override + protected void afterExecute(Runnable r, Throwable t) { + super.afterExecute(r, t); + pauseLock.lock(); + try { + while (isPaused) { + unpaused.await(); + } + } catch (InterruptedException ignore) { + + } finally { + pauseLock.unlock(); + } + } + + @Override + public void execute(Runnable command) { + /* + * ThreadPoolExecutor first tries to run task in a corePool. If all threads are busy it tries to add task to the waiting queue. If it fails + * it run task in maximumPool. + * + * We want corePool to be 0 and maximumPool to be MAX_WORKER_THREADS We need to change the order of the execution. First try corePool then + * try maximumPool pool and only then store to the waiting queue. We can not do that because we would need access to the private methods. + * + * Instead we enlarge corePool to MAX_WORKER_THREADS before the execution and shrink it back to 0 after. It does pretty much what we need. + * + * While we changing the corePoolSize we need to stop running worker threads from accepting new tasks. + */ + + // we need atomicity for the execute method. + executeLock.lock(); + try { + + pauseLock.lock(); + try { + isPaused = true; + } finally { + pauseLock.unlock(); + } + + setCorePoolSize(MAX_WORKER_THREADS); + super.execute(command); + setCorePoolSize(0); + + pauseLock.lock(); + try { + isPaused = false; + unpaused.signalAll(); + } finally { + pauseLock.unlock(); + } + } finally { + executeLock.unlock(); + } + } + }; + } + return executorService; + } + + /** + * Adds a {@code PropertyChangeListener} to the listener list. The listener is registered for all properties. The same listener object may be added + * more than once, and will be called as many times as it is added. If {@code listener} is {@code null}, no exception is thrown and no action is + * taken. + *

+ *

+ * Note: This is merely a convenience wrapper. All work is delegated to {@code PropertyChangeSupport} from {@link #getPropertyChangeSupport}. + * + * @param listener the {@code PropertyChangeListener} to be added + */ + public final void addPropertyChangeListener(PropertyChangeListener listener) { + getPropertyChangeSupport().addPropertyChangeListener(listener); + } + + /** + * {@inheritDoc} + */ + @Override + public final boolean cancel(boolean mayInterruptIfRunning) { + return future.cancel(mayInterruptIfRunning); + } + + /** + * Computes a result, or throws an exception if unable to do so. + *

+ *

+ * Note that this method is executed only once. + *

+ *

+ * Note: this method is executed in a background thread. + * + * @return the computed result + * @throws Exception if unable to compute a result + */ + protected abstract T doInBackground() throws Exception; + + // PropertyChangeSupports methods START + + /** + * Executed on the Event Dispatch Thread after the {@code doInBackground} method is finished. The default implementation does nothing. + * Subclasses may override this method to perform completion actions on the Event Dispatch Thread. Note that you can query status inside the + * implementation of this method to determine the result of this task or whether this task has been cancelled. + * + * @see #doInBackground + * @see #isCancelled() + * @see #get + */ + protected void done() { + } + + // Future methods START + + /** + * Invokes {@code done} on the EDT. + */ + private void doneEDT() { + Runnable doDone = new Runnable() { + @Override + public void run() { + done(); + } + }; + if (SwingUtilities.isEventDispatchThread()) { + doDone.run(); + } else { + doSubmit.add(doDone); + } + } + + /** + * Schedules this {@code SwingWorker} for execution on a worker thread. There are a number of worker threads available. In the event + * all worker threads are busy handling other {@code SwingWorkers} this {@code SwingWorker} is placed in a waiting queue. + *

+ *

+ * Note: {@code SwingWorker} is only designed to be executed once. Executing a {@code SwingWorker} more than once will not result in invoking the + * {@code doInBackground} method twice. + */ + public final void execute() { + getWorkersExecutorService().execute(this); + } + + /** + * Reports a bound property update to any registered listeners. No event is fired if {@code old} and {@code new} are equal and non-null. + *

+ *

+ * This {@code SwingWorker} will be the source for any generated events. + *

+ *

+ * When called off the Event Dispatch Thread {@code PropertyChangeListeners} are notified asynchronously on the Event Dispatch Thread. + *

+ * Note: This is merely a convenience wrapper. All work is delegated to {@code PropertyChangeSupport} from {@link #getPropertyChangeSupport}. + * + * @param propertyName the programmatic name of the property that was changed + * @param oldValue the old value of the property + * @param newValue the new value of the property + */ + public final void firePropertyChange(String propertyName, Object oldValue, Object newValue) { + getPropertyChangeSupport().firePropertyChange(propertyName, oldValue, newValue); + } + + /** + * {@inheritDoc} + *

+ * Note: calling {@code get} on the Event Dispatch Thread blocks all events, including repaints, from being processed until this + * {@code SwingWorker} is complete. + *

+ *

+ * When you want the {@code SwingWorker} to block on the Event Dispatch Thread we recommend that you use a modal dialog. + *

+ *

+ * For example: + *

+ *

+     * class SwingWorkerCompletionWaiter implements PropertyChangeListener {
+     *   private JDialog dialog;
+     *
+     *   public SwingWorkerCompletionWaiter(JDialog dialog) {
+     *     this.dialog = dialog;
+     *   }
+     *
+     *   public void propertyChange(PropertyChangeEvent event) {
+     *     if ("state".equals(event.getPropertyName()) && SwingWorker.StateValue.DONE == event.getNewValue()) {
+     *       dialog.setVisible(false);
+     *       dialog.dispose();
+     *     }
+     *   }
+     * }
+     * JDialog dialog = new JDialog(owner, true);
+     * swingWorker.addPropertyChangeListener(new SwingWorkerCompletionWaiter(dialog));
+     * swingWorker.execute();
+     * // the dialog will be visible until the SwingWorker is done
+     * dialog.setVisible(true);
+     * 
+ */ + @Override + public final T get() throws InterruptedException, ExecutionException { + return future.get(); + } + + /** + * {@inheritDoc} + *

+ * Please refer to {@link #get} for more details. + */ + @Override + public final T get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { + return future.get(timeout, unit); + } + + /** + * Returns the {@code progress} bound property. + * + * @return the progress bound property. + */ + public final int getProgress() { + return progress; + } + + /** + * Sets the {@code progress} bound property. The value should be from 0 to 100. + *

+ *

+ * Because {@code PropertyChangeListener}s are notified asynchronously on the Event Dispatch Thread multiple invocations to the + * {@code setProgress} method might occur before any {@code PropertyChangeListeners} are invoked. For performance purposes all these invocations are + * coalesced into one invocation with the last invocation argument only. + *

+ *

+ * For example, the following invocations: + *

+ *

+     * setProgress(1);
+     * setProgress(2);
+     * setProgress(3);
+     * 
+ *

+ * might result in a single {@code PropertyChangeListener} notification with the value {@code 3}. + * + * @param progress the progress value to set + * @throws IllegalArgumentException is value not from 0 to 100 + */ + protected final void setProgress(int progress) { + if (progress < 0 || progress > 100) { + throw new IllegalArgumentException("the value should be from 0 to 100"); + } + if (this.progress == progress) { + return; + } + int oldProgress = this.progress; + this.progress = progress; + if (!getPropertyChangeSupport().hasListeners("progress")) { + return; + } + synchronized (this) { + if (doNotifyProgressChange == null) { + doNotifyProgressChange = new AccumulativeRunnable() { + @Override + public void run(List args) { + firePropertyChange("progress", args.get(0), args.get(args.size() - 1)); + } + + @Override + protected void submit() { + doSubmit.add(this); + } + }; + } + } + doNotifyProgressChange.add(oldProgress, progress); + } + + /** + * Returns the {@code PropertyChangeSupport} for this {@code SwingWorker}. This method is used when flexible access to bound properties support is + * needed. + *

+ * This {@code SwingWorker} will be the source for any generated events. + *

+ *

+ * Note: The returned {@code PropertyChangeSupport} notifies any {@code PropertyChangeListener}s asynchronously on the Event Dispatch Thread + * in the event that {@code firePropertyChange} or {@code fireIndexedPropertyChange} are called off the Event Dispatch Thread. + * + * @return {@code PropertyChangeSupport} for this {@code SwingWorker} + */ + public final PropertyChangeSupport getPropertyChangeSupport() { + return propertyChangeSupport; + } + + /** + * Returns the {@code SwingWorker} state bound property. + * + * @return the current state + */ + public final StateValue getState() { + /* + * DONE is a special case to keep getState and isDone is sync + */ + if (isDone()) { + return StateValue.DONE; + } else { + return state; + } + } + + // Future methods END + + /** + * Sets this {@code SwingWorker} state bound property. + * + * @param the state state to set + */ + private void setState(StateValue state) { + StateValue old = this.state; + this.state = state; + firePropertyChange("state", old, state); + } + + /** + * {@inheritDoc} + */ + @Override + public final boolean isCancelled() { + return future.isCancelled(); + } + + /** + * {@inheritDoc} + */ + @Override + public final boolean isDone() { + return future.isDone(); + } + + /** + * Receives data chunks from the {@code publish} method asynchronously on the Event Dispatch Thread. + *

+ *

+ * Please refer to the {@link #publish} method for more details. + * + * @param chunks intermediate results to process + * @see #publish + */ + protected void process(List chunks) { + } + + // PropertyChangeSupports methods END + + /** + * Sends data chunks to the {@link #process} method. This method is to be used from inside the {@code doInBackground} method to deliver intermediate + * results for processing on the Event Dispatch Thread inside the {@code process} method. + *

+ *

+ * Because the {@code process} method is invoked asynchronously on the Event Dispatch Thread multiple invocations to the {@code publish} + * method might occur before the {@code process} method is executed. For performance purposes all these invocations are coalesced into one + * invocation with concatenated arguments. + *

+ *

+ * For example: + *

+ *

+     * publish("1");
+     * publish("2", "3");
+     * publish("4", "5", "6");
+     * 
+ *

+ * might result in: + *

+ *

+     * process("1", "2", "3", "4", "5", "6")
+     * 
+ *

+ *

+ * Sample Usage. This code snippet loads some tabular data and updates {@code DefaultTableModel} with it. Note that it safe to mutate the + * tableModel from inside the {@code process} method because it is invoked on the Event Dispatch Thread. + *

+ *

+     * class TableSwingWorker extends
+     *         SwingWorker<DefaultTableModel, Object[]> {
+     *     private final DefaultTableModel tableModel;
+     *
+     *     public TableSwingWorker(DefaultTableModel tableModel) {
+     *         this.tableModel = tableModel;
+     *     }
+     *
+     *     {@code @Override}
+     *     protected DefaultTableModel doInBackground() throws Exception {
+     *         for (Object[] row = loadData();
+     *                  ! isCancelled() && row != null;
+     *                  row = loadData()) {
+     *             publish((Object[]) row);
+     *         }
+     *         return tableModel;
+     *     }
+     *
+     *     {@code @Override}
+     *     protected void process(List<Object[]> chunks) {
+     *         for (Object[] row : chunks) {
+     *             tableModel.addRow(row);
+     *         }
+     *     }
+     * }
+     * 
+ * + * @param chunks intermediate results to process + * @see #process + */ + protected final void publish(V... chunks) { + synchronized (this) { + if (doProcess == null) { + doProcess = new AccumulativeRunnable() { + @Override + public void run(List args) { + process(args); + } + + @Override + protected void submit() { + doSubmit.add(this); + } + }; + } + } + doProcess.add(chunks); + } + + /** + * Removes a {@code PropertyChangeListener} from the listener list. This removes a {@code PropertyChangeListener} that was registered for all + * properties. If {@code listener} was added more than once to the same event source, it will be notified one less time after being removed. If + * {@code listener} is {@code null}, or was never added, no exception is thrown and no action is taken. + *

+ *

+ * Note: This is merely a convenience wrapper. All work is delegated to {@code PropertyChangeSupport} from {@link #getPropertyChangeSupport}. + * + * @param listener the {@code PropertyChangeListener} to be removed + */ + public final void removePropertyChangeListener(PropertyChangeListener listener) { + getPropertyChangeSupport().removePropertyChangeListener(listener); + } + + /** + * Sets this {@code Future} to the result of computation unless it has been cancelled. + */ + @Override + public final void run() { + future.run(); + } + + /** + * Values for the {@code state} bound property. + */ + public enum StateValue { + /** + * Initial {@code SwingWorker} state. + */ + PENDING, /** + * {@code SwingWorker} is {@code STARTED} before invoking {@code doInBackground}. + */ + STARTED, + + /** + * {@code SwingWorker} is {@code DONE} after {@code doInBackground} method is finished. + */ + DONE + } + + private static class DoSubmitAccumulativeRunnable extends AccumulativeRunnable implements ActionListener { + private final static int DELAY = 1000 / 30; + + @Override + public void actionPerformed(ActionEvent event) { + run(); + } + + @Override + protected void run(List args) { + int i = 0; + try { + for (Runnable runnable : args) { + i++; + runnable.run(); + } + } finally { + if (i < args.size()) { + /* + * there was an exception schedule all the unhandled items for the next time + */ + Runnable argsTail[] = new Runnable[args.size() - i]; + for (int j = 0; j < argsTail.length; j++) { + argsTail[j] = args.get(i + j); + } + add(true, argsTail); + } + } + } + + @Override + protected void submit() { + Timer timer = new Timer(DELAY, this); + timer.setRepeats(false); + timer.start(); + } + } + + private class SwingWorkerPropertyChangeSupport extends PropertyChangeSupport { + private static final long serialVersionUID = 2409754725172747617L; + + SwingWorkerPropertyChangeSupport(Object source) { + super(source); + } + + @Override + public void firePropertyChange(final PropertyChangeEvent evt) { + if (SwingUtilities.isEventDispatchThread()) { + super.firePropertyChange(evt); + } else { + doSubmit.add(new Runnable() { + @Override + public void run() { + SwingWorkerPropertyChangeSupport.this.firePropertyChange(evt); + } + }); + } + } + } +} diff --git a/src/log4j.properties b/src/main/resources/log4j.properties similarity index 89% rename from src/log4j.properties rename to src/main/resources/log4j.properties index e06459c..faaeae6 100644 --- a/src/log4j.properties +++ b/src/main/resources/log4j.properties @@ -1,6 +1,5 @@ # Root logger option log4j.rootLogger=TRACE, stdout, file - # Direct log messages to a log file log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.File=AndroidScreencast.log @@ -8,13 +7,11 @@ log4j.appender.file.MaxFileSize=1MB log4j.appender.file.MaxBackupIndex=1 log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%-5p] [%C{1}:%L] - %m%n - # Direct log messages to stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{HH:mm:ss} [%-5p] [%C{1}] - %m%n - # Set levels for appenders -log4j.appender.file.Threshold = DEBUG -log4j.appender.stdout.Threshold = DEBUG +log4j.appender.file.Threshold=DEBUG +log4j.appender.stdout.Threshold=DEBUG